Laufzeitüberwachung eingebaut

This commit is contained in:
2017-03-28 08:20:48 +02:00
parent 8b46383ba1
commit a96abb11a6
2 changed files with 33 additions and 6 deletions

View File

@@ -63,7 +63,7 @@ def configure():
pargs.conffile = os.path.join(startdir, pargs.conffile) pargs.conffile = os.path.join(startdir, pargs.conffile)
if pargs.logfile is not None and os.path.dirname(pargs.logfile) == "": if pargs.logfile is not None and os.path.dirname(pargs.logfile) == "":
pargs.logfile = os.path.join(startdir, pargs.logfile) pargs.logfile = os.path.join(startdir, pargs.logfile)
# Prüfen ob als Daemon ausgeführt werden soll # Prüfen ob als Daemon ausgeführt werden soll
global forked global forked
pidfile = "/var/run/revpipyload.pid" pidfile = "/var/run/revpipyload.pid"

View File

@@ -39,6 +39,7 @@ import signal
import socket import socket
import subprocess import subprocess
import tarfile import tarfile
import warnings
import zipfile import zipfile
from concurrent import futures from concurrent import futures
from configparser import ConfigParser from configparser import ConfigParser
@@ -49,6 +50,7 @@ from sys import stdout as sysstdout
from tempfile import mktemp from tempfile import mktemp
from threading import Thread, Event, Lock from threading import Thread, Event, Lock
from time import sleep, asctime from time import sleep, asctime
from timeit import default_timer
from xmlrpc.client import Binary from xmlrpc.client import Binary
from xmlrpc.server import SimpleXMLRPCServer from xmlrpc.server import SimpleXMLRPCServer
@@ -476,6 +478,7 @@ class RevPiSlave(Thread):
def __init__(self): def __init__(self):
"""Instantiiert RevPiSlave-Klasse.""" """Instantiiert RevPiSlave-Klasse."""
super().__init__() super().__init__()
self.deadtime = 0.5
self._evt_exit = Event() self._evt_exit = Event()
self.zeroonerror = False self.zeroonerror = False
self.zeroonexit = False self.zeroonexit = False
@@ -487,11 +490,17 @@ class RevPiSlave(Thread):
# Socket öffnen und konfigurieren # Socket öffnen und konfigurieren
self.so = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.so = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.so.bind(("", 55234)) while not self._evt_exit.is_set():
try:
self.so.bind(("", 55234))
except:
warnings.warn("can not bind socket - retry", Warning)
self._evt_exit.wait(1)
else:
break
self.so.listen(1) self.so.listen(1)
self.rpi = None self.rpi = None
while not self._evt_exit.is_set(): while not self._evt_exit.is_set():
# Verbindung annehmen # Verbindung annehmen
@@ -508,10 +517,13 @@ class RevPiSlave(Thread):
# Erste Meldung erhalten # Erste Meldung erhalten
meldung = self.rpi.recv(4) meldung = self.rpi.recv(4)
comtime = 0
while meldung in msgcli: while meldung in msgcli:
ot = default_timer()
if meldung == b'PICT': if meldung == b'PICT':
# piCtory Konfiguration senden # piCtory Konfiguration senden
proginit.logger.debug("transfair pictory configuration")
fh_pic = open(configrsc, "rb") fh_pic = open(configrsc, "rb")
while True: while True:
data = fh_pic.read(1024) data = fh_pic.read(1024)
@@ -523,32 +535,46 @@ class RevPiSlave(Thread):
# Abschlussmeldung # Abschlussmeldung
self.rpi.send(b'PICOK') self.rpi.send(b'PICOK')
proginit.logger.debug("pictory ende")
if meldung == b'DATA': if meldung == b'DATA':
proginit.logger.debug("read process image")
# Processabbild übertragen # Processabbild übertragen
block = 0 block = 0
fh_proc.seek(0) fh_proc.seek(0)
while block < 4: while block < 4:
self.rpi.send(fh_proc.read(1024)) self.rpi.send(fh_proc.read(1024))
block += 1 block += 1
proginit.logger.debug("procimg ende")
if meldung == b'SEND': if meldung == b'SEND':
proginit.logger.debug("write to process image")
# Ausgänge empfangen # Ausgänge empfangen
block = self.rpi.recv(1024) block = self.rpi.recv(1024)
test = pickle.loads(block) test = pickle.loads(block)
fh_proc.seek(test[0]) fh_proc.seek(test[0])
fh_proc.write(test[1]) fh_proc.write(test[1])
proginit.logger.debug(test)
# Nächste Meldung erhalten # Nächste Meldung erhalten
meldung = self.rpi.recv(4) meldung = self.rpi.recv(4)
# Verarbeitungszeit prüfen
comtime = default_timer() - ot
if comtime > self.deadtime:
proginit.logger.error(
"runtime more than {} ms: {}".format(
int(self.deadtime * 1000), int(comtime * 1000)
)
)
break
fh_proc.close() fh_proc.close()
self.rpi.shutdown(socket.SHUT_RDWR) self.rpi.shutdown(socket.SHUT_RDWR)
self.rpi.close() self.rpi.close()
if self.zeroonexit or comtime > self.deadtime and self.zeroonerror:
_zeroprocimg()
# Socket schließen # Socket schließen
self.so.close() self.so.close()
@@ -562,6 +588,7 @@ class RevPiSlave(Thread):
if self.rpi is not None: if self.rpi is not None:
self.rpi.close() self.rpi.close()
self.so.shutdown(socket.SHUT_RDWR) self.so.shutdown(socket.SHUT_RDWR)
proginit.logger.debug("leave RevPiSlave.stop()") proginit.logger.debug("leave RevPiSlave.stop()")