[trigger] MetaService en place, et amélioration du débug

This commit is contained in:
Pierre-Elliott Bécue 2014-07-14 03:10:42 +02:00
parent d29343392b
commit a52ef72a54
8 changed files with 202 additions and 146 deletions

View file

@ -8,7 +8,7 @@
# Licence : GPLv3
import lc_ldap.shortcuts
from gestion.trigger.host import record
import gestion.config.trigger as trigger_config
from gestion.trigger.services.service import BasicService
from cranslib.conffile import ConfFile
import cranslib.clogger as clogger
@ -23,82 +23,25 @@ from gestion.trigger.pypureomapi import pack_ip, pack_mac, OMAPI_OP_UPDATE
from gestion.trigger.pypureomapi import Omapi, OmapiMessage
import struct
logger = clogger.CLogger("trigger.dhcp", "debug")
logger = clogger.CLogger("trigger", "dhcp", "debug", trigger_config.debug)
hostname = socket.gethostname().split(".")[0] + ".adm.crans.org"
dhcp_omapi_keyname = secrets_new.get("dhcp_omapi_keyname")
dhcp_omapi_key = secrets_new.get("dhcp_omapi_keys")[hostname]
ldap_conn = lc_ldap.shortcuts.lc_ldap_readonly()
def add_dhcp_host(mac, ip, name=None):
"""Adds a dhcp host using omapi
"""
if '<automatique>' in [ip, mac]:
return
msg = OmapiMessage.open(b"host")
msg.message.append((b"create", struct.pack("!I", 1)))
msg.message.append((b"exclusive", struct.pack("!I", 1)))
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)))
if name:
msg.obj.append((b"name", bytes(name)))
conn = Omapi(hostname, 9991, dhcp_omapi_keyname, dhcp_omapi_key)
response = conn.query_server(msg)
conn.close()
def delete_dhcp_host(mac, ip):
"""Deletes dhcp host using omapi
"""
if '<automatique>' in [ip, mac]:
return
msg = OmapiMessage.open(b"host")
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)
response = conn.query_server(msg)
if response.opcode == OMAPI_OP_UPDATE:
response = conn.query_server(OmapiMessage.delete(response.handle))
conn.close()
def lease_clean():
"""Clean the lease file
"""
# TODO : use ConfigFile structure
leasefile = open(dhcp_config.dhcplease)
newleasefile = open(dhcp_config.dhcplease + '.new', 'w')
config = ""
line = leasefile.readline()
write = True
while line:
if line.strip().startswith('host'):
write = False
if write:
newleasefile.write(line)
if not write and line.strip().endswith('}'):
write = True
line = leasefile.readline()
leasefile.close()
newleasefile.close()
os.rename(dhcp_config.dhcplease+'.new', dhcp_config.dhcplease)
@record
class dhcp(BasicService):
class Dhcp(BasicService):
"""Class responsible of dhcp service.
"""
# Class lookup table to define which changes call which function.
changes_trigger = {
lc_ldap.attributs.macAddress.ldap_name: (dhcp.send_mac_ip,),
lc_ldap.attributs.ipHostNumber.ldap_name: (dhcp.send_mac_ip,),
lc_ldap.attributs.macAddress.ldap_name: ('send_mac_ip',),
lc_ldap.attributs.ipHostNumber.ldap_name: ('send_mac_ip',),
}
dhcp_omapi_keyname = None
dhcp_omapi_key = None #secrets_new.get("dhcp_omapi_keys")[hostname]
@classmethod
def send_mac_ip(cls, body, diff):
"""Computes mac_ip data to send from body and diff
@ -111,14 +54,14 @@ class dhcp(BasicService):
# Régénération du DHCP :
if not macs[0]:
# Création d'une nouvelle machine.
dhcp = {'add': [(macs[1], ips[1], hostnames[1])]}
dhcp_dict = {'add': [(macs[1], ips[1], hostnames[1])]}
elif not macs[1]:
# Destruction d'une machine.
dhcp = {'delete': [(macs[0], ips[0])]}
dhcp_dict = {'delete': [(macs[0], ips[0])]}
else:
# Mise à jour.
dhcp = {'update': [(macs[0], ips[0], macs[1], ips[1], hostnames[1])]}
return ("dhcp", dhcp)
dhcp_dict = {'update': [(macs[0], ips[0], macs[1], ips[1], hostnames[1])]}
return ("dhcp", dhcp_dict)
@classmethod
def regen(cls, body=None):
@ -132,12 +75,12 @@ class dhcp(BasicService):
if body and isinstance(body, dict):
for (mac, ip, name) in body.get("add", []):
add_dhcp_host(mac, ip, name)
cls.add_dhcp_host(mac, ip, name)
for (mac, ip) in body.get("delete", []):
delete_dhcp_host(mac, ip)
cls.delete_dhcp_host(mac, ip)
for (rmac, rip, mac, ip, name) in body.get("update", []):
delete_dhcp_host(rmac, rip)
add_dhcp_host(mac, ip, name)
cls.delete_dhcp_host(rmac, rip)
cls.add_dhcp_host(mac, ip, name)
elif body == True:
hosts = {}
host_template = """
@ -186,9 +129,85 @@ class dhcp(BasicService):
step = "Nettoyage des fichiers de leases"
affichage.prettyDoin(step, "...")
try:
lease_clean()
cls.lease_clean()
affichage.prettyDoin(step, "Ok")
except:
affichage.prettyDoin(step, "Erreur")
print "During lease clean, an error occured."
raise
@classmethod
def check_secrets(cls):
"""This method allows lazy evaluation for dhcp_omapi_keyname
and dhcp_omapi_key, since event imports all services. This is actually
the best lazy eval we can hope, since property won't work on
classmethods.
"""
if cls.dhcp_omapi_keyname is None:
cls.dhcp_omapi_keyname = secrets_new.get("dhcp_omapi_keyname")
if cls.dhcp_omapi_key is None:
cls.dhcp_omapi_key = secrets_new.get("dhcp_omapi_keys")[hostname]
@classmethod
def add_dhcp_host(cls, mac, ip, name=None):
"""Adds a dhcp host using omapi
"""
cls.check_secrets()
if '<automatique>' in [ip, mac]:
return
msg = OmapiMessage.open(b"host")
msg.message.append((b"create", struct.pack("!I", 1)))
msg.message.append((b"exclusive", struct.pack("!I", 1)))
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)))
if name:
msg.obj.append((b"name", bytes(name)))
conn = Omapi(hostname, 9991, cls.dhcp_omapi_keyname, cls.dhcp_omapi_key)
_ = conn.query_server(msg)
conn.close()
@classmethod
def delete_dhcp_host(cls, mac, ip):
"""Deletes dhcp host using omapi
"""
cls.check_secrets()
if '<automatique>' in [ip, mac]:
return
msg = OmapiMessage.open(b"host")
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, cls.dhcp_omapi_keyname, cls.dhcp_omapi_key)
response = conn.query_server(msg)
if response.opcode == OMAPI_OP_UPDATE:
_ = conn.query_server(OmapiMessage.delete(response.handle))
conn.close()
@staticmethod
def lease_clean():
"""Clean the lease file
"""
# TODO : use ConfigFile structure
leasefile = open(dhcp_config.dhcplease)
newleasefile = open(dhcp_config.dhcplease + '.new', 'w')
line = leasefile.readline()
write = True
while line:
if line.strip().startswith('host'):
write = False
if write:
newleasefile.write(line)
if not write and line.strip().endswith('}'):
write = True
line = leasefile.readline()
leasefile.close()
newleasefile.close()
os.rename(dhcp_config.dhcplease+'.new', dhcp_config.dhcplease)