[trigger] On tente un truc plus simple
This commit is contained in:
parent
9346d174e2
commit
50d067aee8
7 changed files with 44 additions and 29 deletions
|
@ -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"],
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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 '<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:
|
||||
hosts[net] += host_template % d
|
||||
except:
|
|
@ -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
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue