diff options
Diffstat (limited to 'doc/core/howto/tutorial/listings/finger/finger14.tac')
-rwxr-xr-x | doc/core/howto/tutorial/listings/finger/finger14.tac | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/doc/core/howto/tutorial/listings/finger/finger14.tac b/doc/core/howto/tutorial/listings/finger/finger14.tac new file mode 100755 index 0000000..48e4ee0 --- /dev/null +++ b/doc/core/howto/tutorial/listings/finger/finger14.tac @@ -0,0 +1,56 @@ +# Read from file +from twisted.application import internet, service +from twisted.internet import protocol, reactor, defer +from twisted.protocols import basic + +class FingerProtocol(basic.LineReceiver): + def lineReceived(self, user): + d = self.factory.getUser(user) + + def onError(err): + return 'Internal error in server' + d.addErrback(onError) + + def writeResponse(message): + self.transport.write(message + '\r\n') + self.transport.loseConnection() + d.addCallback(writeResponse) + + +class FingerService(service.Service): + def __init__(self, filename): + self.users = {} + self.filename = filename + + def _read(self): + for line in file(self.filename): + user, status = line.split(':', 1) + user = user.strip() + status = status.strip() + self.users[user] = status + self.call = reactor.callLater(30, self._read) + + def startService(self): + self._read() + service.Service.startService(self) + + def stopService(self): + service.Service.stopService(self) + self.call.cancel() + + def getUser(self, user): + return defer.succeed(self.users.get(user, "No such user")) + + def getFingerFactory(self): + f = protocol.ServerFactory() + f.protocol = FingerProtocol + f.getUser = self.getUser + return f + + +application = service.Application('finger', uid=1, gid=1) +f = FingerService('/etc/users') +finger = internet.TCPServer(79, f.getFingerFactory()) + +finger.setServiceParent(service.IServiceCollection(application)) +f.setServiceParent(service.IServiceCollection(application)) |