11import sys
2+ import re
3+ import os
24import subprocess
35import socket
46import time
911from PyQt4 import QtCore , QtGui , QtWebKit , QtNetwork
1012
1113try :
12- opts , extraparams = getopt .getopt (sys .argv [1 :], 'i:h:p:w' )
14+ opts , extraparams = getopt .getopt (sys .argv [1 :], 'i:h:p:w' )
1315except getopt .GetoptError as err :
1416 print (err )
1517 sys .exit (2 )
2123FULLWINDOW = 1
2224LOGLEVEL = 10 # debug, 40=error
2325web = None
26+ VERSION = '0.4.0'
27+ STARTPAGE = '<html><body style="background-color:#000;color:#fff"></body></html>'
2428
2529for item in opts :
2630 if item [0 ] == '-i' :
3539 LOGLEVEL = item [1 ]
3640
3741logging .basicConfig (filename = 'mclient.log' , level = LOGLEVEL )
42+ logger = logging .getLogger ()
43+
44+
45+ def getLastLoad ():
46+ """
47+ analyse logfile for last called server
48+ :return: ip-address of server
49+ """
50+ if os .path .isfile ('mclient.log' ):
51+ for line in reversed (open ('mclient.log' , 'r' ).readlines ()):
52+ if 'load' in line .rstrip () or 'reset' in line .rstrip ():
53+ ip = re .findall (r'[0-9]+(?:\.[0-9]+){3}:[0-9]+' , line .rstrip ().split ()[- 1 ])
54+ if len (ip ) == 0 :
55+ ip = re .findall (r'[0-9]+(?:\.[0-9]+){3}' , line .rstrip ().split ()[- 1 ])
56+ if len (ip ) > 0 :
57+ return ip [0 ]
58+ else :
59+ return ""
60+
3861
39-
4062class AD_Listener (QtCore .QObject ):
4163 message = QtCore .pyqtSignal (str )
42-
64+
4365 def __init__ (self ):
4466 QtCore .QObject .__init__ (self )
45-
67+
4668 self .sock = socket .socket (socket .AF_INET , socket .SOCK_DGRAM , socket .IPPROTO_UDP )
4769 self .sock .setsockopt (socket .SOL_SOCKET , socket .SO_REUSEADDR , 1 )
4870 self .sock .bind ((ANY , MCAST_PORT ))
4971 self .sock .setsockopt (socket .IPPROTO_IP , socket .IP_MULTICAST_TTL , 255 )
5072
5173 status = self .sock .setsockopt (socket .IPPROTO_IP ,
52- socket .IP_ADD_MEMBERSHIP ,
53- socket .inet_aton (MCAST_ADDR ) + socket .inet_aton (ANY ))
74+ socket .IP_ADD_MEMBERSHIP ,
75+ socket .inet_aton (MCAST_ADDR ) + socket .inet_aton (ANY ))
5476
5577 self .sock .setblocking (0 )
5678 self .running = True
57- logging .debug ('mclient started' )
58-
79+ logger .debug ('mclient started' )
80+
5981 def loop (self ):
6082 global ID , web
61- logging .debug ("mclient v 0.1 for eMonitor started with id %s, waiting for events..." % ID )
83+ logger .debug ("mclient v 0.1 for eMonitor started with id %s, waiting for events..." % ID )
84+
85+ # init startpage
86+
87+ ip = getLastLoad ()
88+ if ip :
89+ self .message .emit ('http://{}/monitor/{}' .format (ip , ID ))
90+ else :
91+ ip = None
92+
6293 while self .running :
6394 try :
6495 data , addr = self .sock .recvfrom (1024 )
96+ print "ddd" , data , addr
6597 ts = time .gmtime ()
6698 except socket .error , e :
6799 pass
68100 else :
69- logging .debug ("%s:%s - %s: --> %s" % (addr [0 ], addr [1 ], time .strftime ('%Y.%m.%d - %H:%M:%S' , ts ), data ))
101+ logger .debug ("%s:%s - %s: --> %s" % (addr [0 ], addr [1 ], time .strftime ('%Y.%m.%d - %H:%M:%S' , ts ), data ))
70102 data = data .split ("|" )
71103 if len (data ) > 1 :
72104 if data [0 ] in ['0' , ID ]:
73105 if data [1 ] == "load" :
74106 self .sock .sendto ('%s|load done' % ID , (addr [0 ], addr [1 ]))
75- self .message .emit (data [2 ] % ID )
76- logging .debug ('LOAD: %s' % data [2 ])
107+ if "{}" in data [2 ]:
108+ self .message .emit (data [2 ].format (ID ))
109+ elif "%s" in data [2 ]: # compatibility to old versions
110+ self .message .emit (data [2 ] % ID )
111+ else :
112+ self .message .emit (data [2 ])
113+ logger .debug ('LOAD: {}' .format (data [2 ]))
77114 if data [1 ] == "execute" :
78115 try :
79- ret = subprocess .check_output ('/home/pi/%s' % data [2 ], stderr = subprocess .STDOUT , shell = True )
80- logging .debug ('EXECUTE: %s' % data [2 ])
116+ subprocess .check_output ('/home/pi/{}' . format ( data [2 ]) , stderr = subprocess .STDOUT , shell = True )
117+ logger .debug ('EXECUTE: {}' . format ( data [2 ]) )
81118 except :
82- logging .error ('EXECUTE: %s' % data [2 ])
83- pass
119+ logger .error ('EXECUTE: {}' . format ( data [2 ]) )
120+
84121 if data [1 ] == "reset" :
85122 self .message .emit ('reset' )
86- self .sock .sendto ('%s|reset done' % ID , (addr [0 ], addr [1 ]))
87- self .message .emit (data [2 ] % ID )
88- logging .debug ('RESET' )
123+ self .sock .sendto ('{}|reset done' .format (ID ), (addr [0 ], addr [1 ]))
124+ self .message .emit (data [2 ].format (ID ))
125+ logger .debug ('RESET' )
126+
89127 if data [1 ] == "ping" :
90- self .sock .sendto ('%s|alive' % ID , (addr [0 ], addr [1 ]))
91- logging .debug ('PING' )
128+ if ip is None :
129+ self .sock .sendto ('{}|initneed' .format (ID ), (addr [0 ], addr [1 ]))
130+ else :
131+ self .sock .sendto ('{}|alive' .format (ID ), (addr [0 ], addr [1 ]))
132+ logger .debug ('PING' )
133+
92134 if data [1 ] == "changeid" :
93135 ID = int (data [2 ])
94- self .sock .sendto ('%s|changedone' % ID , (addr [0 ], addr [1 ]))
95- web .setWindowTitle ("eMonitor-Client id (%s)" % ID )
96- logging .debug ('CHANGEID' )
136+ self .sock .sendto ('{}|changedone' .format (ID ), (addr [0 ], addr [1 ]))
137+ web .setWindowTitle ("eMonitor-Client id ({} - {})" .format (ID ), VERSION )
138+ logger .debug ('CHANGEID' )
139+
140+ if data [1 ] == "getscripts" :
141+ scripts = [f for f in os .listdir ('scripts' ) if os .path .isfile (os .path .join ('scripts' , f ))]
142+ self .sock .sendto ('{}|scripts={}' .format (ID , '__' .join (scripts )), (addr [0 ], addr [1 ]))
97143 time .sleep (2 )
98-
99-
144+
145+
100146class WebPage (QtWebKit .QWebPage ):
101147 def __init__ (self ):
102148 super (QtWebKit .QWebPage , self ).__init__ ()
103-
149+
104150 def userAgentForUrl (self , url ):
105151 return "mClient/1.0 (X11; raspberry arm; 1.0) mClient/2013 mClient/1.0"
106-
107-
152+
153+
108154class AD_Window (QtGui .QMainWindow ):
109155 def __init__ (self , parent = None ):
110156 QtGui .QMainWindow .__init__ (self , parent )
111-
112- self .startpage = '<html><body style="background-color:#000"></body></html>'
157+
158+ self .request = None
159+ self .startpage = STARTPAGE
113160 self .webView = QtWebKit .QWebView ()
114161 self .webView .setPage (WebPage ())
115162
116163 self .webView .setAttribute (Qt .WA_TranslucentBackground , True )
117164 self .webView .setAttribute (Qt .WA_OpaquePaintEvent , True )
118-
119- #self.webView.setTextSizeMultiplier(2.0)
165+
166+ # self.webView.setTextSizeMultiplier(2.0)
120167 settings = self .webView .settings ()
121168 settings .setAttribute (QtWebKit .QWebSettings .LocalContentCanAccessRemoteUrls , True )
122169 settings .setAttribute (QtWebKit .QWebSettings .LocalContentCanAccessRemoteUrls , True )
123170 settings .setAttribute (QtWebKit .QWebSettings .LocalContentCanAccessFileUrls , True )
124171 settings .setAttribute (QtWebKit .QWebSettings .LocalStorageEnabled , True )
125172 settings .setAttribute (QtWebKit .QWebSettings .AutoLoadImages , True )
126-
173+
127174 self .setCentralWidget (self .webView )
128175 palette = self .centralWidget ().palette ()
129176 palette .setBrush (QtGui .QPalette .Base , Qt .black )
130177 self .centralWidget ().setPalette (palette )
131-
178+
132179 self .webView .setHtml (self .startpage )
133- self .setWindowTitle ("eMonitor-Client id (%s)" % ID )
180+ self .setWindowTitle ("eMonitor-Client id ({}) - {}" . format ( ID , VERSION ) )
134181
135182 self .thread = QtCore .QThread ()
136183 self .ad_listener = AD_Listener ()
137184 self .ad_listener .moveToThread (self .thread )
138-
185+
139186 self .thread .started .connect (self .ad_listener .loop )
140187 self .ad_listener .message .connect (self .signal_received )
141188 QtCore .QTimer .singleShot (0 , self .thread .start )
142189
143190 def signal_received (self , message ):
191+ logger .debug (QtCore .qVersion ())
144192 try :
145193 if message == "reset" :
146194 self .webView .setHtml (self .startpage )
@@ -152,13 +200,13 @@ def signal_received(self, message):
152200 self .webView .load (self .request )
153201
154202 # old version without user-agent
155- #self.webView.load(QtCore.QUrl(message))
203+ # self.webView.load(QtCore.QUrl(message))
156204 except :
157205 self .webView .setHtml (self .startpage )
158- logging .error ('receive: %s' % message )
206+ logger .error ('receive: {}' . format ( message ) )
159207
160208 def closeEvent (self , event ):
161- logging .debug ('close' )
209+ logger .debug ('close' )
162210 self .ad_listener .running = False
163211 self .thread .quit ()
164212 self .thread .wait ()
@@ -167,11 +215,14 @@ def closeEvent(self, event):
167215if __name__ == "__main__" :
168216 app = QtGui .QApplication (sys .argv )
169217 web = AD_Window ()
170-
218+
219+ if not os .path .exists ('scripts' ):
220+ os .makedirs ('scripts' )
221+
171222 if FULLWINDOW == 1 :
172223 web .setWindowFlags (QtCore .Qt .FramelessWindowHint )
173224 web .showFullScreen ()
174225 else :
175-
226+
176227 web .show ()
177228 sys .exit (app .exec_ ())
0 commit comments