From 5087b93dbd411ed2daa426a59f0a666f9a91762d Mon Sep 17 00:00:00 2001 From: glondu Date: Fri, 8 Sep 2006 00:00:34 +0200 Subject: [PATCH] On prend en compte la gnration concurrente de dn. Certes, c'est moche. a vite d'utiliser des locks. darcs-hash:20060907220034-68412-bc06d68a2abdaaa5e31690f9a67d2c334e303807.gz --- gestion/ldap_crans.py | 58 ++++++++++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 23 deletions(-) diff --git a/gestion/ldap_crans.py b/gestion/ldap_crans.py index 2aedf617..5d2294ba 100755 --- a/gestion/ldap_crans.py +++ b/gestion/ldap_crans.py @@ -16,6 +16,7 @@ import ldap, ldap.modlist, ldap_passwd import config, annuaires, iptools, chgpass, user_tests, cPickle, config_mail from chgpass import chgpass from affich_tools import coul, prompt +from syslog import * date_format = '%d/%m/%Y %H:%M' hostname = gethostname().split(".")[0] @@ -1124,30 +1125,41 @@ class BaseClasseCrans(CransLdap): if not self._init_data: ### Nouvel enregistrement - # 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 + # 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 ] - - # Ecriture - modlist = ldap.modlist.addModlist(self._data) - self.conn.add_s(self.dn, modlist) + 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 e: + # On logge + syslog("ldap_crans: exception: %s" % e) + if i == 4: + raise + else: ### Modification entrée if not self._modifiable: