changeset 3634:3c7a64d6f49f

bridge: bridge can now be set using environment variable: The `LIBERVIA_BRIDGE_NAME` environment variable can now be used to specify the bridge to use. If set and different from empty string, the environment has precedence over config file value. For `pb` bridge, the following environment variable can also be used: - LIBERVIA_BRIDGE_PB_CONNECTION_TYPE - LIBERVIA_BRIDGE_PB_HOST - LIBERVIA_BRIDGE_PB_PORT
author Goffi <goffi@goffi.org>
date Sat, 28 Aug 2021 15:26:02 +0200
parents 7acf19bdca2f
children 7bc443253b7c 43542cf32e5a
files sat/bridge/bridge_constructor/constructors/pb/pb_core_template.py sat/bridge/bridge_constructor/constructors/pb/pb_frontend_template.py sat/bridge/pb.py sat/core/sat_main.py sat/tools/config.py sat_frontends/bridge/pb.py
diffstat 6 files changed, 47 insertions(+), 61 deletions(-) [+]
line wrap: on
line diff
--- a/sat/bridge/bridge_constructor/constructors/pb/pb_core_template.py	Fri Aug 27 14:59:47 2021 +0200
+++ b/sat/bridge/bridge_constructor/constructors/pb/pb_core_template.py	Sat Aug 28 15:26:02 2021 +0200
@@ -19,6 +19,7 @@
 
 
 import dataclasses
+from functools import partial
 from pathlib import Path
 from twisted.spread import jelly, pb
 from twisted.internet import reactor
@@ -106,12 +107,8 @@
         log.info("Init Perspective Broker...")
         self.root = PBRoot()
         conf = config.parseMainConf()
-        conn_type = config.getConfig(
-            conf,
-            "",
-            "bridge_pb_connection_type",
-            "unix_socket"
-        )
+        getConf = partial(config.getConf, conf, "bridge_pb", "")
+        conn_type = getConf("connection_type", "unix_socket")
         if conn_type == "unix_socket":
             local_dir = Path(config.getConfig(conf, "", "local_dir")).resolve()
             socket_path = local_dir / "bridge_pb"
@@ -120,12 +117,7 @@
                 str(socket_path), pb.PBServerFactory(self.root), mode=0o600
             )
         elif conn_type == "socket":
-            port = int(config.getConfig(
-                conf,
-                "",
-                "bridge_pb_port",
-                8789
-            ))
+            port = int(getConf("port", 8789))
             log.info(f"using TCP Socket at port {port}")
             reactor.listenTCP(port, pb.PBServerFactory(self.root))
         else:
--- a/sat/bridge/bridge_constructor/constructors/pb/pb_frontend_template.py	Fri Aug 27 14:59:47 2021 +0200
+++ b/sat/bridge/bridge_constructor/constructors/pb/pb_frontend_template.py	Sat Aug 28 15:26:02 2021 +0200
@@ -140,29 +140,15 @@
     def bridgeConnect(self, callback, errback):
         factory = pb.PBClientFactory()
         conf = config.parseMainConf()
-        conn_type = config.getConfig(
-            conf,
-            "",
-            "bridge_pb_connection_type",
-            "unix_socket"
-        )
+        getConf = partial(config.getConf, conf, "bridge_pb", "")
+        conn_type = getConf("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
-            ))
+            host = getConf("host", "localhost")
+            port = int(getConf("port", 8789))
             reactor.connectTCP(host, port, factory)
         else:
             raise ValueError(f"Unknown pb connection type: {conn_type!r}")
--- a/sat/bridge/pb.py	Fri Aug 27 14:59:47 2021 +0200
+++ b/sat/bridge/pb.py	Sat Aug 28 15:26:02 2021 +0200
@@ -19,6 +19,7 @@
 
 
 import dataclasses
+from functools import partial
 from pathlib import Path
 from twisted.spread import jelly, pb
 from twisted.internet import reactor
@@ -106,12 +107,8 @@
         log.info("Init Perspective Broker...")
         self.root = PBRoot()
         conf = config.parseMainConf()
-        conn_type = config.getConfig(
-            conf,
-            "",
-            "bridge_pb_connection_type",
-            "unix_socket"
-        )
+        getConf = partial(config.getConf, conf, "bridge_pb", "")
+        conn_type = getConf("connection_type", "unix_socket")
         if conn_type == "unix_socket":
             local_dir = Path(config.getConfig(conf, "", "local_dir")).resolve()
             socket_path = local_dir / "bridge_pb"
@@ -120,12 +117,7 @@
                 str(socket_path), pb.PBServerFactory(self.root), mode=0o600
             )
         elif conn_type == "socket":
-            port = int(config.getConfig(
-                conf,
-                "",
-                "bridge_pb_port",
-                8789
-            ))
+            port = int(getConf("port", 8789))
             log.info(f"using TCP Socket at port {port}")
             reactor.listenTCP(port, pb.PBServerFactory(self.root))
         else:
--- a/sat/core/sat_main.py	Fri Aug 27 14:59:47 2021 +0200
+++ b/sat/core/sat_main.py	Sat Aug 28 15:26:02 2021 +0200
@@ -85,7 +85,10 @@
             trigger.TriggerManager()
         )
 
-        bridge_name = self.memory.getConfig("", "bridge", "dbus")
+        bridge_name = (
+            os.getenv("LIBERVIA_BRIDGE_NAME")
+            or self.memory.getConfig("", "bridge", "dbus")
+        )
 
         bridge_module = dynamic_import.bridge(bridge_name)
         if bridge_module is None:
--- a/sat/tools/config.py	Fri Aug 27 14:59:47 2021 +0200
+++ b/sat/tools/config.py	Sat Aug 28 15:26:02 2021 +0200
@@ -23,6 +23,7 @@
 import os
 import csv
 import json
+from typing import Any
 from configparser import ConfigParser, DEFAULTSECT, NoOptionError, NoSectionError
 from xdg import BaseDirectory
 from sat.core.log import getLogger
@@ -142,3 +143,29 @@
         except ValueError as e:
             raise exceptions.ParsingError("Error while parsing data: {}".format(e))
     return value
+
+
+def getConf(
+    conf: ConfigParser,
+    prefix: str,
+    section: str,
+    name: str,
+    default: Any
+) -> Any:
+    """Get configuration value from environment or config file
+
+    @param str: prefix to use for the varilable name (see `name` below)
+    @param section: config section to use
+    @param name: unsuffixed name.
+        For environment variable, `LIBERVIA_<prefix>_` will be prefixed (and name
+        will be set to uppercase).
+        For config file, `<prefix>_` will be prefixed (and DEFAULT section will be
+        used).
+        Environment variable has priority over config values. If Environment variable
+        is set but empty string, config value will be used.
+    @param default: default value to use if varilable is set neither in environment,
+    nor in config
+    """
+    # XXX: This is a temporary method until parameters are refactored
+    value = os.getenv(f"LIBERVIA_{prefix}_{name}".upper())
+    return value or getConfig(conf, section, f"{prefix}_{name}", default)
--- a/sat_frontends/bridge/pb.py	Fri Aug 27 14:59:47 2021 +0200
+++ b/sat_frontends/bridge/pb.py	Sat Aug 28 15:26:02 2021 +0200
@@ -140,29 +140,15 @@
     def bridgeConnect(self, callback, errback):
         factory = pb.PBClientFactory()
         conf = config.parseMainConf()
-        conn_type = config.getConfig(
-            conf,
-            "",
-            "bridge_pb_connection_type",
-            "unix_socket"
-        )
+        getConf = partial(config.getConf, conf, "bridge_pb", "")
+        conn_type = getConf("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
-            ))
+            host = getConf("host", "localhost")
+            port = int(getConf("port", 8789))
             reactor.connectTCP(host, port, factory)
         else:
             raise ValueError(f"Unknown pb connection type: {conn_type!r}")