From 53c1fa117afe0da76dc70de341d210c11e065b8f Mon Sep 17 00:00:00 2001 From: Owen Date: Tue, 25 Nov 2025 15:44:16 -0500 Subject: [PATCH] Detect unix; network manager not working Former-commit-id: 8774412091b25c32460558cedcbe63b46323805a --- dns/override/dns_override_unix.go | 2 +- dns/platform/detect_unix.go | 5 ++++- dns/platform/networkmanager.go | 30 +++++++++++++++++++++++++++++- olm/olm.go | 19 ++++++------------- 4 files changed, 40 insertions(+), 16 deletions(-) diff --git a/dns/override/dns_override_unix.go b/dns/override/dns_override_unix.go index 5c99083..c3b31e8 100644 --- a/dns/override/dns_override_unix.go +++ b/dns/override/dns_override_unix.go @@ -39,7 +39,7 @@ func SetupDNSOverride(interfaceName string, dnsProxy *dns.DNSProxy) error { case platform.NetworkManagerManager: configurator, err = platform.NewNetworkManagerDNSConfigurator(interfaceName) if err == nil { - logger.Info("************************************Using NetworkManager DNS configurator") + logger.Info("Using NetworkManager DNS configurator") return setDNS(dnsProxy, configurator) } logger.Warn("Failed to create NetworkManager configurator: %v, falling back", err) diff --git a/dns/platform/detect_unix.go b/dns/platform/detect_unix.go index 035690d..8b246ed 100644 --- a/dns/platform/detect_unix.go +++ b/dns/platform/detect_unix.go @@ -92,7 +92,10 @@ func (d DNSManagerType) String() string { // to determine the best DNS configurator to use func DetectDNSManager(interfaceName string) DNSManagerType { // First check what the file suggests - fileHint := DetectDNSManagerFromFile() + // fileHint := DetectDNSManagerFromFile() + + // TODO: Remove hardcode + fileHint := NetworkManagerManager // Verify the hint with runtime checks switch fileHint { diff --git a/dns/platform/networkmanager.go b/dns/platform/networkmanager.go index 9a9a882..4ace417 100644 --- a/dns/platform/networkmanager.go +++ b/dns/platform/networkmanager.go @@ -10,6 +10,7 @@ import ( "net/netip" "time" + "github.com/fosrl/newt/logger" dbus "github.com/godbus/dbus/v5" ) @@ -21,6 +22,7 @@ const ( networkManagerDbusDeviceGetApplied = networkManagerDbusDeviceInterface + ".GetAppliedConnection" networkManagerDbusDeviceReapply = networkManagerDbusDeviceInterface + ".Reapply" networkManagerDbusIPv4Key = "ipv4" + networkManagerDbusIPv6Key = "ipv6" networkManagerDbusDNSKey = "dns" networkManagerDbusDNSPriorityKey = "dns-priority" networkManagerDbusPrimaryDNSPriority = int32(-500) @@ -29,6 +31,19 @@ const ( type networkManagerConnSettings map[string]map[string]dbus.Variant type networkManagerConfigVersion uint64 +// cleanDeprecatedSettings removes deprecated settings that are still returned by +// GetAppliedConnection but can't be reapplied +func (s networkManagerConnSettings) cleanDeprecatedSettings() { + for _, key := range []string{"addresses", "routes"} { + if ipv4Settings, ok := s[networkManagerDbusIPv4Key]; ok { + delete(ipv4Settings, key) + } + if ipv6Settings, ok := s[networkManagerDbusIPv6Key]; ok { + delete(ipv6Settings, key) + } + } +} + // NetworkManagerDNSConfigurator manages DNS settings using NetworkManager D-Bus API type NetworkManagerDNSConfigurator struct { ifaceName string @@ -100,6 +115,8 @@ func (n *NetworkManagerDNSConfigurator) RestoreDNS() error { } // GetCurrentDNS returns the currently configured DNS servers +// Note: NetworkManager may not have DNS settings on the interface level +// if DNS is being managed globally, so this may return empty func (n *NetworkManagerDNSConfigurator) GetCurrentDNS() ([]netip.Addr, error) { connSettings, _, err := n.getAppliedConnectionSettings() if err != nil { @@ -116,6 +133,14 @@ func (n *NetworkManagerDNSConfigurator) applyDNSServers(servers []netip.Addr) er return fmt.Errorf("get connection settings: %w", err) } + // Clean deprecated settings that can't be reapplied + connSettings.cleanDeprecatedSettings() + + // Ensure IPv4 settings map exists + if connSettings[networkManagerDbusIPv4Key] == nil { + connSettings[networkManagerDbusIPv4Key] = make(map[string]dbus.Variant) + } + // Convert DNS servers to NetworkManager format (uint32 little-endian) var dnsServers []uint32 for _, server := range servers { @@ -184,6 +209,7 @@ func (n *NetworkManagerDNSConfigurator) reApplyConnectionSettings(connSettings n } // extractDNSServers extracts DNS servers from connection settings +// Returns empty slice if no DNS is configured on this interface func (n *NetworkManagerDNSConfigurator) extractDNSServers(connSettings networkManagerConnSettings) []netip.Addr { var servers []netip.Addr @@ -194,11 +220,12 @@ func (n *NetworkManagerDNSConfigurator) extractDNSServers(connSettings networkMa dnsVariant, ok := ipv4Settings[networkManagerDbusDNSKey] if !ok { + // DNS not configured on this interface - this is normal return servers } dnsServers, ok := dnsVariant.Value().([]uint32) - if !ok { + if !ok || dnsServers == nil { return servers } @@ -230,6 +257,7 @@ func IsNetworkManagerAvailable() bool { // Try to ping NetworkManager if err := obj.CallWithContext(ctx, "org.freedesktop.DBus.Peer.Ping", 0).Store(); err != nil { + logger.Debug("NetworkManager ping failed: %v", err) return false } diff --git a/olm/olm.go b/olm/olm.go index 32145e4..4bbda03 100644 --- a/olm/olm.go +++ b/olm/olm.go @@ -811,6 +811,12 @@ func StartTunnel(config TunnelConfig) { } func Close() { + // Restore original DNS configuration + // we do this first to avoid any DNS issues if something else gets stuck + if err := dnsOverride.RestoreDNSOverride(); err != nil { + logger.Error("Failed to restore DNS: %v", err) + } + // Stop hole punch manager if holePunchManager != nil { holePunchManager.Stop() @@ -855,14 +861,6 @@ func Close() { middleDev = nil } - // // Restore original DNS - // if configurator != nil { - // fmt.Println("Restoring original DNS servers...") - // if err := configurator.RestoreDNS(); err != nil { - // log.Fatalf("Failed to restore DNS: %v", err) - // } - // } - // Stop DNS proxy logger.Debug("Stopping DNS proxy") if dnsProxy != nil { @@ -909,11 +907,6 @@ func StopTunnel() error { Close() - // Restore original DNS configuration - if err := dnsOverride.RestoreDNSOverride(); err != nil { - logger.Error("Failed to restore DNS: %v", err) - } - // Reset the connected state connected = false tunnelRunning = false