cmlenz@10: # Based on the proxy module from the Medusa project cmlenz@10: # Used for inspecting the communication between two BEEP peers cmlenz@10: cmlenz@10: import asynchat cmlenz@10: import asyncore cmlenz@10: import socket cmlenz@10: import sys cmlenz@10: cmlenz@10: cmlenz@10: class proxy_server(asyncore.dispatcher): cmlenz@10: cmlenz@10: def __init__(self, host, port): cmlenz@10: asyncore.dispatcher.__init__ (self) cmlenz@10: self.create_socket(socket.AF_INET, socket.SOCK_STREAM) cmlenz@10: self.set_reuse_addr() cmlenz@10: self.there = (host, port) cmlenz@10: here = ('', port + 1) cmlenz@10: self.bind(here) cmlenz@10: self.listen(5) cmlenz@10: cmlenz@10: def handle_accept(self): cmlenz@10: proxy_receiver(self, self.accept()) cmlenz@10: cmlenz@10: cmlenz@10: class proxy_sender(asynchat.async_chat): cmlenz@10: cmlenz@10: def __init__(self, receiver, address): cmlenz@10: asynchat.async_chat.__init__(self) cmlenz@10: self.receiver = receiver cmlenz@10: self.set_terminator(None) cmlenz@10: self.create_socket(socket.AF_INET, socket.SOCK_STREAM) cmlenz@10: self.buffer = '' cmlenz@10: self.set_terminator('\r\n') cmlenz@10: self.connect(address) cmlenz@10: print 'L:', '' cmlenz@10: cmlenz@10: def handle_connect(self): cmlenz@10: print 'L:', '' cmlenz@10: cmlenz@10: def collect_incoming_data(self, data): cmlenz@10: self.buffer = self.buffer + data cmlenz@10: cmlenz@10: def found_terminator(self): cmlenz@10: data = self.buffer cmlenz@10: self.buffer = '' cmlenz@10: for line in data.splitlines(): cmlenz@10: print 'L:', '\x1b[35m' + line + '\x1b[0m' cmlenz@10: self.receiver.push(data + '\r\n') cmlenz@10: cmlenz@10: def handle_close(self): cmlenz@10: self.receiver.close() cmlenz@10: self.close() cmlenz@10: cmlenz@10: cmlenz@10: class proxy_receiver(asynchat.async_chat): cmlenz@10: cmlenz@10: channel_counter = 0 cmlenz@10: cmlenz@10: def __init__(self, server, (conn, addr)): cmlenz@10: asynchat.async_chat.__init__(self, conn) cmlenz@10: self.set_terminator('\r\n') cmlenz@10: self.server = server cmlenz@10: self.id = self.channel_counter cmlenz@10: self.channel_counter = self.channel_counter + 1 cmlenz@10: self.sender = proxy_sender (self, server.there) cmlenz@10: self.sender.id = self.id cmlenz@10: self.buffer = '' cmlenz@10: cmlenz@10: def collect_incoming_data (self, data): cmlenz@10: self.buffer = self.buffer + data cmlenz@10: cmlenz@10: def found_terminator(self): cmlenz@10: data = self.buffer cmlenz@10: self.buffer = '' cmlenz@10: for line in data.splitlines(): cmlenz@10: print 'I:', '\x1b[34m' + line + '\x1b[0m' cmlenz@10: self.sender.push (data + '\r\n') cmlenz@10: cmlenz@10: def handle_connect(self): cmlenz@10: print 'I:', '' cmlenz@10: cmlenz@10: def handle_close(self): cmlenz@10: print 'I:', '' cmlenz@10: self.sender.close() cmlenz@10: self.close() cmlenz@10: cmlenz@10: cmlenz@10: if __name__ == '__main__': cmlenz@10: if len(sys.argv) < 3: cmlenz@10: print 'Usage: %s ' % sys.argv[0] cmlenz@10: else: cmlenz@10: ps = proxy_server(sys.argv[1], int(sys.argv[2])) cmlenz@10: asyncore.loop()