Skip to content

Commit b82a15e

Browse files
Williangalvanipatrickelectric
authored andcommitted
cable-guy: cleanup networks managed by NetworkManager
1 parent e88e687 commit b82a15e

File tree

2 files changed

+32
-2
lines changed

2 files changed

+32
-2
lines changed

core/services/cable_guy/api/manager.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ def set_configuration(self, interface: NetworkInterface) -> None:
9090
Args:
9191
interface: NetworkInterface
9292
"""
93+
self.network_handler.cleanup_interface_connections(interface.name)
9394
interfaces = self.get_ethernet_interfaces()
9495
valid_names = [interface.name for interface in interfaces]
9596
if interface.name not in valid_names:

core/services/cable_guy/networksetup.py

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,12 @@
77
from loguru import logger
88
from pyroute2 import IPRoute
99
from pyroute2.netlink.rtnl.ifaddrmsg import ifaddrmsg
10-
from sdbus_block.networkmanager import NetworkDeviceGeneric, NetworkManager
10+
from sdbus_block.networkmanager import (
11+
NetworkConnectionSettings,
12+
NetworkDeviceGeneric,
13+
NetworkManager,
14+
NetworkManagerSettings,
15+
)
1116

1217
from typedefs import NetworkInterfaceMetric, NetworkInterfaceMetricApi
1318

@@ -41,8 +46,32 @@ def remove_static_ip(self, interface_name: str, ip: str) -> None:
4146
def trigger_dynamic_ip_acquisition(self, interface_name: str) -> None:
4247
raise NotImplementedError("This Handler does not support setting interface priority")
4348

49+
def cleanup_interface_connections(self, interface_name: str) -> None:
50+
pass
51+
52+
53+
class BookwormHandler(AbstractNetworkHandler):
54+
"""
55+
While this class requires NetworkManager, it does NOT use NetworkManager for controlling the interfaces.
56+
Instead it uses the Bookworm-specific NetworkManagerSettings API to remove the connections.
57+
It then relies on IPRoute, dhclient, and dnsmasq to manage the interfaces.
58+
"""
59+
60+
def cleanup_interface_connections(self, interface_name: str) -> None:
61+
network_manager_settings = NetworkManagerSettings()
62+
for connection_path in network_manager_settings.connections:
63+
profile = NetworkConnectionSettings(connection_path).get_profile()
64+
if profile.connection.interface_name == interface_name:
65+
logger.info(
66+
f"Removing connection {profile.connection.uuid} ({profile.connection.connection_id}) for interface {interface_name}"
67+
)
68+
try:
69+
NetworkManagerSettings().delete_connection_by_uuid(profile.connection.uuid)
70+
except Exception as e:
71+
logger.error(
72+
f"Failed to remove connection {profile.connection.uuid} ({profile.connection.connection_id}) for interface {interface_name}: {e}"
73+
)
4474

45-
class NetworkManagerHandler(AbstractNetworkHandler):
4675
def detect(self) -> bool:
4776
try:
4877
all_devices = {path: NetworkDeviceGeneric(path) for path in network_manager.devices}

0 commit comments

Comments
 (0)