From b82a15ef4fcecb0a458028239182c9109fa900f3 Mon Sep 17 00:00:00 2001 From: Willian Galvani Date: Fri, 17 Jan 2025 14:02:24 -0300 Subject: [PATCH] cable-guy: cleanup networks managed by NetworkManager --- core/services/cable_guy/api/manager.py | 1 + core/services/cable_guy/networksetup.py | 33 +++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/core/services/cable_guy/api/manager.py b/core/services/cable_guy/api/manager.py index 356b92c149..757fbe58a3 100644 --- a/core/services/cable_guy/api/manager.py +++ b/core/services/cable_guy/api/manager.py @@ -90,6 +90,7 @@ def set_configuration(self, interface: NetworkInterface) -> None: Args: interface: NetworkInterface """ + self.network_handler.cleanup_interface_connections(interface.name) interfaces = self.get_ethernet_interfaces() valid_names = [interface.name for interface in interfaces] if interface.name not in valid_names: diff --git a/core/services/cable_guy/networksetup.py b/core/services/cable_guy/networksetup.py index a33935973b..0d620a3ac7 100755 --- a/core/services/cable_guy/networksetup.py +++ b/core/services/cable_guy/networksetup.py @@ -7,7 +7,12 @@ from loguru import logger from pyroute2 import IPRoute from pyroute2.netlink.rtnl.ifaddrmsg import ifaddrmsg -from sdbus_block.networkmanager import NetworkDeviceGeneric, NetworkManager +from sdbus_block.networkmanager import ( + NetworkConnectionSettings, + NetworkDeviceGeneric, + NetworkManager, + NetworkManagerSettings, +) from typedefs import NetworkInterfaceMetric, NetworkInterfaceMetricApi @@ -41,8 +46,32 @@ def remove_static_ip(self, interface_name: str, ip: str) -> None: def trigger_dynamic_ip_acquisition(self, interface_name: str) -> None: raise NotImplementedError("This Handler does not support setting interface priority") + def cleanup_interface_connections(self, interface_name: str) -> None: + pass + + +class BookwormHandler(AbstractNetworkHandler): + """ + While this class requires NetworkManager, it does NOT use NetworkManager for controlling the interfaces. + Instead it uses the Bookworm-specific NetworkManagerSettings API to remove the connections. + It then relies on IPRoute, dhclient, and dnsmasq to manage the interfaces. + """ + + def cleanup_interface_connections(self, interface_name: str) -> None: + network_manager_settings = NetworkManagerSettings() + for connection_path in network_manager_settings.connections: + profile = NetworkConnectionSettings(connection_path).get_profile() + if profile.connection.interface_name == interface_name: + logger.info( + f"Removing connection {profile.connection.uuid} ({profile.connection.connection_id}) for interface {interface_name}" + ) + try: + NetworkManagerSettings().delete_connection_by_uuid(profile.connection.uuid) + except Exception as e: + logger.error( + f"Failed to remove connection {profile.connection.uuid} ({profile.connection.connection_id}) for interface {interface_name}: {e}" + ) -class NetworkManagerHandler(AbstractNetworkHandler): def detect(self) -> bool: try: all_devices = {path: NetworkDeviceGeneric(path) for path in network_manager.devices}