source: admin-center/trunk/fuentes/admin-center.install/usr/share/n4d/python-plugins/LogManager.py @ 1491

Last change on this file since 1491 was 1491, checked in by joamuran, 5 years ago

fixed logmanager

File size: 7.4 KB
Line 
1import socket
2import threading
3from SimpleWebSocketServer import SimpleWebSocketServer, WebSocket
4import websocket
5import base64
6
7'''
8Cal la llibreria simple-websocket-server (instal.lable amb pip)
9https://github.com/dpallot/simple-websocket-server
10'''
11
12class n4dLogDispatcher(WebSocket):
13    listeners = []
14    #def __init__(self):
15    def __init__(self, server, sock, address):
16        WebSocket.__init__(self, server, sock, address)
17        pass
18   
19    def handleMessage(self):
20        print " [LOG] Received message: "+str(self.data)
21        print self.listeners
22        for listener in self.listeners:   
23            #if listener != self:
24                print " [LOG] Sending "+str(self.data)+" to "+str(listener)
25                #listener.sendMessage(self.address[0] + u' - ' + self.data)  ## Igual es este el que posava el 127.0.0.1 - davant!!
26                msgtype="text"
27                print (str(self.data))
28                if((str(self.data).find("<b>Finished with status:"))>=0): # Found finished signal
29                    print"found"
30                    msgtype="end_signal"
31                listener.sendMessage(u'{"msg":"'+ base64.b64encode(self.data)+'", "type":"'+msgtype+'"}')  ## Igual es este el que posava el 127.0.0.1 - davant!!
32        pass
33   
34    def handleConnected(self):
35        print ("**!*!*!*!*!*!*!*!**!:_ Connection request from:"+self.address[0]);
36        if (self.address[0]=='127.0.0.1'):
37            print self.address, 'connected as a writer'
38            #for listener in self.listeners:   
39            #    if listener != self:
40            #        listener.sendMessage(u'{"msg":"- Connected server"}');
41        else:
42            print self.address, 'connected and added to listeners'
43            self.listeners.append(self)
44            #self.sendMessage("{'msg':'Hello gayer'}");
45            self.sendMessage(u'{"msg":"'+base64.b64encode("Listening server...")+'"}');
46
47    def handleClose(self):
48       self.listeners.remove(self)
49       print self.address, 'closed and removed'
50
51
52class LogManager:
53    servers=[]
54    def __init__(self):
55        #self.servers=[]
56        pass
57    #def __init__
58
59    def serveforever(self, server):
60        try:
61            server.serveforever()
62        except Exception as e:
63            print("[Serverforever] Exception: "+str(e)+" Exit from thread...")
64            exit()
65        pass
66   
67    def prepareConnection(self): # Caldra un bindConnection despres
68        try:
69           
70            # 1st: Prepare Websocket connection for client communication
71           
72            server = SimpleWebSocketServer('', 0, n4dLogDispatcher)
73            port=server.serversocket._sock.getsockname()[1]
74            wsthread = threading.Thread(target=self.serveforever, args=([server]))
75            #self.servers.append({"server":server, "port":port});   
76            wsthread.daemon = True
77            wsthread.start()
78            print ("Create connection to 127.0.0.1:"+str(port))
79            #self.serveforever(server);
80           
81           
82            # 2nd: Prepare socket connection for server communication
83           
84            srv_socket=socket.socket(socket.AF_INET, socket.SOCK_DGRAM);
85            #srv_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
86            srv_socket.bind(('127.0.0.1', 0))
87            srv_port=srv_socket.getsockname()[1]
88            #print ({"wsserver":server, "wsclient":None, "wsport":port, "socksrv":srv_socket, "sport":srv_port});
89                       
90            print("[LogManager] Listening socket for n4d");
91           
92            #sthread = threading.Thread(target=self.TranslateSock2WS, args=([srv_socket, server]))
93            sthread = threading.Thread(target=self.TranslateSock2WS, args=([srv_socket, port])) # port is ws port
94            sthread.daemon = True
95            sthread.start()
96           
97            #srv_socket=None
98            #srv_port=0
99           
100            self.servers.append({"wsserver":server, "wsclient":None, "wsport":port, "socksrv":srv_socket, "sport":srv_port});
101            print ("Create connection to 127.0.0.1:"+str(srv_port)+" to ws:127.0.0.1:"+str(port))
102           
103            return {"wsport":port, "sport":srv_port}
104        except Exception as e:
105            print ('[LogManager]',e)
106        pass
107 
108    def TranslateSock2WS(self, server, port):  #port is websocket port
109        while True:
110            data, addr = server.recvfrom(1024)
111            if not data:
112                break
113            print (u'{"msg":"'+str(data)+'"}')
114           
115            # has been received any message from socket writer?
116            print self.servers
117            print str(port)+"---"
118            connection=filter(lambda con: (str(con['wsport']) == str(port))&(con['wsclient'] != None) , self.servers)
119            if(len(connection)==0):
120                wsc = websocket.WebSocket()                 # create websocket client connection
121                wsc.connect("ws://127.0.0.1:"+str(port))
122                wsc.send(str(data));
123                for con in self.servers:
124                    print "Compere "+str(con['wsport'])+" with "+str(port)
125                    if str(con['wsport'])==str(port):
126                        con['wsclient']=wsc
127
128            else: # Just send data to websocket client, connected before
129                connection[0]['wsclient'].send(str(data));
130                if((str(data).find("<b>Finished with status:"))>=0): # Found finished signal
131                    self.closeConnection(connection[0]['wsport'])
132                    #print("Renmoving thread");
133                    return(str(data));
134                           
135           
136                           
137    def closeConnection(self, port):
138        ''' closes connection listening in certain port'''
139        print("CLOSING CONNECTION FOR PORT: "+str(port));
140        try:
141            item_to_delete=None;
142           
143            for i in self.servers:
144                if str(i['wsport'])==str(port):
145                    item_to_delete=i
146
147
148            if item_to_delete!=None:
149                print ("Closing wsclient");
150               
151               
152                # Caldria millorar l'alliberament dels ports...
153               
154                item_to_delete["wsclient"].shutdown();
155                item_to_delete["wsclient"].close();
156                #item_to_delete["wsclient"]=None;
157                print ("Closing wsserver");
158                item_to_delete["wsserver"].shutdown();
159                item_to_delete["wsserver"].close();
160                #item_to_delete["wsserver"]=None;
161                #dirs(item_to_delete["wsserver"])
162                #item_to_delete["wsserver"].close();
163                #item_to_delete["wsserver"]._sock.close();
164                print ("Closing socksrv");
165                item_to_delete["socksrv"].shutdown();
166                item_to_delete["socksrv"].close();
167                #print ("All done");
168               
169               
170                self.servers.remove(item_to_delete)
171                return '{"status":"true", "msg":"Free port :'+str(port)+'"}'
172           
173            return '{"status:false", "msg":"not found"}'
174            pass
175        except Exception as e:
176            return '{"status":"error", "msg":"'+str(e)+'"}'
177               
178    def cancelJob(self, port):
179        try:
180            objects['LmdServer'].cancel_job('127.0.0.1', port, None);
181        except Exception as e:
182            print ('[LogManager]',e)
183           
184        pass
185           
186
187               
188    def showOpenedWebsockets(self):
189        return str(self.servers)
190        pass
191       
192   
Note: See TracBrowser for help on using the repository browser.