diff --git a/doc/procimgserver.html b/doc/procimgserver.html index 6b7e157..0f398e2 100644 --- a/doc/procimgserver.html +++ b/doc/procimgserver.html @@ -94,19 +94,19 @@ ProcimgServer (Constructor)

Instantiiert RevPiCheckServer()-Klasse.

-
xmlserver:
+
xmlserver
XML-RPC Server -
procimg:
+
procimg
Pfad zum Prozessabbild -
configrsc:
+
configrsc
Pfad zur piCtory Konfigurationsdatei -
logger:
+
logger
Loggerinstanz -
aclmode:
+
aclmode
Zugriffsrechte
@@ -128,7 +128,7 @@ ProcimgServer.ios

Generiert ein dict() der Devices und IOs.

-
type:
+
type
IO Typ inp/out
@@ -144,13 +144,13 @@ ProcimgServer.setvalue

Setzt einen Wert auf dem RevPi.

-
device:
+
device
Device Position oder Name -
io:
+
io
IO Name fuer neuen Wert -
value:
+
value
Neuer Wert
diff --git a/doc/revpipyload.html b/doc/revpipyload.html index 4c67169..f19aa87 100644 --- a/doc/revpipyload.html +++ b/doc/revpipyload.html @@ -123,10 +123,10 @@ LogReader.load_applog

Uebertraegt Logdaten Binaer.

-
start:
+
start
Startbyte -
count:
+
count
Max. Byteanzahl zum uebertragen
@@ -142,10 +142,10 @@ LogReader.load_plclog

Uebertraegt Logdaten Binaer.

-
start:
+
start
Startbyte -
count:
+
count
Max. Byteanzahl zum uebertragen
@@ -220,7 +220,7 @@ PipeLogwriter (Constructor)

Instantiiert PipeLogwriter-Klasse.

-
logfilename:
+
logfilename
Dateiname fuer Logdatei
@@ -248,7 +248,7 @@ PipeLogwriter.logline

Schreibt eine Zeile in die Logdatei oder stdout.

-
message:
+
message
Logzeile zum Schreiben
@@ -362,7 +362,7 @@ RevPiPlc._spopen

Startet das PLC Programm.

-
lst_proc:
+
lst_proc
Prozessliste
@@ -486,7 +486,7 @@ Methods Loescht das gesamte plcworkdir Verzeichnis. xml_psstart -Starten den Prozessabbildserver. +Startet den Prozessabbildserver. xml_psstop Stoppt den Prozessabbildserver. @@ -554,10 +554,10 @@ RevPiPyLoad.packapp

Erzeugt aus dem PLC-Programm ein TAR-File.

-
mode:
+
mode
Packart 'tar' oder 'zip' -
pictory:
+
pictory
piCtory Konfiguration mit einpacken
@@ -629,10 +629,10 @@ RevPiPyLoad.xml_plcdownload

Uebertraegt ein Archiv vom plcworkdir.

-
mode:
+
mode
Archivart 'tar' 'zip' -
pictory:
+
pictory
piCtory Konfiguraiton mit einpacken
@@ -698,10 +698,10 @@ RevPiPyLoad.xml_plcupload

Empfaengt Dateien fuer das PLC Programm.

-
filedata:
+
filedata
GZIP Binary data der datei -
filename:
+
filename
Name inkl. Unterverzeichnis der Datei
@@ -726,7 +726,7 @@ True, wenn erfolgreich RevPiPyLoad.xml_psstart xml_psstart()

-Starten den Prozessabbildserver. +Startet den Prozessabbildserver.

Returns:
@@ -767,10 +767,10 @@ RevPiPyLoad.xml_setpictoryrsc

Schreibt die config.rsc Datei von piCotry.

-
filebytes:
+
filebytes
xmlrpc.client.Binary()-Objekt -
reset:
+
reset
Reset piControl Device
diff --git a/revpipyload/procimgserver.py b/revpipyload/procimgserver.py index ff19dc9..0248908 100644 --- a/revpipyload/procimgserver.py +++ b/revpipyload/procimgserver.py @@ -30,11 +30,11 @@ class ProcimgServer(): def __init__(self, logger, xmlserver, configrsc, procimg, aclmode): """Instantiiert RevPiCheckServer()-Klasse. - @param xmlserver: XML-RPC Server - @param procimg: Pfad zum Prozessabbild - @param configrsc: Pfad zur piCtory Konfigurationsdatei - @param logger: Loggerinstanz - @param aclmode: Zugriffsrechte + @param xmlserver XML-RPC Server + @param procimg Pfad zum Prozessabbild + @param configrsc Pfad zur piCtory Konfigurationsdatei + @param logger Loggerinstanz + @param aclmode Zugriffsrechte """ # Logger übernehmen @@ -68,15 +68,15 @@ class ProcimgServer(): def devices(self): """Generiert Deviceliste mit Position und Namen. - @returns: list() mit Tuple (pos, name)""" + @return list() mit Tuple (pos, name)""" return [ (dev.position, dev.name) for dev in self.rpi.devices ] def ios(self, type): """Generiert ein dict() der Devices und IOs. - @param type: IO Typ inp/out - @returns: pickled dict()""" + @param type IO Typ inp/out + @return pickled dict()""" dict_ios = {} for dev in self.rpi.devices: dict_ios[dev.position] = [] @@ -104,10 +104,10 @@ class ProcimgServer(): def setvalue(self, device, io, value): """Setzt einen Wert auf dem RevPi. - @param device: Device Position oder Name - @param io: IO Name fuer neuen Wert - @param value: Neuer Wert - @returns: list() [device, io, status, msg] + @param device Device Position oder Name + @param io IO Name fuer neuen Wert + @param value Neuer Wert + @return list() [device, io, status, msg] """ # Zugriffsrechte prüfen @@ -141,7 +141,7 @@ class ProcimgServer(): def values(self): """Liefert Prozessabbild an Client. - @returns: Binary() bytes or None""" + @return Binary() bytes or None""" if self.rpi.devices.readprocimg() and self.rpi.devices.syncoutputs(): bytebuff = b'' for dev in self.rpi.devices: diff --git a/revpipyload/revpipyload.py b/revpipyload/revpipyload.py index c0d38b9..912ea3e 100755 --- a/revpipyload/revpipyload.py +++ b/revpipyload/revpipyload.py @@ -85,9 +85,9 @@ class LogReader(): def load_applog(self, start, count): """Uebertraegt Logdaten Binaer. - @param start: Startbyte - @param count: Max. Byteanzahl zum uebertragen - @returns: Binary() der Logdatei + @param start Startbyte + @param count Max. Byteanzahl zum uebertragen + @return Binary() der Logdatei """ if not os.access(proginit.logapp, os.R_OK): @@ -105,9 +105,9 @@ class LogReader(): def load_plclog(self, start, count): """Uebertraegt Logdaten Binaer. - @param start: Startbyte - @param count: Max. Byteanzahl zum uebertragen - @returns: Binary() der Logdatei + @param start Startbyte + @param count Max. Byteanzahl zum uebertragen + @return Binary() der Logdatei """ if not os.access(proginit.logplc, os.R_OK): @@ -136,7 +136,7 @@ class PipeLogwriter(Thread): def __init__(self, logfilename): """Instantiiert PipeLogwriter-Klasse. - @param logfilename: Dateiname fuer Logdatei""" + @param logfilename Dateiname fuer Logdatei""" super().__init__() self._exit = Event() self._fh = None @@ -159,11 +159,10 @@ class PipeLogwriter(Thread): def _configurefh(self): """Konfiguriert den FileHandler fuer Ausgaben der PLCAPP. - @returns: FileHandler-Objekt""" + @return FileHandler-Objekt""" proginit.logger.debug("enter PipeLogwriter._configurefh()") dirname = os.path.dirname(self.logfile) - proginit.logger.debug("dirname = {}".format(os.path.abspath(dirname))) if os.access(dirname, os.R_OK | os.W_OK): @@ -176,7 +175,7 @@ class PipeLogwriter(Thread): def logline(self, message): """Schreibt eine Zeile in die Logdatei oder stdout. - @param message: Logzeile zum Schreiben""" + @param message Logzeile zum Schreiben""" with self._lckfh: self._fh.write("{}\n".format(message)) self._fh.flush() @@ -194,7 +193,6 @@ class PipeLogwriter(Thread): proginit.logger.debug("enter PipeLogwriter.run()") fhread = os.fdopen(self._fdr) - proginit.logger.debug("enter logreader pipe loop") while not self._exit.is_set(): line = fhread.readline() self._lckfh.acquire() @@ -258,7 +256,7 @@ class RevPiPlc(Thread): def _configureplw(self): """Konfiguriert den PipeLogwriter fuer Ausgaben der PLCAPP. - @returns: PipeLogwriter()""" + @return PipeLogwriter()""" proginit.logger.debug("enter RevPiPlc._configureplw()") logfile = None if proginit.pargs.daemon: @@ -282,8 +280,8 @@ class RevPiPlc(Thread): def _spopen(self, lst_proc): """Startet das PLC Programm. - @param lst_proc: Prozessliste - @returns: subprocess""" + @param lst_proc Prozessliste + @return subprocess""" proginit.logger.debug("enter RevPiPlc._spopen({})".format(lst_proc)) sp = subprocess.Popen( lst_proc, @@ -379,6 +377,12 @@ class RevPiPlc(Thread): self._evt_exit.wait(1) + if self._plw is not None: + self._plw.logline("-" * 55) + self._plw.logline("plc: {} stopped: {}".format( + os.path.basename(self._program), asctime() + )) + proginit.logger.debug("leave RevPiPlc.run()") def stop(self): @@ -391,9 +395,8 @@ class RevPiPlc(Thread): if self._procplc is None: if self._plw is not None: self._plw.stop() - proginit.logger.debug("join after NONE pipe thread") self._plw.join() - proginit.logger.debug("joined after NONE pipe thread") + proginit.logger.debug("log pipes successfully closed") proginit.logger.debug("leave RevPiPlc.stop()") return @@ -424,9 +427,8 @@ class RevPiPlc(Thread): if self._plw is not None: self._plw.stop() - proginit.logger.debug("join pipe thread") self._plw.join() - proginit.logger.debug("joined pipe thread") + proginit.logger.debug("log pipes successfully closed") proginit.logger.debug("leave RevPiPlc.stop()") @@ -443,6 +445,7 @@ class RevPiPyLoad(): def __init__(self): """Instantiiert RevPiPyLoad-Klasse.""" proginit.configure() + proginit.logger.debug("enter RevPiPyLoad.__init__()") # piCtory Konfiguration an bekannten Stellen prüfen global configrsc @@ -492,8 +495,12 @@ class RevPiPyLoad(): signal.signal(signal.SIGHUP, self._sigloadconfig) signal.signal(signal.SIGUSR1, self._signewlogfile) + proginit.logger.debug("leave RevPiPyLoad.__init__()") + def _loadconfig(self): """Load configuration file and setup modul.""" + proginit.logger.debug("enter RevPiPyLoad._loadconfig()") + self.evt_loadconfig.clear() pauseproc = False @@ -614,9 +621,12 @@ class RevPiPyLoad(): ) self.start() + proginit.logger.debug("leave RevPiPyLoad._loadconfig()") + def _plcthread(self): """Konfiguriert den PLC-Thread fuer die Ausfuehrung. - @returns: PLC-Thread Object or None""" + @return PLC-Thread Object or None""" + proginit.logger.debug("enter RevPiPyLoad._plcthread()") # Prüfen ob Programm existiert if not os.path.exists(os.path.join(self.plcworkdir, self.plcprog)): @@ -636,27 +646,29 @@ class RevPiPyLoad(): th_plc.uid = int(self.globalconfig["DEFAULT"].get("plcuid", 65534)) th_plc.zeroonerror = self.zeroonerror th_plc.zeroonexit = self.zeroonexit - proginit.logger.debug("created PLC watcher") + + proginit.logger.debug("leave RevPiPyLoad._plcthread()") return th_plc def _sigexit(self, signum, frame): """Signal handler to clean and exit program.""" - proginit.logger.debug("got exit signal") - self.stop() + proginit.logger.debug("enter RevPiPyLoad._sigexit()") - # Programm aufräumen + # Programm stoppen und aufräumen + self.stop() proginit.cleanup() - proginit.logger.debug("end revpipyload program") + proginit.logger.debug("leave RevPiPyLoad._sigexit()") def _sigloadconfig(self, signum, frame): """Signal handler to load configuration.""" - proginit.logger.debug("got reload config signal") + proginit.logger.debug("enter RevPiPyLoad._sigloadconfig()") self.evt_loadconfig.set() + proginit.logger.debug("leave RevPiPyLoad._sigloadconfig()") def _signewlogfile(self, signum, frame): """Signal handler to start new logfile.""" - proginit.logger.debug("got new logfile signal") + proginit.logger.debug("enter RevPiPyLoad._signewlogfile()") # Logger neu konfigurieren proginit.configure() @@ -669,14 +681,18 @@ class RevPiPyLoad(): # Logreader schließen self.logr.closeall() + proginit.logger.debug("leave RevPiPyLoad._signewlogfile()") + def packapp(self, mode="tar", pictory=False): """Erzeugt aus dem PLC-Programm ein TAR-File. - @param mode: Packart 'tar' oder 'zip' - @param pictory: piCtory Konfiguration mit einpacken - @returns: Dateinamen des Archivs + @param mode Packart 'tar' oder 'zip' + @param pictory piCtory Konfiguration mit einpacken + @return Dateinamen des Archivs """ + proginit.logger.debug("enter RevPiPyLoad.packapp()") + tup_file = mkstemp(suffix="_packed", prefix="plc_") filename = tup_file[1] @@ -713,10 +729,13 @@ class RevPiPyLoad(): finally: fh_pack.close() + proginit.logger.debug("leave RevPiPyLoad.packapp()") return filename def start(self): """Start plcload and PLC python program.""" + proginit.logger.debug("enter RevPiPyLoad.start()") + proginit.logger.info("starting revpipyload") self._exit = False @@ -738,8 +757,12 @@ class RevPiPyLoad(): proginit.logger.info("exit python plc program to reload config") self._loadconfig() + proginit.logger.debug("leave RevPiPyLoad.start()") + def stop(self): """Stop PLC python program and plcload.""" + proginit.logger.debug("enter RevPiPyLoad.stop()") + proginit.logger.info("stopping revpipyload") self._exit = True @@ -747,6 +770,7 @@ class RevPiPyLoad(): proginit.logger.debug("stopping revpiplc-thread") self.plc.stop() self.plc.join() + proginit.logger.debug("revpiplc-thread successfully closed") if self.xmlrpc >= 1: proginit.logger.info("shutting down xmlrpc-server") @@ -754,9 +778,11 @@ class RevPiPyLoad(): self.tpe.shutdown() self.xsrv.server_close() + proginit.logger.debug("leave RevPiPyLoad.stop()") + def xml_getconfig(self): """Uebertraegt die RevPiPyLoad Konfiguration. - @returns: dict() der Konfiguration""" + @return dict() der Konfiguration""" proginit.logger.debug("xmlrpc call getconfig") dc = {} dc["autoreload"] = self.autoreload @@ -775,7 +801,7 @@ class RevPiPyLoad(): def xml_getfilelist(self): """Uebertraegt die Dateiliste vom plcworkdir. - @returns: list() mit Dateinamen""" + @return list() mit Dateinamen""" proginit.logger.debug("xmlrpc call getfilelist") lst_file = [] wd = os.walk("./") @@ -786,7 +812,7 @@ class RevPiPyLoad(): def xml_getpictoryrsc(self): """Gibt die config.rsc Datei von piCotry zurueck. - @returns: xmlrpc.client.Binary()""" + @return xmlrpc.client.Binary()""" proginit.logger.debug("xmlrpc call getpictoryrsc") with open(configrsc, "rb") as fh: buff = fh.read() @@ -794,7 +820,7 @@ class RevPiPyLoad(): def xml_getprocimg(self): """Gibt die Rohdaten aus piControl0 zurueck. - @returns: xmlrpc.client.Binary()""" + @return xmlrpc.client.Binary()""" proginit.logger.debug("xmlrpc call getprocimg") with open(procimg, "rb") as fh: buff = fh.read() @@ -803,9 +829,9 @@ class RevPiPyLoad(): def xml_plcdownload(self, mode="tar", pictory=False): """Uebertraegt ein Archiv vom plcworkdir. - @param mode: Archivart 'tar' 'zip' - @param pictory: piCtory Konfiguraiton mit einpacken - @returns: Binary() mit Archivdatei + @param mode Archivart 'tar' 'zip' + @param pictory piCtory Konfiguraiton mit einpacken + @return Binary() mit Archivdatei """ proginit.logger.debug("xmlrpc call plcdownload") @@ -824,7 +850,7 @@ class RevPiPyLoad(): def xml_plcexitcode(self): """Gibt den aktuellen exitcode vom PLC Programm zurueck. - @returns: int() exitcode oder: + @return int() exitcode oder: -1 laeuft noch -2 Datei nicht gefunden -3 Lief nie @@ -840,14 +866,14 @@ class RevPiPyLoad(): def xml_plcrunning(self): """Prueft ob das PLC Programm noch lauft. - @returns: True, wenn das PLC Programm noch lauft""" + @return True, wenn das PLC Programm noch lauft""" proginit.logger.debug("xmlrpc call plcrunning") return False if self.plc is None else self.plc.is_alive() def xml_plcstart(self): """Startet das PLC Programm. - @returns: int() Status: + @return int() Status: -1 Programm lauft noch -2 Datei nicht gefunden @@ -866,7 +892,7 @@ class RevPiPyLoad(): def xml_plcstop(self): """Stoppt das PLC Programm. - @returns: int() Exitcode vom PLC Programm + @return int() Exitcode vom PLC Programm -1 PLC Programm lief nicht """ @@ -874,6 +900,7 @@ class RevPiPyLoad(): if self.plc is not None and self.plc.is_alive(): self.plc.stop() self.plc.join() + proginit.logger.debug("revpiplc-thread successfully closed") return self.plc.exitcode else: return -1 @@ -881,9 +908,9 @@ class RevPiPyLoad(): def xml_plcupload(self, filedata, filename): """Empfaengt Dateien fuer das PLC Programm. - @param filedata: GZIP Binary data der datei - @param filename: Name inkl. Unterverzeichnis der Datei - @returns: Ture, wenn Datei erfolgreich gespeichert wurde + @param filedata GZIP Binary data der datei + @param filename Name inkl. Unterverzeichnis der Datei + @return Ture, wenn Datei erfolgreich gespeichert wurde """ proginit.logger.debug("xmlrpc call plcupload") @@ -913,7 +940,7 @@ class RevPiPyLoad(): def xml_plcuploadclean(self): """Loescht das gesamte plcworkdir Verzeichnis. - @returns: True, wenn erfolgreich""" + @return True, wenn erfolgreich""" proginit.logger.debug("xmlrpc call plcuploadclean") try: rmtree(".", ignore_errors=True) @@ -928,7 +955,7 @@ class RevPiPyLoad(): def xml_setconfig(self, dc, loadnow=False): """Empfaengt die RevPiPyLoad Konfiguration. - @returns: True, wenn erfolgreich angewendet""" + @return True, wenn erfolgreich angewendet""" proginit.logger.debug("xmlrpc call setconfig") keys = { "autoreload": "[01]", @@ -971,9 +998,9 @@ class RevPiPyLoad(): def xml_setpictoryrsc(self, filebytes, reset=False): """Schreibt die config.rsc Datei von piCotry. - @param filebytes: xmlrpc.client.Binary()-Objekt - @param reset: Reset piControl Device - @returns: Statuscode: + @param filebytes xmlrpc.client.Binary()-Objekt + @param reset Reset piControl Device + @return Statuscode: 0 Alles erfolgreich -1 Kann JSON-Datei nicht laden -2 piCtory Elemente in JSON-Datei nicht gefunden @@ -1026,8 +1053,8 @@ class RevPiPyLoad(): return 0 def xml_psstart(self): - """Starten den Prozessabbildserver. - @returns: True, wenn start erfolgreich""" + """Startet den Prozessabbildserver. + @return True, wenn start erfolgreich""" if self.xml_ps is not None: self.xml_ps.start() return True @@ -1036,7 +1063,7 @@ class RevPiPyLoad(): def xml_psstop(self): """Stoppt den Prozessabbildserver. - @returns: True, wenn stop erfolgreich""" + @return True, wenn stop erfolgreich""" if self.xml_ps is not None: self.xml_ps.stop() return True