#!/usr/bin/env python import sys from threading import currentThread from SocketServer import BaseRequestHandler, TCPServer from code import InteractiveConsole _locals = None class DebugLogger(object): def do_print(self, *args): for i in args: print i, print info = do_print warn = do_print debug = do_print _log = DebugLogger() class DebugConsole(InteractiveConsole): def __init__(self, request): self.request = request InteractiveConsole.__init__(self, _locals) def raw_input(self, prompt): self.request.send(prompt) data = self.request.recv(10000).rstrip() if len(data) == 1 and ord(data[0]) == 4: sys.exit() return data def write(self, data): self.request.send(str(data)) def write_nl(self, data): self.write(str(data)+"\r\n") class DebugServerHandler(BaseRequestHandler): def __init__(self, request, client_address, server): currentThread()._thread.setName("debugserver-%s:%d" % client_address) _log.debug('Open connection to DebugServer from %s:%d' % client_address) BaseRequestHandler.__init__(self, request, client_address, server) def handle(self): console = DebugConsole(self.request) sys.displayhook = console.write_nl console.interact('DebugServer') self.request.close() class DebugServer(TCPServer): daemon_threads = True allow_reuse_address = True def handle_error(self, request, client_address): _log.debug('Closing connection to DebugServer from %s:%d' % client_address) request.close() def run_server(port=6655, host='0.0.0.0', locals=locals()): currentThread()._thread.setName("debugserver-main") global _locals _locals = locals if "log" in locals.keys(): global _log _log = locals["log"] _log.info("Starting DebugServer on port %d" % port) server = DebugServer(('', port), DebugServerHandler) try: server.serve_forever() except KeyboardInterrupt: pass if __name__ == "__main__": run_server()