[ldap_crans] Forcage du schéma d'adressage des mid...

Reste à voir le cas particulier des adresses ip "custom".

darcs-hash:20100303165521-ffbb2-6b99cd460ee623f0b41c7c7c8c97e69ebe2d4114.gz
This commit is contained in:
Nicolas Dandrimont 2010-03-03 17:55:21 +01:00
parent f8677dbf22
commit 7249adbced

View file

@ -20,6 +20,7 @@ from email_tools import send_email
from syslog import openlog, closelog, syslog from syslog import openlog, closelog, syslog
from numeros_disponibles import lister_ip_dispo from numeros_disponibles import lister_ip_dispo
from unicodedata import normalize from unicodedata import normalize
import midtools
date_format = '%d/%m/%Y %H:%M' date_format = '%d/%m/%Y %H:%M'
hostname = gethostname().split(".")[0] hostname = gethostname().split(".")[0]
@ -1186,41 +1187,49 @@ class BaseClasseCrans(CransLdap):
if not self._init_data: if not self._init_data:
### Nouvel enregistrement ### Nouvel enregistrement
# L'enregistrement peut échouer en cas de choix de dn concurrents # Forcage de mid correspondant à l'ip.
# (il n'y a pas de lock sur les dn) if self.idn == 'mid':
for i in range(0, 5): # 5 tentatives my_mid = midtools.Mid(ipv4=self._data["ipHostNumber"][0])
# Génération du dn self.dn = '%s=%d,%s' % (self.idn, my_mid, self.dn)
res = self.conn.search_s(self.base_dn, 2, self.filtre_idn) self._data[self.idn] = [ '%d' % my_mid ]
vidn = 1 modlist = ldap.modlist.addModlist(self._data)
vidns = [] self.conn.add_s(self.dn, modlist)
# Liste des dn pris else:
for r in res: # L'enregistrement peut échouer en cas de choix de dn concurrents
# r = ( dn, {} ) # (il n'y a pas de lock sur les dn)
r = r[0].split(',')[0] for i in range(0, 5): # 5 tentatives
if r[:4] != '%s=' % self.idn: continue # Génération du dn
vidns.append(int(r[4:])) res = self.conn.search_s(self.base_dn, 2, self.filtre_idn)
if self.idn=='fid': vidn = 1
# Pour une facture on prend un nouveau numéro vidns = []
vidn = max([0]+vidns)+1 # Liste des dn pris
else: for r in res:
# Sinon on prend le premier libre # r = ( dn, {} )
while vidn in vidns: r = r[0].split(',')[0]
vidn += 1 if r[:4] != '%s=' % self.idn: continue
vidns.append(int(r[4:]))
if self.idn=='fid':
# Pour une facture on prend un nouveau numéro
vidn = max([0]+vidns)+1
else:
# Sinon on prend le premier libre
while vidn in vidns:
vidn += 1
self.dn = '%s=%s,%s' % (self.idn, vidn, self.dn) self.dn = '%s=%s,%s' % (self.idn, vidn, self.dn)
self._data[self.idn] = [ '%d' % vidn ] self._data[self.idn] = [ '%d' % vidn ]
try: try:
# Ecriture # Ecriture
modlist = ldap.modlist.addModlist(self._data) modlist = ldap.modlist.addModlist(self._data)
self.conn.add_s(self.dn, modlist) self.conn.add_s(self.dn, modlist)
break break
except Exception, e: except Exception, e:
# On logge # On logge
syslog("ldap_crans: exception: %s" % e) syslog("ldap_crans: exception: %s" % e)
raise
if i == 4:
raise raise
if i == 4:
raise
else: else:
### Modification entrée ### Modification entrée
@ -1233,6 +1242,18 @@ class BaseClasseCrans(CransLdap):
champ = c.args[0]['info'].split(':')[0] champ = c.args[0]['info'].split(':')[0]
raise RuntimeError(u'Entrée en double dans le champ %s' % champ) raise RuntimeError(u'Entrée en double dans le champ %s' % champ)
# l'ip change, le mid aussi...
if 'ipHostNumber' in self.modifs:
try:
mid = midtools.Mid(ipv4 = self._data["ipHostNumber"][0])
except ValueError:
pass
else:
self.conn.rename_s(self.dn, "%s=%d" % (self.idn, mid))
self.dn = "%s=%d,%s" % (self.idn, mid, self.dn.split(',', 1)[1])
self._data[self.idn] = [ '%d' % mid ]
### Génération de la liste de services à redémarrer ### Génération de la liste de services à redémarrer
# Quasiement tout est traité dans les classes filles. # Quasiement tout est traité dans les classes filles.
if hasattr(self, "_blacklist_restart"): if hasattr(self, "_blacklist_restart"):