Skip to content

Commit 61a6b31

Browse files
committed
new version matching eMonitor 0.4.0
1 parent 2d74007 commit 61a6b31

1 file changed

Lines changed: 93 additions & 42 deletions

File tree

mclient.py

Lines changed: 93 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import sys
2+
import re
3+
import os
24
import subprocess
35
import socket
46
import time
@@ -9,7 +11,7 @@
911
from PyQt4 import QtCore, QtGui, QtWebKit, QtNetwork
1012

1113
try:
12-
opts, extraparams = getopt.getopt(sys.argv[1:], 'i:h:p:w')
14+
opts, extraparams = getopt.getopt(sys.argv[1:], 'i:h:p:w')
1315
except getopt.GetoptError as err:
1416
print(err)
1517
sys.exit(2)
@@ -21,6 +23,8 @@
2123
FULLWINDOW = 1
2224
LOGLEVEL = 10 # debug, 40=error
2325
web = None
26+
VERSION = '0.4.0'
27+
STARTPAGE = '<html><body style="background-color:#000;color:#fff"></body></html>'
2428

2529
for item in opts:
2630
if item[0] == '-i':
@@ -35,112 +39,156 @@
3539
LOGLEVEL = item[1]
3640

3741
logging.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-
4062
class 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+
100146
class 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+
108154
class 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):
167215
if __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

Comments
 (0)