[trigger] On tente un truc plus simple

This commit is contained in:
Pierre-Elliott Bécue 2014-06-12 19:26:50 +02:00
parent 9346d174e2
commit 50d067aee8
7 changed files with 44 additions and 29 deletions

View file

@ -11,6 +11,7 @@ master = "civet.adm.crans.org"
# useradd : Envoie le mail de bienvenue, et crée le home # 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 # 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 = { services = {
'civet' : ["event"],
'dhcp' : ["dhcp"], 'dhcp' : ["dhcp"],
'dyson' : ["autostatus"], 'dyson' : ["autostatus"],
'isc' : ["dhcp"], 'isc' : ["dhcp"],

View file

@ -1,5 +1,5 @@
#!/bin/bash /usr/scripts/python.sh #!/bin/bash /usr/scripts/python.sh
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from gestion.trigger.civet import civet from gestion.trigger.event import event
from gestion.trigger.host import trigger from gestion.trigger.host import trigger

View file

@ -1,5 +1,5 @@
#!/bin/bash /usr/scripts/python.sh #!/bin/bash /usr/scripts/python.sh
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from gestion.trigger.dhcp import dhcp from gestion.trigger.dhcp
from gestion.trigger.host import trigger from gestion.trigger.host import trigger

View file

@ -14,10 +14,7 @@ Trigger est le fruit d'une longue et intelligente (quelle modestie) réflexion,
Ajouter un nouveau service Ajouter un nouveau service
========================== ==========================
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.
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.
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. 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.

View file

@ -8,7 +8,7 @@
# Licence : GPLv3 # Licence : GPLv3
import lc_ldap.shortcuts import lc_ldap.shortcuts
from gestion.trigger.host import TriggerFactory, record from gestion.trigger.host import record
from cranslib.conffile import ConfFile from cranslib.conffile import ConfFile
import cranslib.clogger as clogger import cranslib.clogger as clogger
import gestion.config.dhcp as dhcp_config import gestion.config.dhcp as dhcp_config
@ -19,8 +19,8 @@ import os
import sys import sys
import gestion.iptools as iptools import gestion.iptools as iptools
from pypureomapi import pack_ip, pack_mac, OMAPI_OP_UPDATE from gestion.trigger.pypureomapi import pack_ip, pack_mac, OMAPI_OP_UPDATE
from pypureomapi import Omapi, OmapiMessage, OmapiError, OmapiErrorNotFound from gestion.trigger.pypureomapi import Omapi, OmapiMessage, OmapiError, OmapiErrorNotFound
import struct import struct
logger = clogger.CLogger("trigger.dhcp", "debug") logger = clogger.CLogger("trigger.dhcp", "debug")
@ -93,11 +93,11 @@ def dhcp(body={}):
""" """
if body and isinstance(body, dict): 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) 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) 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) delete_dhcp_host(rmac, rip)
add_dhcp_host(mac, ip, name) add_dhcp_host(mac, ip, name)
elif body == True: elif body == True:
@ -123,7 +123,11 @@ def dhcp(body={}):
mac = str(machine['macAddress'][0]) mac = str(machine['macAddress'][0])
nom = str(machine['host'][0]) nom = str(machine['host'][0])
if '<automatique>' not in [ip, mac] and iptools.AddrInNet(ip, net): if '<automatique>' 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: try:
hosts[net] += host_template % d hosts[net] += host_template % d
except: except:

View file

@ -10,6 +10,7 @@
import cmb import cmb
import cPickle import cPickle
import gestion.config.trigger as trigger_config import gestion.config.trigger as trigger_config
from gestion.trigger.host import record
import cranslib.clogger as clogger import cranslib.clogger as clogger
import pika import pika
@ -48,3 +49,11 @@ class Event(cmb.BasicProducer):
def announce(self, body): def announce(self, body):
self.send_message("trigger.announce", 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

View file

@ -18,11 +18,14 @@ import socket
import gestion.config.trigger as trigger_config import gestion.config.trigger as trigger_config
import gestion.affichage as affichage import gestion.affichage as affichage
import sys import sys
from gestion.trigger.host import trigger
hostname = socket.gethostname().split(".")[0] hostname = socket.gethostname().split(".")[0]
import importlib 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") logger = clogger.CLogger("trigger", "info")
class EvenementListener(cmb.AsynchronousConsumer): class EvenementListener(cmb.AsynchronousConsumer):
@ -45,13 +48,14 @@ class EvenementListener(cmb.AsynchronousConsumer):
""" """
about = basic_deliver.routing_key.split(".")[1] about = basic_deliver.routing_key.split(".")[1]
origin = properties.app_id # Peut-être utile plus tard
message_id = properties.message_id #origin = properties.app_id
#message_id = properties.message_id
logger.info('Received message # %s from %s: %s', logger.info('Received message # %s from %s: %s',
basic_deliver.delivery_tag, properties.app_id, body) basic_deliver.delivery_tag, properties.app_id, body)
body = cPickle.loads(body) body = cPickle.loads(body)
try: try:
triggerhost.trigger(about)(body) trigger(about)(body)
except AttributeError: except AttributeError:
logger.warning('No suitable trigger found for message # %s from %s: %s on host %s. Discarding it.', 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) 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('-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") 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 each service supposingly managed by host, generate one parser option
for service in trigger_config.services[hostname]: for arg_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") 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() args = parser.parse_args()
if args.help: if args.help:
@ -95,18 +99,18 @@ if __name__ == '__main__':
sys.exit(0) sys.exit(0)
elif args.all: elif args.all:
# Regenerates all services availables, don't crash on nonexistant ones # 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: try:
print affichage.style(" (Ré)Génération du service %s" % (service,), "cyan") print affichage.style(" (Ré)Génération du service %s" % (host_service,), "cyan")
triggerhost.trigger(service)(True) trigger(host_service)(True)
except AttributeError: 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: elif args.daemon:
# Daemonize the trigger app, in order to listen and execute commands from civet. # Daemonize the trigger app, in order to listen and execute commands from civet.
daemonize() daemonize()
else: else:
# If not all and not daemon, try all services one by one. # If not all and not daemon, try all services one by one.
for service in trigger_config.services[hostname]: for arg_service in trigger_config.services[hostname]:
if getattr(args, service, False) == True: if getattr(args, arg_service, False) == True:
print affichage.style(" (Ré)Génération du service %s" % (service,), "cyan") print affichage.style(" (Ré)Génération du service %s" % (arg_service,), "cyan")
triggerhost.trigger(service)(True) trigger(arg_service)(True)