diff options
Diffstat (limited to 'doc/core/howto/tutorial/listings/finger/finger15.tac')
-rwxr-xr-x | doc/core/howto/tutorial/listings/finger/finger15.tac | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/doc/core/howto/tutorial/listings/finger/finger15.tac b/doc/core/howto/tutorial/listings/finger/finger15.tac new file mode 100755 index 0000000..cf90ddc --- /dev/null +++ b/doc/core/howto/tutorial/listings/finger/finger15.tac @@ -0,0 +1,87 @@ +# Read from file, announce on the web! +from twisted.application import internet, service +from twisted.internet import protocol, reactor, defer +from twisted.protocols import basic +from twisted.web import resource, server, static +import cgi + +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 FingerResource(resource.Resource): + + def __init__(self, users): + self.users = users + resource.Resource.__init__(self) + + # we treat the path as the username + def getChild(self, username, request): + """ + 'username' is a string. + 'request' is a 'twisted.web.server.Request'. + """ + messagevalue = self.users.get(username) + username = cgi.escape(username) + if messagevalue is not None: + messagevalue = cgi.escape(messagevalue) + text = '<h1>%s</h1><p>%s</p>' % (username,messagevalue) + else: + text = '<h1>%s</h1><p>No such user</p>' % username + return static.Data(text, 'text/html') + + +class FingerService(service.Service): + def __init__(self, filename): + self.filename = filename + self.users = {} + + def _read(self): + self.users.clear() + 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 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 + + def getResource(self): + r = FingerResource(self.users) + return r + + def startService(self): + self._read() + service.Service.startService(self) + + def stopService(self): + service.Service.stopService(self) + self.call.cancel() + + +application = service.Application('finger', uid=1, gid=1) +f = FingerService('/etc/users') +serviceCollection = service.IServiceCollection(application) +f.setServiceParent(serviceCollection) +internet.TCPServer(79, f.getFingerFactory() + ).setServiceParent(serviceCollection) +internet.TCPServer(8000, server.Site(f.getResource()) + ).setServiceParent(serviceCollection) |