From a762af035ac77a263485cd85189212daea8cd188 Mon Sep 17 00:00:00 2001 From: Mark Qvist Date: Thu, 21 Nov 2024 14:41:22 +0100 Subject: [PATCH] Prepare interface modularity --- RNS/Interfaces/AX25KISSInterface.py | 2 +- RNS/Interfaces/Android/KISSInterface.py | 2 +- RNS/Interfaces/Android/RNodeInterface.py | 2 +- RNS/Interfaces/Android/SerialInterface.py | 2 +- RNS/Interfaces/AutoInterface.py | 4 ++-- RNS/Interfaces/I2PInterface.py | 8 ++++---- RNS/Interfaces/Interface.py | 14 +++++++++++++- RNS/Interfaces/KISSInterface.py | 2 +- RNS/Interfaces/PipeInterface.py | 2 +- RNS/Interfaces/RNodeInterface.py | 22 +++++++++++----------- RNS/Interfaces/RNodeMultiInterface.py | 2 +- RNS/Interfaces/SerialInterface.py | 2 +- RNS/Interfaces/TCPInterface.py | 8 ++++---- RNS/Interfaces/UDPInterface.py | 2 +- 14 files changed, 43 insertions(+), 31 deletions(-) diff --git a/RNS/Interfaces/AX25KISSInterface.py b/RNS/Interfaces/AX25KISSInterface.py index 964cd68..04acb89 100644 --- a/RNS/Interfaces/AX25KISSInterface.py +++ b/RNS/Interfaces/AX25KISSInterface.py @@ -80,7 +80,7 @@ class AX25KISSInterface(Interface): super().__init__() - c = configuration + c = Interface.get_config_obj(configuration) name = c["name"] preamble = int(c["preamble"]) if "preamble" in c else None txtail = int(c["txtail"]) if "txtail" in c else None diff --git a/RNS/Interfaces/Android/KISSInterface.py b/RNS/Interfaces/Android/KISSInterface.py index 704c9ea..012d1be 100644 --- a/RNS/Interfaces/Android/KISSInterface.py +++ b/RNS/Interfaces/Android/KISSInterface.py @@ -85,7 +85,7 @@ class KISSInterface(Interface): super().__init__() - c = configuration + c = Interface.get_config_obj(configuration) name = c["name"] preamble = int(c["preamble"]) if "preamble" in c else None txtail = int(c["txtail"]) if "txtail" in c else None diff --git a/RNS/Interfaces/Android/RNodeInterface.py b/RNS/Interfaces/Android/RNodeInterface.py index 8a1a9b9..21f328c 100644 --- a/RNS/Interfaces/Android/RNodeInterface.py +++ b/RNS/Interfaces/Android/RNodeInterface.py @@ -343,7 +343,7 @@ class RNodeInterface(Interface): def __init__(self, owner, configuration): - c = configuration + c = Interface.get_config_obj(configuration) name = c["name"] allow_bluetooth = c["allow_bluetooth"] target_device_name = c["target_device_name"] diff --git a/RNS/Interfaces/Android/SerialInterface.py b/RNS/Interfaces/Android/SerialInterface.py index 6d24386..048cd33 100644 --- a/RNS/Interfaces/Android/SerialInterface.py +++ b/RNS/Interfaces/Android/SerialInterface.py @@ -75,7 +75,7 @@ class SerialInterface(Interface): super().__init__() - c = configuration + c = Interface.get_config_obj(configuration) name = c["name"] port = c["port"] if "port" in c else None speed = int(c["speed"]) if "speed" in c else 9600 diff --git a/RNS/Interfaces/AutoInterface.py b/RNS/Interfaces/AutoInterface.py index 788345c..5b922a2 100644 --- a/RNS/Interfaces/AutoInterface.py +++ b/RNS/Interfaces/AutoInterface.py @@ -88,7 +88,7 @@ class AutoInterface(Interface): return socket.if_nametoindex(ifname) def __init__(self, owner, configuration): - c = configuration + c = Interface.get_config_obj(configuration) name = c["name"] group_id = c["group_id"] if "group_id" in c else None discovery_scope = c["discovery_scope"] if "discovery_scope" in c else None @@ -97,7 +97,7 @@ class AutoInterface(Interface): data_port = int(c["data_port"]) if "data_port" in c else None allowed_interfaces = c.as_list("devices") if "devices" in c else None ignored_interfaces = c.as_list("ignored_devices") if "ignored_devices" in c else None - configured_bitrate = c["configured_bitrate"] + configured_bitrate = c["configured_bitrate"] if "configured_bitrate" in c else None from RNS.vendor.ifaddr import niwrapper super().__init__() diff --git a/RNS/Interfaces/I2PInterface.py b/RNS/Interfaces/I2PInterface.py index 9f3384e..945007b 100644 --- a/RNS/Interfaces/I2PInterface.py +++ b/RNS/Interfaces/I2PInterface.py @@ -834,14 +834,14 @@ class I2PInterface(Interface): def __init__(self, owner, configuration): super().__init__() - c = configuration + c = Interface.get_config_obj(configuration) name = c["name"] rns_storagepath = c["storagepath"] peers = c.as_list("peers") if "peers" in c else None connectable = c.as_bool("connectable") if "connectable" in c else False - ifac_size = c["ifac_size"] - ifac_netname = c["ifac_netname"] - ifac_netkey = c["ifac_netkey"] + ifac_size = c["ifac_size"] if "ifac_size" in c else None + ifac_netname = c["ifac_netname"] if "ifac_netname" in c else None + ifac_netkey = c["ifac_netkey"] if "ifac_netkey" in c else None self.HW_MTU = 1064 diff --git a/RNS/Interfaces/Interface.py b/RNS/Interfaces/Interface.py index eb987a2..26e35f6 100755 --- a/RNS/Interfaces/Interface.py +++ b/RNS/Interfaces/Interface.py @@ -24,6 +24,7 @@ import RNS import time import threading from collections import deque +from RNS.vendor.configobj import ConfigObj class Interface: IN = False @@ -238,4 +239,15 @@ class Interface: RNS.log("The announce queue for this interface has been cleared.", RNS.LOG_ERROR) def detach(self): - pass \ No newline at end of file + pass + + @staticmethod + def get_config_obj(config_in): + if type(config_in) == ConfigObj: + return config_in + else: + try: + return ConfigObj(config_in) + except Exception as e: + RNS.log(f"Could not parse supplied configuration data. The contained exception was: {e}", RNS.LOG_ERROR) + raise SystemError("Invalid configuration data supplied") \ No newline at end of file diff --git a/RNS/Interfaces/KISSInterface.py b/RNS/Interfaces/KISSInterface.py index fb9b307..4d8c73c 100644 --- a/RNS/Interfaces/KISSInterface.py +++ b/RNS/Interfaces/KISSInterface.py @@ -73,7 +73,7 @@ class KISSInterface(Interface): super().__init__() - c = configuration + c = Interface.get_config_obj(configuration) name = c["name"] preamble = int(c["preamble"]) if "preamble" in c else None txtail = int(c["txtail"]) if "txtail" in c else None diff --git a/RNS/Interfaces/PipeInterface.py b/RNS/Interfaces/PipeInterface.py index 296d195..056f870 100644 --- a/RNS/Interfaces/PipeInterface.py +++ b/RNS/Interfaces/PipeInterface.py @@ -54,7 +54,7 @@ class PipeInterface(Interface): def __init__(self, owner, configuration): super().__init__() - c = configuration + c = Interface.get_config_obj(configuration) name = c["name"] command = c["command"] if "command" in c else None respawn_delay = c.as_float("respawn_delay") if "respawn_delay" in c else None diff --git a/RNS/Interfaces/RNodeInterface.py b/RNS/Interfaces/RNodeInterface.py index 40aca4f..5db9f78 100644 --- a/RNS/Interfaces/RNodeInterface.py +++ b/RNS/Interfaces/RNodeInterface.py @@ -132,18 +132,18 @@ class RNodeInterface(Interface): super().__init__() - c = configuration - name = c["name"] - frequency = int(c["frequency"]) if "frequency" in c else None - bandwidth = int(c["bandwidth"]) if "bandwidth" in c else None - txpower = int(c["txpower"]) if "txpower" in c else None - sf = int(c["spreadingfactor"]) if "spreadingfactor" in c else None - cr = int(c["codingrate"]) if "codingrate" in c else None + c = Interface.get_config_obj(configuration) + name = c["name"] + frequency = int(c["frequency"]) if "frequency" in c else None + bandwidth = int(c["bandwidth"]) if "bandwidth" in c else None + txpower = int(c["txpower"]) if "txpower" in c else None + sf = int(c["spreadingfactor"]) if "spreadingfactor" in c else None + cr = int(c["codingrate"]) if "codingrate" in c else None flow_control = c.as_bool("flow_control") if "flow_control" in c else False - id_interval = int(c["id_interval"]) if "id_interval" in c else None - id_callsign = c["id_callsign"] if "id_callsign" in c else None - st_alock = float(c["airtime_limit_short"]) if "airtime_limit_short" in c else None - lt_alock = float(c["airtime_limit_long"]) if "airtime_limit_long" in c else None + id_interval = int(c["id_interval"]) if "id_interval" in c else None + id_callsign = c["id_callsign"] if "id_callsign" in c else None + st_alock = float(c["airtime_limit_short"]) if "airtime_limit_short" in c else None + lt_alock = float(c["airtime_limit_long"]) if "airtime_limit_long" in c else None force_ble = False ble_name = None diff --git a/RNS/Interfaces/RNodeMultiInterface.py b/RNS/Interfaces/RNodeMultiInterface.py index 9abf22b..d60ad4e 100644 --- a/RNS/Interfaces/RNodeMultiInterface.py +++ b/RNS/Interfaces/RNodeMultiInterface.py @@ -188,7 +188,7 @@ class RNodeMultiInterface(Interface): super().__init__() - c = configuration + c = Interface.get_config_obj(configuration) name = c["name"] count = 0 diff --git a/RNS/Interfaces/SerialInterface.py b/RNS/Interfaces/SerialInterface.py index 0672ed0..c9e20c0 100755 --- a/RNS/Interfaces/SerialInterface.py +++ b/RNS/Interfaces/SerialInterface.py @@ -63,7 +63,7 @@ class SerialInterface(Interface): super().__init__() - c = configuration + c = Interface.get_config_obj(configuration) name = c["name"] port = c["port"] if "port" in c else None speed = int(c["speed"]) if "speed" in c else 9600 diff --git a/RNS/Interfaces/TCPInterface.py b/RNS/Interfaces/TCPInterface.py index 9b7c5f9..4e4cd55 100644 --- a/RNS/Interfaces/TCPInterface.py +++ b/RNS/Interfaces/TCPInterface.py @@ -85,10 +85,10 @@ class TCPClientInterface(Interface): def __init__(self, owner, configuration, connected_socket=None): super().__init__() - c = configuration + c = Interface.get_config_obj(configuration) name = c["name"] - target_ip = c["target_host"] - target_port = int(c["target_port"]) + target_ip = c["target_host"] if "target_host" in c else None + target_port = int(c["target_port"]) if "target_port" in c else None kiss_framing = False if "kiss_framing" in c and c.as_bool("kiss_framing") == True: kiss_framing = True @@ -468,7 +468,7 @@ class TCPServerInterface(Interface): def __init__(self, owner, configuration): super().__init__() - c = configuration + c = Interface.get_config_obj(configuration) name = c["name"] device = c["device"] if "device" in c else None port = int(c["port"]) if "port" in c else None diff --git a/RNS/Interfaces/UDPInterface.py b/RNS/Interfaces/UDPInterface.py index d2a3b9a..6dcba4a 100644 --- a/RNS/Interfaces/UDPInterface.py +++ b/RNS/Interfaces/UDPInterface.py @@ -48,7 +48,7 @@ class UDPInterface(Interface): def __init__(self, owner, configuration): super().__init__() - c = configuration + c = Interface.get_config_obj(configuration) name = c["name"] device = c["device"] if "device" in c else None port = int(c["port"]) if "port" in c else None