from sys import stdout from asyncore import dispatcher, loop import socket from socket import AF_INET, SOCK_STREAM, getservbyname from types import IntType, StringType from errno import EAGAIN class switch(dispatcher): def __init__(self, debug=0): dispatcher.__init__(self) self.debug = debug def switch(self, child): print "switching" self.child = child child.start() def readable(self): return self.child.readable() def writable(self): return self.child.writable() def handle_read(self): return self.child.handle_read() def handle_write(self): return self.child.handle_write() def handle_close(self): return self.child.handle_close() def handle_connect(self): return self.child.handle_connect() def log(self, message): if self.debug: dispatcher.log(self, message) class finger(switch): def __init__(self, user, *args, **kwargs): apply(switch.__init__, (self,)+args, kwargs) self.create_socket(AF_INET, SOCK_STREAM) c = connecter(self, "localhost", "finger") c.next = w = writer(self, user+"\n") w.next = self.reader = r = reader(self) r.next = closer(self) self.switch(c) def close(self): stdout.write(self.reader.message) dispatcher.close(self) class connecter: def __init__(self, parent, host, service): self.parent = parent self.host = host if type(service) is StringType: service = getservbyname(service, "tcp") self.service = service def start(self): self.parent.connect( (self.host, self.service) ) def readable(self): return 1 def writable(self): return 1 def handle_connect(self): self.parent.switch(self.next) class writer: def __init__(self, parent, message): self.parent = parent self.message = message def start(self): pass def readable(self): return 0 def writable(self): return 1 def handle_write(self): print "writing now" sent = self.parent.send(self.message) self.message = self.message[sent:] if not self.message: self.parent.switch(self.next) class reader: def __init__(self, parent): self.parent = parent self.message = "" def start(self): pass def readable(self): return 1 def writable(self): return 0 def handle_read(self): print "got read" self.message = self.message + self.parent.recv(8192) def handle_close(self): sent = self.parent.send(self.message) self.message = self.message[sent:] def handle_close(self): self.parent.switch(self.next) class closer: def __init__(self, parent): self.parent = parent def start(self): self.parent.close() finger("sam", debug=1) loop()