root / logilab.pylintinstaller / logilab / common / monserver.py

Revision 202:d67e86292521, 3.7 kB (checked in by tziade@…, 9 months ago)

added logilab.pylintinstaller

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