From 3fe69b54cc8eb6e5bcb0f460f98ad7464b322f8b Mon Sep 17 00:00:00 2001 From: Sven Sager Date: Sat, 27 Feb 2021 15:05:09 +0100 Subject: [PATCH] Parameter for shutdown timeout in seconds for plc program (default is and was 5 seconds) --- data/etc/revpipyload/revpipyload.conf | 1 + revpipyload/plcsystem.py | 15 ++++++++++++++- revpipyload/revpipyload.py | 6 ++++++ setup.py | 2 +- 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/data/etc/revpipyload/revpipyload.conf b/data/etc/revpipyload/revpipyload.conf index 5da9999..403d429 100644 --- a/data/etc/revpipyload/revpipyload.conf +++ b/data/etc/revpipyload/revpipyload.conf @@ -5,6 +5,7 @@ autostart = 1 plcworkdir = /var/lib/revpipyload plcworkdir_set_uid = 1 plcprogram = program.py +plcprogram_stop_timeout = 5 plcprogram_watchdog = 0 plcarguments = plcuid = 1000 diff --git a/revpipyload/plcsystem.py b/revpipyload/plcsystem.py index ca32478..3696c4b 100644 --- a/revpipyload/plcsystem.py +++ b/revpipyload/plcsystem.py @@ -40,6 +40,7 @@ class RevPiPlc(Thread): self._program = program self._procplc = None self._pversion = pversion + self._stop_timeout_steps = 10 self.autoreload = False self.exitcode = None self.gid = 65534 @@ -257,7 +258,7 @@ class RevPiPlc(Thread): proginit.logger.debug("leave RevPiPlc.stop()") return - while self._procplc.poll() is None and count < 10: + while self._procplc.poll() is None and count < self._stop_timeout_steps: count += 1 proginit.logger.info( "wait term plc program {0} seconds".format(count * 0.5) @@ -284,3 +285,15 @@ class RevPiPlc(Thread): proginit.logger.debug("leave RevPiPlc.stop()") autoreloaddelay = property(__get_autoreloaddelay, __set_autoreloaddelay) + + @property + def stop_timeout(self) -> int: + """Get program stop timeout in seconds.""" + return self._stop_timeout_steps // 2 + + @stop_timeout.setter + def stop_timeout(self, value: int): + """Set program stop timeout in seconds.""" + if type(value) != int: + raise TypeError("Value of stop_timeout must be ") + self._stop_timeout_steps = value * 2 diff --git a/revpipyload/revpipyload.py b/revpipyload/revpipyload.py index 6c64aae..312b6b4 100755 --- a/revpipyload/revpipyload.py +++ b/revpipyload/revpipyload.py @@ -220,6 +220,8 @@ class RevPiPyLoad: "plcworkdir", ".") self.plcprogram = self.globalconfig["DEFAULT"].get( "plcprogram", "none.py") + self.plcprogram_stop_timeout = self.globalconfig.getint( + "DEFAULT", "plcprogram_stop_timeout", fallback=5) self.plcprogram_watchdog = self.globalconfig["DEFAULT"].getint( "plcprogram_watchdog", 0) self.plcarguments = self.globalconfig["DEFAULT"].get( @@ -376,6 +378,7 @@ class RevPiPyLoad: self.plc.autoreload = self.autoreload self.plc.autoreloaddelay = self.autoreloaddelay self.plc.softdog.timeout = self.plcprogram_watchdog + self.plc.stop_timeout = self.plcprogram_stop_timeout self.plc.zeroonerror = self.zeroonerror self.plc.zeroonexit = self.zeroonexit @@ -581,6 +584,7 @@ class RevPiPyLoad: th_plc.softdog.address = \ 0 if self.revpi_led_address < 0 else self.revpi_led_address th_plc.softdog.timeout = self.plcprogram_watchdog + th_plc.stop_timeout = self.plcprogram_stop_timeout th_plc.zeroonerror = self.zeroonerror th_plc.zeroonexit = self.zeroonexit @@ -964,6 +968,7 @@ class RevPiPyLoad: dc["plcworkdir"] = self.plcworkdir dc["plcworkdir_set_uid"] = int(self.plcworkdir_set_uid) dc["plcprogram"] = self.plcprogram + dc["plcprogram_stop_timeout"] = self.plcprogram_stop_timeout dc["plcprogram_watchdog"] = self.plcprogram_watchdog dc["plcarguments"] = self.plcarguments dc["plcuid"] = self.plcuid @@ -1253,6 +1258,7 @@ class RevPiPyLoad: "autoreloaddelay": "[0-9]+", "autostart": "[01]", "plcprogram": ".+", + "plcprogram_stop_timeout": "[0-9]+", "plcprogram_watchdog": "[0-9]+", "plcarguments": ".*", "plcworkdir_set_uid": "[01]", diff --git a/setup.py b/setup.py index 754428a..9099175 100644 --- a/setup.py +++ b/setup.py @@ -27,7 +27,7 @@ setup( license="LGPLv3", name="revpipyload", - version="0.9.6", + version="0.9.6a", scripts=[ "data/revpipyload",