2 from twisted.application import internet, service
3 from twisted.internet import protocol, reactor, defer
4 from twisted.protocols import basic
6 class FingerProtocol(basic.LineReceiver):
7 def lineReceived(self, user):
8 d = self.factory.getUser(user)
11 return 'Internal error in server'
14 def writeResponse(message):
15 self.transport.write(message + '\r\n')
16 self.transport.loseConnection()
17 d.addCallback(writeResponse)
20 class FingerService(service.Service):
21 def __init__(self, filename):
23 self.filename = filename
26 for line in file(self.filename):
27 user, status = line.split(':', 1)
29 status = status.strip()
30 self.users[user] = status
31 self.call = reactor.callLater(30, self._read)
33 def startService(self):
35 service.Service.startService(self)
37 def stopService(self):
38 service.Service.stopService(self)
41 def getUser(self, user):
42 return defer.succeed(self.users.get(user, "No such user"))
44 def getFingerFactory(self):
45 f = protocol.ServerFactory()
46 f.protocol = FingerProtocol
47 f.getUser = self.getUser
51 application = service.Application('finger', uid=1, gid=1)
52 f = FingerService('/etc/users')
53 finger = internet.TCPServer(79, f.getFingerFactory())
55 finger.setServiceParent(service.IServiceCollection(application))
56 f.setServiceParent(service.IServiceCollection(application))