Source code for ldaptor.numberalloc
"""Find an available uidNumber/gidNumber/other similar number."""
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()