# HG changeset patch # User Goffi # Date 1616360455 -3600 # Node ID d71a163c08617b78919c3d06a7d4d4ca8a075f91 # Parent c80a0f864b5ddd892c1f54bcb5d679b54ac092bb bridge (pb): connection can be set to used either UNIX socket or TCP socket: all settings are to be put in `[DEFAULT]` section - `bridge_pb_connection_type` can be set to `unix_socket` or `socket` - for `socket`, `bridge_pb_host` and `bridge_pb_port` can be specified diff -r c80a0f864b5d -r d71a163c0861 sat/bridge/bridge_constructor/constructors/pb/pb_core_template.py --- a/sat/bridge/bridge_constructor/constructors/pb/pb_core_template.py Sun Mar 21 18:23:58 2021 +0100 +++ b/sat/bridge/bridge_constructor/constructors/pb/pb_core_template.py Sun Mar 21 22:00:55 2021 +0100 @@ -19,9 +19,11 @@ import dataclasses -from sat.core.log import getLogger +from pathlib import Path from twisted.spread import jelly, pb from twisted.internet import reactor +from sat.core.log import getLogger +from sat.tools import config log = getLogger(__name__) @@ -103,7 +105,31 @@ def __init__(self): log.info("Init Perspective Broker...") self.root = PBRoot() - reactor.listenTCP(8789, pb.PBServerFactory(self.root)) + conf = config.parseMainConf() + conn_type = config.getConfig( + conf, + "", + "bridge_pb_connection_type", + "unix_socket" + ) + if conn_type == "unix_socket": + local_dir = Path(config.getConfig(conf, "", "local_dir")).resolve() + socket_path = local_dir / "bridge_pb" + log.info(f"using UNIX Socket at {socket_path}") + reactor.listenUNIX( + str(socket_path), pb.PBServerFactory(self.root), mode=0o600 + ) + elif conn_type == "socket": + port = int(config.getConfig( + conf, + "", + "bridge_pb_port", + 8789 + )) + log.info(f"using TCP Socket at port {port}") + reactor.listenTCP(port, pb.PBServerFactory(self.root)) + else: + raise ValueError(f"Unknown pb connection type: {conn_type!r}") def sendSignal(self, name, *args, **kwargs): self.root.sendSignal(name, args, kwargs) @@ -117,7 +143,9 @@ setattr(self.root, "remote_" + name, callback) #  self.root.register_method(name, callback) - def addMethod(self, name, int_suffix, in_sign, out_sign, method, async_=False, doc={}): + def addMethod( + self, name, int_suffix, in_sign, out_sign, method, async_=False, doc={} + ): """Dynamically add a method to PB Bridge""" # FIXME: doc parameter is kept only temporary, the time to remove it from calls log.debug("Adding method {name} to PB bridge".format(name=name)) diff -r c80a0f864b5d -r d71a163c0861 sat/bridge/bridge_constructor/constructors/pb/pb_frontend_template.py --- a/sat/bridge/bridge_constructor/constructors/pb/pb_frontend_template.py Sun Mar 21 18:23:58 2021 +0100 +++ b/sat/bridge/bridge_constructor/constructors/pb/pb_frontend_template.py Sun Mar 21 22:00:55 2021 +0100 @@ -17,12 +17,14 @@ # along with this program. If not, see . import asyncio +from logging import getLogger from functools import partial +from pathlib import Path from twisted.spread import pb from twisted.internet import reactor, defer -from twisted.internet.error import ConnectionRefusedError -from logging import getLogger +from twisted.internet.error import ConnectionRefusedError, ConnectError from sat.core import exceptions +from sat.tools import config from sat_frontends.bridge.bridge_frontend import BridgeException log = getLogger(__name__) @@ -130,14 +132,40 @@ def getRootObjectEb(self, failure_): """Call errback with appropriate bridge error""" - if failure_.check(ConnectionRefusedError): + if failure_.check(ConnectionRefusedError, ConnectError): raise exceptions.BridgeExceptionNoService else: raise failure_ def bridgeConnect(self, callback, errback): factory = pb.PBClientFactory() - reactor.connectTCP("localhost", 8789, factory) + conf = config.parseMainConf() + conn_type = config.getConfig( + conf, + "", + "bridge_pb_connection_type", + "unix_socket" + ) + if conn_type == "unix_socket": + local_dir = Path(config.getConfig(conf, "", "local_dir")).resolve() + socket_path = local_dir / "bridge_pb" + reactor.connectUNIX(str(socket_path), factory) + elif conn_type == "socket": + host = int(config.getConfig( + conf, + "", + "bridge_pb_host", + "localhost" + )) + port = int(config.getConfig( + conf, + "", + "bridge_pb_port", + 8789 + )) + reactor.connectTCP(host, port, factory) + else: + raise ValueError(f"Unknown pb connection type: {conn_type!r}") d = factory.getRootObject() d.addCallback(self._set_root) if callback is not None: diff -r c80a0f864b5d -r d71a163c0861 sat/bridge/pb.py --- a/sat/bridge/pb.py Sun Mar 21 18:23:58 2021 +0100 +++ b/sat/bridge/pb.py Sun Mar 21 22:00:55 2021 +0100 @@ -19,9 +19,11 @@ import dataclasses -from sat.core.log import getLogger +from pathlib import Path from twisted.spread import jelly, pb from twisted.internet import reactor +from sat.core.log import getLogger +from sat.tools import config log = getLogger(__name__) @@ -103,7 +105,31 @@ def __init__(self): log.info("Init Perspective Broker...") self.root = PBRoot() - reactor.listenTCP(8789, pb.PBServerFactory(self.root)) + conf = config.parseMainConf() + conn_type = config.getConfig( + conf, + "", + "bridge_pb_connection_type", + "unix_socket" + ) + if conn_type == "unix_socket": + local_dir = Path(config.getConfig(conf, "", "local_dir")).resolve() + socket_path = local_dir / "bridge_pb" + log.info(f"using UNIX Socket at {socket_path}") + reactor.listenUNIX( + str(socket_path), pb.PBServerFactory(self.root), mode=0o600 + ) + elif conn_type == "socket": + port = int(config.getConfig( + conf, + "", + "bridge_pb_port", + 8789 + )) + log.info(f"using TCP Socket at port {port}") + reactor.listenTCP(port, pb.PBServerFactory(self.root)) + else: + raise ValueError(f"Unknown pb connection type: {conn_type!r}") def sendSignal(self, name, *args, **kwargs): self.root.sendSignal(name, args, kwargs) @@ -117,7 +143,9 @@ setattr(self.root, "remote_" + name, callback) #  self.root.register_method(name, callback) - def addMethod(self, name, int_suffix, in_sign, out_sign, method, async_=False, doc={}): + def addMethod( + self, name, int_suffix, in_sign, out_sign, method, async_=False, doc={} + ): """Dynamically add a method to PB Bridge""" # FIXME: doc parameter is kept only temporary, the time to remove it from calls log.debug("Adding method {name} to PB bridge".format(name=name)) diff -r c80a0f864b5d -r d71a163c0861 sat_frontends/bridge/pb.py --- a/sat_frontends/bridge/pb.py Sun Mar 21 18:23:58 2021 +0100 +++ b/sat_frontends/bridge/pb.py Sun Mar 21 22:00:55 2021 +0100 @@ -17,12 +17,14 @@ # along with this program. If not, see . import asyncio +from logging import getLogger from functools import partial +from pathlib import Path from twisted.spread import pb from twisted.internet import reactor, defer -from twisted.internet.error import ConnectionRefusedError -from logging import getLogger +from twisted.internet.error import ConnectionRefusedError, ConnectError from sat.core import exceptions +from sat.tools import config from sat_frontends.bridge.bridge_frontend import BridgeException log = getLogger(__name__) @@ -130,14 +132,40 @@ def getRootObjectEb(self, failure_): """Call errback with appropriate bridge error""" - if failure_.check(ConnectionRefusedError): + if failure_.check(ConnectionRefusedError, ConnectError): raise exceptions.BridgeExceptionNoService else: raise failure_ def bridgeConnect(self, callback, errback): factory = pb.PBClientFactory() - reactor.connectTCP("localhost", 8789, factory) + conf = config.parseMainConf() + conn_type = config.getConfig( + conf, + "", + "bridge_pb_connection_type", + "unix_socket" + ) + if conn_type == "unix_socket": + local_dir = Path(config.getConfig(conf, "", "local_dir")).resolve() + socket_path = local_dir / "bridge_pb" + reactor.connectUNIX(str(socket_path), factory) + elif conn_type == "socket": + host = int(config.getConfig( + conf, + "", + "bridge_pb_host", + "localhost" + )) + port = int(config.getConfig( + conf, + "", + "bridge_pb_port", + 8789 + )) + reactor.connectTCP(host, port, factory) + else: + raise ValueError(f"Unknown pb connection type: {conn_type!r}") d = factory.getRootObject() d.addCallback(self._set_root) if callback is not None: