XML-RPC is managed by main thread

This commit is contained in:
2020-07-25 17:03:12 +02:00
parent 8f0249673a
commit 735786144e
6 changed files with 27 additions and 52 deletions

View File

@@ -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

View File

@@ -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):

View File

@@ -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.

View File

@@ -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()")

View File

@@ -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):

View File

@@ -27,7 +27,7 @@ setup(
license="LGPLv3", license="LGPLv3",
name="revpipyload", name="revpipyload",
version="0.9.2", version="0.9.2b",
scripts=[ scripts=[
"data/revpipyload", "data/revpipyload",