From 1e4bfeccdf1967e3d428d59ae90c69e693235825 Mon Sep 17 00:00:00 2001 From: Sven Sager Date: Thu, 26 Jun 2025 13:01:05 +0200 Subject: [PATCH] feat(dbus): Add InterfaceWlan for WLAN configuration management Introduced `InterfaceWlan` to enable/disable WLAN hardware, check availability, and track status via D-Bus. Integrated the new interface with the bus provider initialization to ensure proper registration. Signed-off-by: Sven Sager --- .../dbus_middleware1/bus_provider.py | 3 +- .../system_config/__init__.py | 1 + .../system_config/interface_config.py | 2 - .../system_config/interface_wlan.py | 90 +++++++++++++++++++ 4 files changed, 93 insertions(+), 3 deletions(-) create mode 100644 src/revpi_middleware/dbus_middleware1/system_config/interface_wlan.py diff --git a/src/revpi_middleware/dbus_middleware1/bus_provider.py b/src/revpi_middleware/dbus_middleware1/bus_provider.py index d2ce943..34824a9 100644 --- a/src/revpi_middleware/dbus_middleware1/bus_provider.py +++ b/src/revpi_middleware/dbus_middleware1/bus_provider.py @@ -10,7 +10,7 @@ from pydbus import SessionBus, SystemBus from . import REVPI_DBUS_NAME from .process_image import InterfacePiControl -from .system_config import InterfaceRevpiConfig, InterfaceSoftwareServices +from .system_config import InterfaceRevpiConfig, InterfaceSoftwareServices, InterfaceWlan log = getLogger(__name__) @@ -44,6 +44,7 @@ class BusProvider(Thread): InterfacePiControl(self._bus, self.picontrol_device, self.config_rsc), InterfaceRevpiConfig(self._bus), InterfaceSoftwareServices(self._bus), + InterfaceWlan(self._bus), ] try: diff --git a/src/revpi_middleware/dbus_middleware1/system_config/__init__.py b/src/revpi_middleware/dbus_middleware1/system_config/__init__.py index 2b51c7a..1ca19e6 100644 --- a/src/revpi_middleware/dbus_middleware1/system_config/__init__.py +++ b/src/revpi_middleware/dbus_middleware1/system_config/__init__.py @@ -4,3 +4,4 @@ """D-Bus interfaces for system configuration.""" from .interface_config import InterfaceRevpiConfig from .interface_services import InterfaceSoftwareServices +from .interface_wlan import InterfaceWlan diff --git a/src/revpi_middleware/dbus_middleware1/system_config/interface_config.py b/src/revpi_middleware/dbus_middleware1/system_config/interface_config.py index 9818583..3db8b49 100644 --- a/src/revpi_middleware/dbus_middleware1/system_config/interface_config.py +++ b/src/revpi_middleware/dbus_middleware1/system_config/interface_config.py @@ -14,7 +14,6 @@ from .revpi_config import ( configure_dphys_swapfile, configure_external_antenna, configure_gui, - configure_wlan, ) from ..dbus_helper import DbusInterface @@ -98,6 +97,5 @@ AVAILABLE_FEATURES = { "revpi-con-can": FeatureFunction(configure_con_can, []), "swapfile": FeatureFunction(configure_dphys_swapfile, []), "bluetooth": FeatureFunction(configure_bluetooth, []), - "wlan": FeatureFunction(configure_wlan, []), "external-antenna": FeatureFunction(configure_external_antenna, []), } diff --git a/src/revpi_middleware/dbus_middleware1/system_config/interface_wlan.py b/src/revpi_middleware/dbus_middleware1/system_config/interface_wlan.py new file mode 100644 index 0000000..a15dea4 --- /dev/null +++ b/src/revpi_middleware/dbus_middleware1/system_config/interface_wlan.py @@ -0,0 +1,90 @@ +# -*- coding: utf-8 -*- +# SPDX-FileCopyrightText: 2025 KUNBUS GmbH +# SPDX-License-Identifier: GPL-2.0-or-later +"""D-Bus interfaces for wlan configuration.""" +from logging import getLogger +from threading import Event, Thread + +from pydbus.generic import signal + +from .revpi_config import configure_wlan, ConfigActions +from ..dbus_helper import DbusInterface + +log = getLogger(__name__) + + +class InterfaceWlan(DbusInterface): + """ + + + + + + + + + + + + + + + + + """ + + PropertiesChanged = signal() + + def __init__(self, bus): + super().__init__(bus) + self._status = "" + + # NetworkManager-Objekt abrufen + self.bus_nm = self.bus.get( + "org.freedesktop.NetworkManager", + "/org/freedesktop/NetworkManager", + ) + + # Prepare status value and thread + self.evt_stop_threading = Event() + self._update_status(suppress_signal=True) + self.th_run_status_update = Thread( + target=self._run_status_update, + daemon=True, + ).start() + + def _run_status_update(self, *args, **kwargs): + while not self.evt_stop_threading.wait(1.0): + self._update_status() + + def _update_status(self, suppress_signal=False) -> None: + str_status = "enabled" if configure_wlan(ConfigActions.STATUS) else "disabled" + if self._status != str_status: + self._status = str_status + + if not suppress_signal: + self.PropertiesChanged( + "com.revolutionpi.middleware1.WlanConfiguration", + {"status": str_status}, + [], + ) + + def cleanup(self): + self.evt_stop_threading.set() + + def Disable(self) -> None: + """Disable integrated WLAN hardware.""" + configure_wlan(ConfigActions.DISABLE) + + def Enable(self) -> None: + """Enable integrated WLAN hardware.""" + configure_wlan(ConfigActions.ENABLE) + + @property + def available(self) -> bool: + """Check if WLAN hardware is available.""" + return configure_wlan(ConfigActions.AVAILABLE) + + @property + def status(self) -> str: + return self._status