[lc_ldap/_find_id] C'est bien aussi de ne pas oublier qu'il y a des id qui ne sont pas strictement croissant
This commit is contained in:
parent
9aa0de6539
commit
172c1935ce
1 changed files with 27 additions and 17 deletions
20
lc_ldap.py
20
lc_ldap.py
|
@ -391,7 +391,14 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object):
|
||||||
def _find_id(self, attr, realm=None):
|
def _find_id(self, attr, realm=None):
|
||||||
'''Trouve un id libre. Si une plage est fournie, cherche
|
'''Trouve un id libre. Si une plage est fournie, cherche
|
||||||
l'id dans celle-ci, sinon, prend le plus élevé possible.'''
|
l'id dans celle-ci, sinon, prend le plus élevé possible.'''
|
||||||
# On essaye de récupérer le dernier id si on l'a déjà vu passé
|
plage = None
|
||||||
|
# On récupère la plage des ids
|
||||||
|
if realm != None:
|
||||||
|
plage = itertools.chain(*[xrange(a,b+1) for (a,b) in config.rid_primaires[realm]])
|
||||||
|
|
||||||
|
# Si plage vaut None, on veux un id strictement croissant
|
||||||
|
if plage is None:
|
||||||
|
# On essaye de récupérer le dernier id si on l'a déjà vu passer
|
||||||
try:
|
try:
|
||||||
last_id = open('/tmp/lc_ldap_lastid_%s_%s' % (attr, os.getuid())).read().strip()
|
last_id = open('/tmp/lc_ldap_lastid_%s_%s' % (attr, os.getuid())).read().strip()
|
||||||
except IOError:
|
except IOError:
|
||||||
|
@ -401,23 +408,26 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object):
|
||||||
# Si jamais id n'a pas de methode ORDERING, on récupère une liste vide et on fallback en récupérant tous les id (c'est lent)
|
# Si jamais id n'a pas de methode ORDERING, on récupère une liste vide et on fallback en récupérant tous les id (c'est lent)
|
||||||
if res == []:
|
if res == []:
|
||||||
res = self.search_s(variables.base_dn, ldap.SCOPE_SUBTREE, '%s=*' % attr, attrlist = [attr])
|
res = self.search_s(variables.base_dn, ldap.SCOPE_SUBTREE, '%s=*' % attr, attrlist = [attr])
|
||||||
|
else:
|
||||||
|
# On récupère tous les id
|
||||||
|
res = self.search_s(variables.base_dn, ldap.SCOPE_SUBTREE, '%s=*' % attr, attrlist = [attr])
|
||||||
|
|
||||||
# On extrait seulement les valeurs des id qui nous intêressent
|
# On extrait seulement les valeurs des id qui nous intêressent
|
||||||
nonfree = [ int(r[1].get(attr)[0]) for r in res if r[1].get(attr) ]
|
nonfree = [ int(r[1].get(attr)[0]) for r in res if r[1].get(attr) ]
|
||||||
# On trie pour récupérer le dernier
|
# On trie pour récupérer le dernier
|
||||||
nonfree.sort()
|
nonfree.sort()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
last_id = nonfree[-1]
|
last_id = nonfree[-1]
|
||||||
except IndexError:
|
except IndexError:
|
||||||
last_id = 0
|
last_id = 0
|
||||||
|
|
||||||
|
if plage is None:
|
||||||
# On écrit le nouveau dernier id connu
|
# On écrit le nouveau dernier id connu
|
||||||
f=os.open('/tmp/lc_ldap_lastid_%s_%s' % (attr, os.getuid()), os.O_WRONLY | os.O_CREAT, 0600)
|
f=os.open('/tmp/lc_ldap_lastid_%s_%s' % (attr, os.getuid()), os.O_WRONLY | os.O_CREAT, 0600)
|
||||||
os.write(f, str(last_id))
|
os.write(f, str(last_id))
|
||||||
os.close(f)
|
os.close(f)
|
||||||
|
|
||||||
plage = None
|
|
||||||
# On récupère la plage des mids
|
|
||||||
if realm != None:
|
|
||||||
plage = itertools.chain(*[xrange(a,b+1) for (a,b) in config.rid_primaires[realm]])
|
|
||||||
|
|
||||||
if plage != None:
|
if plage != None:
|
||||||
for i in plage:
|
for i in plage:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue