diff --git a/supervisor/dbus/network/setting/__init__.py b/supervisor/dbus/network/setting/__init__.py index eff2286a2..10c22a55c 100644 --- a/supervisor/dbus/network/setting/__init__.py +++ b/supervisor/dbus/network/setting/__init__.py @@ -34,15 +34,32 @@ ATTR_AUTH_ALG = "auth-alg" ATTR_KEY_MGMT = "key-mgmt" ATTR_INTERFACE_NAME = "interface-name" +IPV4_6_IGNORE_FIELDS = [ + "addresses", + "address-data", + "dns", + "gateway", + "method", +] + _LOGGER: logging.Logger = logging.getLogger(__name__) def _merge_settings_attribute( - base_settings: Any, new_settings: Any, attribute: str + base_settings: Any, + new_settings: Any, + attribute: str, + *, + ignore_current_value: list[str] = None, ) -> None: """Merge settings attribute if present.""" if attribute in new_settings: if attribute in base_settings: + if ignore_current_value: + for field in ignore_current_value: + if field in base_settings[attribute]: + del base_settings[attribute][field] + base_settings[attribute].update(new_settings[attribute]) else: base_settings[attribute] = new_settings[attribute] @@ -121,13 +138,18 @@ class NetworkSetting(DBusInterfaceProxy): new_settings, settings, CONF_ATTR_802_WIRELESS_SECURITY ) _merge_settings_attribute(new_settings, settings, CONF_ATTR_VLAN) - _merge_settings_attribute(new_settings, settings, CONF_ATTR_IPV4) - if "addresses" in new_settings[CONF_ATTR_IPV4]: - del new_settings[CONF_ATTR_IPV4]["addresses"] - - _merge_settings_attribute(new_settings, settings, CONF_ATTR_IPV6) - if "addresses" in new_settings[CONF_ATTR_IPV6]: - del new_settings[CONF_ATTR_IPV6]["addresses"] + _merge_settings_attribute( + new_settings, + settings, + CONF_ATTR_IPV4, + ignore_current_value=IPV4_6_IGNORE_FIELDS, + ) + _merge_settings_attribute( + new_settings, + settings, + CONF_ATTR_IPV6, + ignore_current_value=IPV4_6_IGNORE_FIELDS, + ) return await self.dbus.Settings.Connection.Update(("a{sa{sv}}", new_settings)) diff --git a/tests/dbus/network/setting/test_init.py b/tests/dbus/network/setting/test_init.py index d759b494c..6a5612f86 100644 --- a/tests/dbus/network/setting/test_init.py +++ b/tests/dbus/network/setting/test_init.py @@ -90,14 +90,10 @@ async def mock_call_dbus_get_settings_signature( assert settings["connection"]["autoconnect"] == Variant("b", True) assert "ipv4" in settings - assert settings["ipv4"]["gateway"] == Variant("s", "192.168.2.1") assert settings["ipv4"]["method"] == Variant("s", "auto") - assert settings["ipv4"]["dns"] == Variant("au", [16951488]) - assert len(settings["ipv4"]["address-data"].value) == 1 - assert settings["ipv4"]["address-data"].value[0]["address"] == Variant( - "s", "192.168.2.148" - ) - assert settings["ipv4"]["address-data"].value[0]["prefix"] == Variant("u", 24) + assert "gateway" not in settings["ipv4"] + assert "dns" not in settings["ipv4"] + assert "address-data" not in settings["ipv4"] assert "addresses" not in settings["ipv4"] assert len(settings["ipv4"]["route-data"].value) == 1 assert settings["ipv4"]["route-data"].value[0]["dest"] == Variant( @@ -113,8 +109,11 @@ async def mock_call_dbus_get_settings_signature( assert "ipv6" in settings assert settings["ipv6"]["method"] == Variant("s", "auto") - assert settings["ipv6"]["addr-gen-mode"] == Variant("i", 0) + assert "gateway" not in settings["ipv6"] + assert "dns" not in settings["ipv6"] + assert "address-data" not in settings["ipv6"] assert "addresses" not in settings["ipv6"] + assert settings["ipv6"]["addr-gen-mode"] == Variant("i", 0) assert "proxy" in settings