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()