mirror of
https://github.com/naruxde/revpipyload.git
synced 2025-11-08 15:13:52 +01:00
XML-RPC is managed by main thread
This commit is contained in:
@@ -5,7 +5,7 @@ __copyright__ = "Copyright (C) 2020 Sven Sager"
|
|||||||
__license__ = "GPLv3"
|
__license__ = "GPLv3"
|
||||||
|
|
||||||
import os
|
import os
|
||||||
from json import load, loads
|
from json import loads
|
||||||
from re import match as rematch
|
from re import match as rematch
|
||||||
from subprocess import Popen, PIPE
|
from subprocess import Popen, PIPE
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ from threading import Event, Lock, Thread
|
|||||||
from xmlrpc.client import Binary
|
from xmlrpc.client import Binary
|
||||||
|
|
||||||
|
|
||||||
class LogReader():
|
class LogReader:
|
||||||
|
|
||||||
"""Ermoeglicht den Zugriff auf die Logdateien.
|
"""Ermoeglicht den Zugriff auf die Logdateien.
|
||||||
|
|
||||||
@@ -112,7 +112,6 @@ class PipeLogwriter(Thread):
|
|||||||
@return FileHandler-Objekt"""
|
@return FileHandler-Objekt"""
|
||||||
proginit.logger.debug("enter PipeLogwriter._configurefh()")
|
proginit.logger.debug("enter PipeLogwriter._configurefh()")
|
||||||
|
|
||||||
logfile = None
|
|
||||||
dirname = os.path.dirname(self.logfile)
|
dirname = os.path.dirname(self.logfile)
|
||||||
|
|
||||||
if os.access(dirname, os.R_OK | os.W_OK):
|
if os.access(dirname, os.R_OK | os.W_OK):
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import revpimodio2
|
|||||||
from xmlrpc.client import Binary
|
from xmlrpc.client import Binary
|
||||||
|
|
||||||
|
|
||||||
class ProcimgServer():
|
class ProcimgServer:
|
||||||
|
|
||||||
"""Serverkomponente fuer zusaetzliche XML-RPC Funktionen.
|
"""Serverkomponente fuer zusaetzliche XML-RPC Funktionen.
|
||||||
|
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ from xrpcserver import SaveXMLRPCServer
|
|||||||
min_revpimodio = "2.5.0"
|
min_revpimodio = "2.5.0"
|
||||||
|
|
||||||
|
|
||||||
class RevPiPyLoad():
|
class RevPiPyLoad:
|
||||||
"""Hauptklasse, die alle Funktionen zur Verfuegung stellt.
|
"""Hauptklasse, die alle Funktionen zur Verfuegung stellt.
|
||||||
|
|
||||||
Hier wird die gesamte Konfiguraiton eingelesen und der ggf. aktivierte
|
Hier wird die gesamte Konfiguraiton eingelesen und der ggf. aktivierte
|
||||||
@@ -495,8 +495,9 @@ class RevPiPyLoad():
|
|||||||
|
|
||||||
# Neustart bei reload
|
# Neustart bei reload
|
||||||
if not self._exit:
|
if not self._exit:
|
||||||
proginit.logger.info("start xmlrpc-server")
|
proginit.logger.info("bind xmlrpc-server")
|
||||||
self.xsrv.start()
|
self.xsrv.server_bind()
|
||||||
|
self.xsrv.server_activate()
|
||||||
|
|
||||||
# Konfiguration abschließen
|
# Konfiguration abschließen
|
||||||
self.evt_loadconfig.clear()
|
self.evt_loadconfig.clear()
|
||||||
@@ -562,8 +563,6 @@ class RevPiPyLoad():
|
|||||||
)
|
)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
th_plc = None
|
|
||||||
|
|
||||||
proginit.logger.debug("create PLC program watcher")
|
proginit.logger.debug("create PLC program watcher")
|
||||||
th_plc = plcsystem.RevPiPlc(
|
th_plc = plcsystem.RevPiPlc(
|
||||||
os.path.join(self.plcworkdir, self.plcprogram),
|
os.path.join(self.plcworkdir, self.plcprogram),
|
||||||
@@ -774,8 +773,9 @@ class RevPiPyLoad():
|
|||||||
self._exit = False
|
self._exit = False
|
||||||
|
|
||||||
if self.xmlrpc and self.xsrv is not None:
|
if self.xmlrpc and self.xsrv is not None:
|
||||||
proginit.logger.info("start xmlrpc-server")
|
proginit.logger.info("bind xmlrpc-server")
|
||||||
self.xsrv.start()
|
self.xsrv.server_bind()
|
||||||
|
self.xsrv.server_activate()
|
||||||
|
|
||||||
# MQTT Uebertragung starten
|
# MQTT Uebertragung starten
|
||||||
if self.th_plcmqtt is not None:
|
if self.th_plcmqtt is not None:
|
||||||
@@ -871,6 +871,10 @@ class RevPiPyLoad():
|
|||||||
if self.th_plcslave is not None:
|
if self.th_plcslave is not None:
|
||||||
self.th_plcslave.start()
|
self.th_plcslave.start()
|
||||||
|
|
||||||
|
if self.xmlrpc and self.xsrv is not None:
|
||||||
|
# Wort xml calls in same thread or wait till timeout
|
||||||
|
self.xsrv.handle_request()
|
||||||
|
else:
|
||||||
self.evt_loadconfig.wait(1)
|
self.evt_loadconfig.wait(1)
|
||||||
|
|
||||||
proginit.logger.info("stopping revpipyload")
|
proginit.logger.info("stopping revpipyload")
|
||||||
@@ -911,7 +915,10 @@ class RevPiPyLoad():
|
|||||||
if self.plc is not None and self.plc.is_alive():
|
if self.plc is not None and self.plc.is_alive():
|
||||||
proginit.logger.info("stopping revpiplc thread")
|
proginit.logger.info("stopping revpiplc thread")
|
||||||
self.plc.stop()
|
self.plc.stop()
|
||||||
self.plc.join()
|
self.plc.join(5.0)
|
||||||
|
if self.plc.is_alive():
|
||||||
|
proginit.logger.warning("revpiplc thread not closed")
|
||||||
|
else:
|
||||||
proginit.logger.debug("revpiplc thread successfully closed")
|
proginit.logger.debug("revpiplc thread successfully closed")
|
||||||
|
|
||||||
proginit.logger.debug("leave RevPiPyLoad.stop_plcprogram()")
|
proginit.logger.debug("leave RevPiPyLoad.stop_plcprogram()")
|
||||||
@@ -933,8 +940,8 @@ class RevPiPyLoad():
|
|||||||
proginit.logger.debug("enter RevPiPyLoad.stop_xmlrpcserver()")
|
proginit.logger.debug("enter RevPiPyLoad.stop_xmlrpcserver()")
|
||||||
|
|
||||||
if self.xsrv is not None:
|
if self.xsrv is not None:
|
||||||
proginit.logger.info("shutting down xmlrpc-server")
|
proginit.logger.info("close xmlrpc-server")
|
||||||
self.xsrv.stop()
|
self.xsrv.server_close()
|
||||||
|
|
||||||
proginit.logger.debug("leave RevPiPyLoad.stop_xmlrpcserver()")
|
proginit.logger.debug("leave RevPiPyLoad.stop_xmlrpcserver()")
|
||||||
|
|
||||||
|
|||||||
@@ -3,10 +3,11 @@
|
|||||||
__author__ = "Sven Sager"
|
__author__ = "Sven Sager"
|
||||||
__copyright__ = "Copyright (C) 2018 Sven Sager"
|
__copyright__ = "Copyright (C) 2018 Sven Sager"
|
||||||
__license__ = "GPLv3"
|
__license__ = "GPLv3"
|
||||||
|
|
||||||
|
from xmlrpc.server import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler
|
||||||
|
|
||||||
import proginit
|
import proginit
|
||||||
from shared.ipaclmanager import IpAclManager
|
from shared.ipaclmanager import IpAclManager
|
||||||
from concurrent import futures
|
|
||||||
from xmlrpc.server import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler
|
|
||||||
|
|
||||||
|
|
||||||
class SaveXMLRPCServer(SimpleXMLRPCServer):
|
class SaveXMLRPCServer(SimpleXMLRPCServer):
|
||||||
@@ -31,6 +32,7 @@ class SaveXMLRPCServer(SimpleXMLRPCServer):
|
|||||||
encoding="utf-8",
|
encoding="utf-8",
|
||||||
bind_and_activate=False,
|
bind_and_activate=False,
|
||||||
)
|
)
|
||||||
|
self.timeout = 0.5
|
||||||
|
|
||||||
# Klassenvariablen
|
# Klassenvariablen
|
||||||
if ipacl is None:
|
if ipacl is None:
|
||||||
@@ -39,8 +41,6 @@ class SaveXMLRPCServer(SimpleXMLRPCServer):
|
|||||||
self.aclmgr = ipacl
|
self.aclmgr = ipacl
|
||||||
self.funcacls = {}
|
self.funcacls = {}
|
||||||
self.requestacl = -1
|
self.requestacl = -1
|
||||||
self.tpe = futures.ThreadPoolExecutor(max_workers=1)
|
|
||||||
self.fut = None
|
|
||||||
|
|
||||||
proginit.logger.debug("leave SaveXMLRPCServer.__init__()")
|
proginit.logger.debug("leave SaveXMLRPCServer.__init__()")
|
||||||
|
|
||||||
@@ -62,11 +62,6 @@ class SaveXMLRPCServer(SimpleXMLRPCServer):
|
|||||||
|
|
||||||
return super()._dispatch(method, params)
|
return super()._dispatch(method, params)
|
||||||
|
|
||||||
def is_alive(self):
|
|
||||||
"""Prueft ob der XML RPC Server laeuft.
|
|
||||||
@return True, wenn Server noch laeuft"""
|
|
||||||
return False if self.fut is None else self.fut.running()
|
|
||||||
|
|
||||||
def register_function(self, acl_level, function, name=None):
|
def register_function(self, acl_level, function, name=None):
|
||||||
"""Override register_function to add acl_level.
|
"""Override register_function to add acl_level.
|
||||||
|
|
||||||
@@ -83,32 +78,6 @@ class SaveXMLRPCServer(SimpleXMLRPCServer):
|
|||||||
self.funcs[name] = function
|
self.funcs[name] = function
|
||||||
self.funcacls[name] = acl_level
|
self.funcacls[name] = acl_level
|
||||||
|
|
||||||
def start(self):
|
|
||||||
"""Startet den XML-RPC Server."""
|
|
||||||
proginit.logger.debug("enter SaveXMLRPCServer.start()")
|
|
||||||
|
|
||||||
if self.fut is None:
|
|
||||||
self.server_bind()
|
|
||||||
self.server_activate()
|
|
||||||
self.fut = self.tpe.submit(self.serve_forever)
|
|
||||||
else:
|
|
||||||
raise RuntimeError("savexmlrpcservers can only be started once")
|
|
||||||
|
|
||||||
proginit.logger.debug("leave SaveXMLRPCServer.start()")
|
|
||||||
|
|
||||||
def stop(self):
|
|
||||||
"""Stoppt den XML-RPC Server."""
|
|
||||||
proginit.logger.debug("enter SaveXMLRPCServer.stop()")
|
|
||||||
|
|
||||||
if self.fut is not None:
|
|
||||||
self.shutdown()
|
|
||||||
self.tpe.shutdown()
|
|
||||||
self.server_close()
|
|
||||||
else:
|
|
||||||
raise RuntimeError("save xml rpc server was not started")
|
|
||||||
|
|
||||||
proginit.logger.debug("leave SaveXMLRPCServer.stop()")
|
|
||||||
|
|
||||||
|
|
||||||
class SaveXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
class SaveXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user