diff --git a/gestion/config/trigger.py b/gestion/config/trigger.py index 4c54ade0..1763135a 100644 --- a/gestion/config/trigger.py +++ b/gestion/config/trigger.py @@ -11,6 +11,7 @@ master = "civet.adm.crans.org" # useradd : Envoie le mail de bienvenue, et crée le home # userdel : Détruit le home, déconnecte l'utilisateur sur zamok, détruit les indexes dovecot, désinscrit l'adresse crans des mailing listes associées services = { + 'civet' : ["event"], 'dhcp' : ["dhcp"], 'dyson' : ["autostatus"], 'isc' : ["dhcp"], diff --git a/gestion/trigger/hosts/civet.py b/gestion/trigger/hosts/civet.py index 736b2b7e..a2055f45 100644 --- a/gestion/trigger/hosts/civet.py +++ b/gestion/trigger/hosts/civet.py @@ -1,5 +1,5 @@ #!/bin/bash /usr/scripts/python.sh # -*- coding: utf-8 -*- -from gestion.trigger.civet import civet +from gestion.trigger.event import event from gestion.trigger.host import trigger diff --git a/gestion/trigger/hosts/dhcp.py b/gestion/trigger/hosts/dhcp.py index 09ea1a11..f601e380 100644 --- a/gestion/trigger/hosts/dhcp.py +++ b/gestion/trigger/hosts/dhcp.py @@ -1,5 +1,5 @@ #!/bin/bash /usr/scripts/python.sh # -*- coding: utf-8 -*- -from gestion.trigger.dhcp import dhcp +from gestion.trigger.dhcp from gestion.trigger.host import trigger diff --git a/gestion/trigger/readme b/gestion/trigger/readme index 36fc7c81..91441505 100644 --- a/gestion/trigger/readme +++ b/gestion/trigger/readme @@ -14,10 +14,7 @@ Trigger est le fruit d'une longue et intelligente (quelle modestie) réflexion, Ajouter un nouveau service ========================== - -Si c'est un service partagé par plusieurs hôtes, il vaut mieux créer tout ce qu'il faut dans trigger/nomduservice.py, écrire tout ce dont on a besoin, décorer la méthode (dont le nom est celui du service, donc si ça parle de dhcp, appeler la fonction dhcp, et mettre dhcp dans config/trigger.py) par un @record (penser à importer record depuis trigger/host.py). Une fois le service au point, importer les méthodes "recordées", et la méthode trigger depuis trigger/host.py. - -Si c'est un service simple utilisé que par un seul hôte, vous pouvez le mettre directement dans la description de l'hôte dans hosts/nomdelhôte.py. La nomenclature des noms de fonctions et de @record ne change pas. +Créer tout ce qu'il faut dans trigger/services/nomduservice.py, écrire tout ce dont on a besoin, décorer la méthode (dont le nom est celui du service, donc si ça parle de dhcp, appeler la fonction dhcp, et mettre dhcp dans config/trigger.py) par un @record (penser à importer record depuis trigger/host.py). Une fois le service au point, si vous avez mis à jour config/trigger.py, c'est bon. Pour chaque service, une "file d'attente" rabbitmq est créée ayant le nom trigger-nomdel'hôte-nomduservice, et une clef de routage du type trigger.nomduservice est mise en place pour que les messages envoyés vers trigger.nomduservice soient dispatchés sur l'ensemble des queues trigger-*-nomduservice. diff --git a/gestion/trigger/dhcp.py b/gestion/trigger/services/dhcp.py similarity index 87% rename from gestion/trigger/dhcp.py rename to gestion/trigger/services/dhcp.py index b469ab02..7b670609 100644 --- a/gestion/trigger/dhcp.py +++ b/gestion/trigger/services/dhcp.py @@ -8,7 +8,7 @@ # Licence : GPLv3 import lc_ldap.shortcuts -from gestion.trigger.host import TriggerFactory, record +from gestion.trigger.host import record from cranslib.conffile import ConfFile import cranslib.clogger as clogger import gestion.config.dhcp as dhcp_config @@ -19,8 +19,8 @@ import os import sys import gestion.iptools as iptools -from pypureomapi import pack_ip, pack_mac, OMAPI_OP_UPDATE -from pypureomapi import Omapi, OmapiMessage, OmapiError, OmapiErrorNotFound +from gestion.trigger.pypureomapi import pack_ip, pack_mac, OMAPI_OP_UPDATE +from gestion.trigger.pypureomapi import Omapi, OmapiMessage, OmapiError, OmapiErrorNotFound import struct logger = clogger.CLogger("trigger.dhcp", "debug") @@ -44,7 +44,7 @@ def add_dhcp_host(mac, ip, name=None): msg.obj.append((b"ip-address", pack_ip(ip))) if name: msg.obj.append((b"name", bytes(name))) - conn=Omapi(hostname, 9991, dhcp_omapi_keyname, dhcp_omapi_key) + conn = Omapi(hostname, 9991, dhcp_omapi_keyname, dhcp_omapi_key) response = conn.query_server(msg) conn.close() @@ -59,7 +59,7 @@ def delete_dhcp_host(self, mac, ip): msg.obj.append((b"hardware-address", pack_mac(mac))) msg.obj.append((b"hardware-type", struct.pack("!I", 1))) msg.obj.append((b"ip-address", pack_ip(ip))) - conn=Omapi(hostname, 9991, dhcp_omapi_keyname, dhcp_omapi_key) + conn = Omapi(hostname, 9991, dhcp_omapi_keyname, dhcp_omapi_key) response = conn.query_server(msg) if response.opcode == OMAPI_OP_UPDATE: response = conn.query_server(OmapiMessage.delete(response.handle)) @@ -93,11 +93,11 @@ def dhcp(body={}): """ if body and isinstance(body, dict): - for (mac, ip, name) in body.get("add", []): + for (mac, ip, name) in body.get("add", ()): add_dhcp_host(mac, ip, name) - for (mac, ip) in body.get("delete", []): + for (mac, ip) in body.get("delete", ()): delete_dhcp_host(mac, ip) - for (rmac, rip, mac, ip, name) in body.get("update", []): + for (rmac, rip, mac, ip, name) in body.get("update", ()): delete_dhcp_host(rmac, rip) add_dhcp_host(mac, ip, name) elif body == True: @@ -123,7 +123,11 @@ def dhcp(body={}): mac = str(machine['macAddress'][0]) nom = str(machine['host'][0]) if '' not in [ip, mac] and iptools.AddrInNet(ip, net): - d = { 'nom' : nom , 'host' : nom.split(".", 1)[0], 'mac' : mac , 'ip' : ip } + d = {'nom' : nom, + 'host' : nom.split(".", 1)[0], + 'mac' : mac, + 'ip' : ip, + } try: hosts[net] += host_template % d except: diff --git a/gestion/trigger/event.py b/gestion/trigger/services/event.py similarity index 88% rename from gestion/trigger/event.py rename to gestion/trigger/services/event.py index 8405d7d3..6c7f400e 100644 --- a/gestion/trigger/event.py +++ b/gestion/trigger/services/event.py @@ -10,6 +10,7 @@ import cmb import cPickle import gestion.config.trigger as trigger_config +from gestion.trigger.host import record import cranslib.clogger as clogger import pika @@ -48,3 +49,11 @@ class Event(cmb.BasicProducer): def announce(self, body): self.send_message("trigger.announce", body) + +@record +def event(body={}): + """Trigger event qui transcrit toute modif ldap en truc exploitable par + trigger. Warning, bootstrap incoming. + + """ + pass diff --git a/gestion/trigger/trigger.py b/gestion/trigger/trigger.py index b66386ff..3d8dd626 100755 --- a/gestion/trigger/trigger.py +++ b/gestion/trigger/trigger.py @@ -18,11 +18,14 @@ import socket import gestion.config.trigger as trigger_config import gestion.affichage as affichage import sys +from gestion.trigger.host import trigger hostname = socket.gethostname().split(".")[0] import importlib -triggerhost = importlib.import_module("gestion.trigger.hosts.%s" % (hostname,)) +services = {} +for config_service in trigger_config.services[hostname]: + services[config_service] = importlib.import_module("gestion.trigger.services.%s" % (config_service,)) logger = clogger.CLogger("trigger", "info") class EvenementListener(cmb.AsynchronousConsumer): @@ -45,13 +48,14 @@ class EvenementListener(cmb.AsynchronousConsumer): """ about = basic_deliver.routing_key.split(".")[1] - origin = properties.app_id - message_id = properties.message_id + # Peut-être utile plus tard + #origin = properties.app_id + #message_id = properties.message_id logger.info('Received message # %s from %s: %s', basic_deliver.delivery_tag, properties.app_id, body) body = cPickle.loads(body) try: - triggerhost.trigger(about)(body) + trigger(about)(body) except AttributeError: logger.warning('No suitable trigger found for message # %s from %s: %s on host %s. Discarding it.', basic_deliver.delivery_tag, properties.app_id, body, hostname) @@ -86,8 +90,8 @@ if __name__ == '__main__': parser.add_argument('-d', '--daemon', help="Écouter sur civet en arrière plan.", action="store_true") parser.add_argument('-h', '--help', help="Affiche ce message et quitte.", action="store_true") # For each service supposingly managed by host, generate one parser option - for service in trigger_config.services[hostname]: - parser.add_argument('--%s' % (service,), help="Force la régénération du service %s." % (service,), action="store_true") + for arg_service in trigger_config.services[hostname]: + parser.add_argument('--%s' % (arg_service,), help="Force la régénération du service %s." % (arg_service,), action="store_true") args = parser.parse_args() if args.help: @@ -95,18 +99,18 @@ if __name__ == '__main__': sys.exit(0) elif args.all: # Regenerates all services availables, don't crash on nonexistant ones - for service in trigger_config.services[hostname]: + for host_service in trigger_config.services[hostname]: try: - print affichage.style(" (Ré)Génération du service %s" % (service,), "cyan") - triggerhost.trigger(service)(True) + print affichage.style(" (Ré)Génération du service %s" % (host_service,), "cyan") + trigger(host_service)(True) except AttributeError: - print "No suitable trigger handle found for service %s on host %s" % (service, hostname) + print "No suitable trigger handle found for service %s on host %s" % (host_service, hostname) elif args.daemon: # Daemonize the trigger app, in order to listen and execute commands from civet. daemonize() else: # If not all and not daemon, try all services one by one. - for service in trigger_config.services[hostname]: - if getattr(args, service, False) == True: - print affichage.style(" (Ré)Génération du service %s" % (service,), "cyan") - triggerhost.trigger(service)(True) + for arg_service in trigger_config.services[hostname]: + if getattr(args, arg_service, False) == True: + print affichage.style(" (Ré)Génération du service %s" % (arg_service,), "cyan") + trigger(arg_service)(True)