Package logilab-common-0 :: Package 39 :: Package 0 :: Module monserver
[frames] | no frames]

Source Code for Module logilab-common-0.39.0.monserver

  1  # -*- coding: utf-8 -*- 
  2  """A TCP server implemented in a separate thread that 
  3  allows *one* client to connect and provides a command line interpreter 
  4  allowing the remote client to explore the process on the fly. 
  5   
  6  :copyright: 2000-2008 LOGILAB S.A. (Paris, FRANCE), all rights reserved. 
  7  :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr 
  8  :license: General Public License version 2 - http://www.gnu.org/licenses 
  9  """ 
 10  __docformat__ = "restructuredtext en" 
 11   
 12  from warnings import warn 
 13  warn('this module is deprecated and will disappear in a near release', 
 14       DeprecationWarning, stacklevel=1) 
 15   
 16  import threading 
 17  import SocketServer 
 18  import traceback 
 19  import code 
 20  import sys 
 21  import time 
 22   
 23  # NOTES: ce module étant utilisé pour l'introspection, il peut 
 24  # être utile de fournir dans les locales de l'interpreteur des 
 25  # objets déjà initialisés (par exemple le module __main__ ou 
 26  # bien __main__.*) ou encore des objets servant à l'introspection 
 27  # comme on en trouve dans pymonitor (qui prend la liste des objets 
 28  # maintenus par le garbage collector) ou a des statistiques 
 29  # pour faire des opérations du style: 
 30  # inspector.count_types( MyClass ) 
 31  # inspector.list_types( MyClass ) etc... 
 32   
33 -class MonitorInterpreter(code.InteractiveConsole):
34 """Subclasses InteractiveConsole so that all inputs 35 and outputs are done through a socket"""
36 - def __init__(self, rfile, wfile ):
37 code.InteractiveConsole.__init__(self) 38 self.wfile = wfile 39 self.rfile = rfile 40 sys.stdout = self.wfile 41 sys.stderr = self.wfile
42
43 - def write(self, data):
44 """replace stderr output by writing to wfile""" 45 self.wfile.write( data ) 46 self.wfile.flush()
47
48 - def raw_input( self, prompt = None ):
49 """Provides reading lines through the network""" 50 if prompt is not None: 51 self.wfile.write(prompt) 52 self.wfile.flush() 53 line = self.rfile.readline() 54 if line.endswith("\r\n"): 55 line = line[:-2] 56 elif line.endswith("\n"): 57 line = line[:-1] 58 return line
59 60
61 -class MonitorRequestHandler(SocketServer.BaseRequestHandler):
62 """Request handler for remote interpreter"""
63 - def __init__(self, request, clientaddress, server ):
64 self.locals = {} 65 self.globals = globals().copy() 66 self.wfile = request.makefile("w") 67 self.rfile = request.makefile("r") 68 SocketServer.BaseRequestHandler.__init__(self, request, clientaddress, 69 server )
70
71 - def handle(self):
72 """handle on request, through MonitorInterpreter""" 73 saved_stdout = sys.stdout 74 saved_stderr = sys.stderr 75 interpreter = MonitorInterpreter(self.rfile, self.wfile) 76 try: 77 interpreter.interact() 78 except KeyboardInterrupt: 79 self.server.exit = True 80 except: 81 sys.stdout = saved_stdout 82 sys.stderr = saved_stderr 83 traceback.print_exc() 84 print "Monitor handler exited"
85
86 -class Monitor(threading.Thread):
87 """Monitor server. monothreaded we only 88 allow one client at a time"""
89 - def __init__(self, host, port):
90 threading.Thread.__init__(self) 91 self.host = host 92 self.port = port 93 self.exit = False
94 95
96 - def run(self):
97 """run the server loop""" 98 server = SocketServer.TCPServer( (self.host, self.port), 99 MonitorRequestHandler ) 100 while not self.exit: 101 server.handle_request()
102 103 104
105 -def demo_forever():
106 """sample demo server that outputs 107 numbers on screen""" 108 cnt = 1 109 while 1: 110 print cnt 111 time.sleep(2) 112 cnt += 1
113 114 if __name__ == "__main__": 115 listen_port = int(sys.argv[1]) 116 mon = Monitor( "", listen_port ) 117 mon.start() 118 try: 119 demo_forever() 120 except Exception: 121 traceback.print_exc() 122 mon.exit = True 123 mon.join() 124