[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:
parent
f8677dbf22
commit
7249adbced
1 changed files with 53 additions and 32 deletions
|
@ -20,6 +20,7 @@ from email_tools import send_email
|
|||
from syslog import openlog, closelog, syslog
|
||||
from numeros_disponibles import lister_ip_dispo
|
||||
from unicodedata import normalize
|
||||
import midtools
|
||||
|
||||
date_format = '%d/%m/%Y %H:%M'
|
||||
hostname = gethostname().split(".")[0]
|
||||
|
@ -1186,41 +1187,49 @@ class BaseClasseCrans(CransLdap):
|
|||
|
||||
if not self._init_data:
|
||||
### Nouvel enregistrement
|
||||
# L'enregistrement peut échouer en cas de choix de dn concurrents
|
||||
# (il n'y a pas de lock sur les dn)
|
||||
for i in range(0, 5): # 5 tentatives
|
||||
# Génération du dn
|
||||
res = self.conn.search_s(self.base_dn, 2, self.filtre_idn)
|
||||
vidn = 1
|
||||
vidns = []
|
||||
# Liste des dn pris
|
||||
for r in res:
|
||||
# r = ( dn, {} )
|
||||
r = r[0].split(',')[0]
|
||||
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
|
||||
# Forcage de mid correspondant à l'ip.
|
||||
if self.idn == 'mid':
|
||||
my_mid = midtools.Mid(ipv4=self._data["ipHostNumber"][0])
|
||||
self.dn = '%s=%d,%s' % (self.idn, my_mid, self.dn)
|
||||
self._data[self.idn] = [ '%d' % my_mid ]
|
||||
modlist = ldap.modlist.addModlist(self._data)
|
||||
self.conn.add_s(self.dn, modlist)
|
||||
else:
|
||||
# L'enregistrement peut échouer en cas de choix de dn concurrents
|
||||
# (il n'y a pas de lock sur les dn)
|
||||
for i in range(0, 5): # 5 tentatives
|
||||
# Génération du dn
|
||||
res = self.conn.search_s(self.base_dn, 2, self.filtre_idn)
|
||||
vidn = 1
|
||||
vidns = []
|
||||
# Liste des dn pris
|
||||
for r in res:
|
||||
# r = ( dn, {} )
|
||||
r = r[0].split(',')[0]
|
||||
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._data[self.idn] = [ '%d' % vidn ]
|
||||
self.dn = '%s=%s,%s' % (self.idn, vidn, self.dn)
|
||||
self._data[self.idn] = [ '%d' % vidn ]
|
||||
|
||||
try:
|
||||
# Ecriture
|
||||
modlist = ldap.modlist.addModlist(self._data)
|
||||
self.conn.add_s(self.dn, modlist)
|
||||
break
|
||||
except Exception, e:
|
||||
# On logge
|
||||
syslog("ldap_crans: exception: %s" % e)
|
||||
raise
|
||||
if i == 4:
|
||||
try:
|
||||
# Ecriture
|
||||
modlist = ldap.modlist.addModlist(self._data)
|
||||
self.conn.add_s(self.dn, modlist)
|
||||
break
|
||||
except Exception, e:
|
||||
# On logge
|
||||
syslog("ldap_crans: exception: %s" % e)
|
||||
raise
|
||||
if i == 4:
|
||||
raise
|
||||
|
||||
else:
|
||||
### Modification entrée
|
||||
|
@ -1233,6 +1242,18 @@ class BaseClasseCrans(CransLdap):
|
|||
champ = c.args[0]['info'].split(':')[0]
|
||||
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
|
||||
# Quasiement tout est traité dans les classes filles.
|
||||
if hasattr(self, "_blacklist_restart"):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue