Re2o-services
Description générale
On appelle re2o-services le système général qui permet de générer les fichiers statiques des différents services qui dépendent de la base de donnée. À la base, il y a une API cliente qui permet de communiquer avec le serveur re2o via l'API rest. Plus de détails sont sur le wiki federez re2o. Ensuite, pour chaque service, on a un dépot spécifique, qui sont clonés sur les serveurs pertinents dans /var/local/re2o-services/nom_du_service. Il y a:
Génération des home sur zbee : git
Génération des lease DHCP : git
Génération du firewall : git
Génération des zones DNS : git
- and more to come
On évolue un peu dans notre coin pour le moment, attention à être sur la branche crans, il faudra voir pour avoir une politique commune avec Federez, cf re2o.
Fonctionnement
On a un unique fichier config.ini installé et peuplé par bcfg2 sur /var/local/re2o-services/config.ini, puis on link le fichier dans le sous dossiers pertinents. Cf /var/lib/bcfg2/Bundler/re2o-services.xml. Un cron appelle les scripts de manière régulière, on peut set les timings dans /var/lib/bcfg2/Python/etc/cron.d/re2o-services, les dépots sont maj régulièrement par /var/lib/bcfg2/Python/etc/cron.d/pull-repo-re2o-services.
Les services sont régénérés que si il y a besoin, quand re2o leur dit. Si ils se régénèrent correctement, ils le signalent à re2o. On peut voir la gestion côté re2o des services ici.
Structure
On présentera ici la structure générale du fichier main.py d'un service. C'est le fichier central d'un service et celui lancé par le cron. Il possède les parties suivantes:
from configparser import ConfigParser from re2oapi import Re2oAPIClient config = ConfigParser() config.read('config.ini') api_hostname = config.get('Re2o', 'hostname') api_password = config.get('Re2o', 'password') api_username = config.get('Re2o', 'username') api_client = Re2oAPIClient(api_hostname,api_username,api_password)
Récupération de la config dans le fichier config.ini présent dans le dossier d'au dessus et accessible via un simlink.
for arg in sys.argv: if arg=="--force": plop(api_client)
Option permétant de forcer l'execution du service même si re2o ne le demande pas avec l'option --force
def plop(api_client): """Fonction plop qui fait quelque chose d'utile """
Ba la fonction présente dans le service pour qu'il fasse quelque chose.
for service in api_client.list("services/regen/"): if service['hostname'] == client_hostname and \ service['service_name'] == 'mail' and \ service['need_regen']: plop(api_client) api_client.patch(service['api_url'], data={'need_regen': False})
Enfin, la partie qui demande à re2o si le service doit être lancé via un appel à l'API. Ces appels sont la base des services car ils permettent de récuperer les infos nécéssaires pour que le service fonctionne. Ils suivent le fonctionement suivant:
from re2oapi import Re2oAPIClient # Sous dépot commun à tout les services config = ConfigParser() config.read('config.ini') api_hostname = config.get('Re2o', 'hostname') api_password = config.get('Re2o', 'password') api_username = config.get('Re2o', 'username') api_client = Re2oAPIClient(api_hostname,api_username,api_password) # Création de l'utilisateur de l'API infos = api_client.list("categorie/endpoint") # Appel et récupération des infos