summaryrefslogtreecommitdiff
path: root/doc/core/howto/tutorial/listings/finger/finger15.tac
diff options
context:
space:
mode:
Diffstat (limited to 'doc/core/howto/tutorial/listings/finger/finger15.tac')
-rwxr-xr-xdoc/core/howto/tutorial/listings/finger/finger15.tac87
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)