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