Package ldaptor :: Module generate_password
[hide private]
[frames] | no frames]

Source Code for Module ldaptor.generate_password

 1  from twisted.internet import process, protocol, defer 
 2  from twisted.python import failure 
 3   
4 -class PwgenException(Exception):
5 pass
6
7 -class ReadPassword(protocol.ProcessProtocol):
8 - def __init__(self, deferred, count=1):
9 self.deferred=deferred 10 self.count=count 11 self.stdout='' 12 self.stderr=''
13
14 - def outReceived(self, data):
15 self.stdout=self.stdout+data
16
17 - def errReceived(self, data):
18 self.stderr=self.stderr+data
19
20 - def processEnded(self, reason):
21 if self.stderr: 22 self.deferred.errback(failure.Failure( 23 PwgenException(reason, self.stderr))) 24 elif self.stdout: 25 lines=[x for x in self.stdout.split('\n') if x] 26 if len(lines)!=self.count: 27 self.deferred.errback(failure.Failure( 28 PwgenException(reason, 'Wrong number of lines received.'))) 29 self.deferred.callback(lines) 30 else: 31 self.deferred.errback(failure.Failure(PwgenException(reason, '')))
32
33 -def generate(reactor, n=1):
34 assert n>0 35 d=defer.Deferred() 36 proto=ReadPassword(d, n) 37 process.Process(reactor, 'pwgen', ('pwgen', '-cn1', '-N', '%d'%n), {}, None, proto) 38 return d
39 40 if __name__=='__main__': 41 from twisted.internet import reactor 42 import sys
43 - def say(passwords):
44 for p in passwords: 45 sys.stdout.write('%s\n' % p) 46 return passwords
47
48 - def err(fail):
49 fail.trap(PwgenException) 50 sys.stderr.write('pwgen: %s\n' % fail.getErrorMessage())
51 52 # Could get more passwords in one fork, but this stresses it more 53 # on purpose. 54 l=[] 55 for i in range(5): 56 d=generate(reactor, 5) 57 d.addCallbacks(say, err) 58 l.append(d) 59 60 dl=defer.DeferredList(l) 61 dl.addBoth(lambda dummy: reactor.stop()) 62 reactor.run() 63