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"
import os
from json import load, loads
from json import loads
from re import match as rematch
from subprocess import Popen, PIPE

View File

@@ -9,7 +9,7 @@ from threading import Event, Lock, Thread
from xmlrpc.client import Binary
class LogReader():
class LogReader:
"""Ermoeglicht den Zugriff auf die Logdateien.
@@ -112,7 +112,6 @@ class PipeLogwriter(Thread):
@return FileHandler-Objekt"""
proginit.logger.debug("enter PipeLogwriter._configurefh()")
logfile = None
dirname = os.path.dirname(self.logfile)
if os.access(dirname, os.R_OK | os.W_OK):

View File

@@ -14,7 +14,7 @@ import revpimodio2
from xmlrpc.client import Binary
class ProcimgServer():
class ProcimgServer:
"""Serverkomponente fuer zusaetzliche XML-RPC Funktionen.

View File

@@ -56,7 +56,7 @@ from xrpcserver import SaveXMLRPCServer
min_revpimodio = "2.5.0"
class RevPiPyLoad():
class RevPiPyLoad:
"""Hauptklasse, die alle Funktionen zur Verfuegung stellt.
Hier wird die gesamte Konfiguraiton eingelesen und der ggf. aktivierte
@@ -495,8 +495,9 @@ class RevPiPyLoad():
# Neustart bei reload
if not self._exit:
proginit.logger.info("start xmlrpc-server")
self.xsrv.start()
proginit.logger.info("bind xmlrpc-server")
self.xsrv.server_bind()
self.xsrv.server_activate()
# Konfiguration abschließen
self.evt_loadconfig.clear()
@@ -562,8 +563,6 @@ class RevPiPyLoad():
)
return None
th_plc = None
proginit.logger.debug("create PLC program watcher")
th_plc = plcsystem.RevPiPlc(
os.path.join(self.plcworkdir, self.plcprogram),
@@ -774,8 +773,9 @@ class RevPiPyLoad():
self._exit = False
if self.xmlrpc and self.xsrv is not None:
proginit.logger.info("start xmlrpc-server")
self.xsrv.start()
proginit.logger.info("bind xmlrpc-server")
self.xsrv.server_bind()
self.xsrv.server_activate()
# MQTT Uebertragung starten
if self.th_plcmqtt is not None:
@@ -871,7 +871,11 @@ class RevPiPyLoad():
if self.th_plcslave is not None:
self.th_plcslave.start()
self.evt_loadconfig.wait(1)
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)
proginit.logger.info("stopping revpipyload")
@@ -911,8 +915,11 @@ class RevPiPyLoad():
if self.plc is not None and self.plc.is_alive():
proginit.logger.info("stopping revpiplc thread")
self.plc.stop()
self.plc.join()
proginit.logger.debug("revpiplc thread successfully closed")
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("leave RevPiPyLoad.stop_plcprogram()")
@@ -933,8 +940,8 @@ class RevPiPyLoad():
proginit.logger.debug("enter RevPiPyLoad.stop_xmlrpcserver()")
if self.xsrv is not None:
proginit.logger.info("shutting down xmlrpc-server")
self.xsrv.stop()
proginit.logger.info("close xmlrpc-server")
self.xsrv.server_close()
proginit.logger.debug("leave RevPiPyLoad.stop_xmlrpcserver()")

View File

@@ -3,10 +3,11 @@
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
from xmlrpc.server import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler
import proginit
from shared.ipaclmanager import IpAclManager
from concurrent import futures
from xmlrpc.server import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler
class SaveXMLRPCServer(SimpleXMLRPCServer):
@@ -31,6 +32,7 @@ class SaveXMLRPCServer(SimpleXMLRPCServer):
encoding="utf-8",
bind_and_activate=False,
)
self.timeout = 0.5
# Klassenvariablen
if ipacl is None:
@@ -39,8 +41,6 @@ class SaveXMLRPCServer(SimpleXMLRPCServer):
self.aclmgr = ipacl
self.funcacls = {}
self.requestacl = -1
self.tpe = futures.ThreadPoolExecutor(max_workers=1)
self.fut = None
proginit.logger.debug("leave SaveXMLRPCServer.__init__()")
@@ -62,11 +62,6 @@ class SaveXMLRPCServer(SimpleXMLRPCServer):
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):
"""Override register_function to add acl_level.
@@ -83,32 +78,6 @@ class SaveXMLRPCServer(SimpleXMLRPCServer):
self.funcs[name] = function
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):

View File

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