= 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 [[https://gitlab.federez.net/federez/re2o/wikis/home|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: * [[/re2o-home|Génération des home]] sur {{{zbee}}} : [[https://gitlab.crans.org/nounous/re2o-home|git]] * Génération des lease DHCP : [[https://gitlab.crans.org/nounous/re2o-dhcp|git]] * Génération du firewall : [[https://gitlab.crans.org/nounous/re2o-firewall|git]] * [[/re2o-mail-server|Génération de la liste d'alias mail]] : [[https://gitlab.crans.org/nounous/re2o-mail-server|git]] * Génération des zones DNS : [[https://gitlab.crans.org/nounous/re2o-dns|git]] * [[/re2o-mail-reminder|Envoi de mail de fin d'adhésion]] : [[https://gitlab.crans.org/nounous/re2o-mail|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 [[https://re2o.crans.org/machines/index_service/|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: {{{ #!/usr/bin/env python3 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 }}} ---- CatégoriePagePublique