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)
19
class FingerService(service.Service):
20
def __init__(self, filename):
22
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
50
application = service.Application('finger', uid=1, gid=1)
51
f = FingerService('/etc/users')
52
finger = internet.TCPServer(79, f.getFingerFactory())
54
finger.setServiceParent(service.IServiceCollection(application))
55
f.setServiceParent(service.IServiceCollection(application))