Source code for ldaptor.generate_password

from twisted.internet import process, protocol, defer
from twisted.python import failure


[docs]class PwgenException(Exception): pass
[docs]class ReadPassword(protocol.ProcessProtocol): def __init__(self, deferred, count=1): self.deferred = deferred self.count = count self.stdout = "" self.stderr = ""
[docs] def outReceived(self, data): self.stdout = self.stdout + data
[docs] def errReceived(self, data): self.stderr = self.stderr + data
[docs] def processEnded(self, reason): if self.stderr: self.deferred.errback(failure.Failure(PwgenException(reason, self.stderr))) elif self.stdout: lines = [x for x in self.stdout.split("\n") if x] if len(lines) != self.count: self.deferred.errback( failure.Failure( PwgenException(reason, "Wrong number of lines received.") ) ) self.deferred.callback(lines) else: self.deferred.errback(failure.Failure(PwgenException(reason, "")))
[docs]def generate(reactor, n=1): assert n > 0 d = defer.Deferred() proto = ReadPassword(d, n) process.Process( reactor, "pwgen", ("pwgen", "-cn1", "-N", "%d" % n), {}, None, proto ) return d
if __name__ == "__main__": from twisted.internet import reactor import sys def say(passwords): for p in passwords: sys.stdout.write("%s\n" % p) return passwords def err(fail): fail.trap(PwgenException) sys.stderr.write("pwgen: %s\n" % fail.getErrorMessage()) # Could get more passwords in one fork, but this stresses it more # on purpose. l = [] for i in range(5): d = generate(reactor, 5) d.addCallbacks(say, err) l.append(d) dl = defer.DeferredList(l) dl.addBoth(lambda dummy: reactor.stop()) reactor.run()