diff -r a6e7dd8bac36 -r 34da877021d5 runtime/PyroServer.py --- a/runtime/PyroServer.py Sat Dec 09 01:03:43 2023 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,112 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -# This file is part of Beremiz runtime. - -# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD -# Copyright (C) 2017: Andrey Skvortsov -# Copyright (C) 2018: Edouard TISSERANT - -# See COPYING file for copyrights details. - - - -import sys -import os - -import Pyro5 -import Pyro5.server - -import runtime -from runtime.ServicePublisher import ServicePublisher - -Pyro5.config.SERIALIZER = "msgpack" - -def make_pyro_exposed_stub(method_name): - stub = lambda self, *args, **kwargs: \ - getattr(self.plc_object_instance, method_name)(*args, **kwargs) - stub.__name__ = method_name - Pyro5.server.expose(stub) - return stub - - -class PLCObjectPyroAdapter(type("PLCObjectPyroStubs", (), { - name: make_pyro_exposed_stub(name) for name in [ - "AppendChunkToBlob", - "GetLogMessage", - "GetPLCID", - "GetPLCstatus", - "GetTraceVariables", - "MatchMD5", - "NewPLC", - "PurgeBlobs", - "RemoteExec", - "RepairPLC", - "ResetLogCount", - "SeedBlob", - "SetTraceVariablesList", - "StartPLC", - "StopPLC" - ] -})): - def __init__(self, plc_object_instance): - self.plc_object_instance = plc_object_instance - - -class PyroServer(object): - def __init__(self, servicename, ip_addr, port): - self.continueloop = True - self.daemon = None - self.servicename = servicename - self.ip_addr = ip_addr - self.port = port - self.servicepublisher = None - self.piper, self.pipew = None, None - - def _to_be_published(self): - return self.servicename is not None and \ - self.ip_addr not in ["", "localhost", "127.0.0.1"] - - def PrintServerInfo(self): - print(_("Pyro port :"), self.port) - - if self._to_be_published(): - print(_("Publishing service on local network")) - - if sys.stdout: - sys.stdout.flush() - - def PyroLoop(self, when_ready): - if self._to_be_published(): - self.Publish() - - while self.continueloop: - self.daemon = Pyro5.server.Daemon(host=self.ip_addr, port=self.port) - - self.daemon.register(PLCObjectPyroAdapter(runtime.GetPLCObjectSingleton()), "PLCObject") - - when_ready() - - self.daemon.requestLoop() - - self.Unpublish() - - def Restart(self): - self.daemon.shutdown(True) - - def Quit(self): - self.continueloop = False - self.daemon.shutdown() - if not sys.platform.startswith('win'): - if self.pipew is not None: - os.write(self.pipew, "goodbye") - - def Publish(self): - self.servicepublisher = ServicePublisher("PYRO") - self.servicepublisher.RegisterService(self.servicename, - self.ip_addr, self.port) - - def Unpublish(self): - if self.servicepublisher is not None: - self.servicepublisher.UnRegisterService() - self.servicepublisher = None