diff --git a/gestion/ldap_crans.py b/gestion/ldap_crans.py index 59ead557..04ec50bf 100644 --- a/gestion/ldap_crans.py +++ b/gestion/ldap_crans.py @@ -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"):