Source code for ldaptor.numberalloc
"""Find an available uidNumber/gidNumber/other similar number."""
from __future__ import division
from ldaptor.protocols import pureldap
[docs]class freeNumberGuesser:
def __init__(self, makeAGuess, min=None, max=None):
self.makeAGuess=makeAGuess
self.min=min
if self.min is None:
self.min=0
self.max=max
[docs] def startGuessing(self):
d=self.makeAGuess(self.min)
d.addCallback(self._nextGuess, self.min)
return d
def _nextGuess(self, found, lastGuess):
if found:
self.min=lastGuess
else:
self.max=lastGuess
if self.max==self.min \
or self.max==self.min+1:
return self.max
max=self.max
if max is None:
max=self.min+1000
guess = (max + self.min) // 2
d=self.makeAGuess(guess)
d.addCallback(self._nextGuess, guess)
return d
[docs]class ldapGuesser:
def __init__(self, ldapObject, numberType):
self.numberType=numberType
self.ldapObject=ldapObject
[docs] def guess(self, num):
d=self.ldapObject.search(
filterObject=pureldap.LDAPFilter_equalityMatch(
attributeDesc=pureldap.LDAPAttributeDescription(value=self.numberType),
assertionValue=pureldap.LDAPAssertionValue(value=str(num))),
sizeLimit=1)
d.addCallback(lambda results: len(results))
return d
[docs]def getFreeNumber(ldapObject, numberType, min=None, max=None):
g=freeNumberGuesser(ldapGuesser(ldapObject, numberType).guess,
min=min, max=max)
return g.startGuessing()