Detect unix; network manager not working

Former-commit-id: 8774412091
This commit is contained in:
Owen
2025-11-25 15:44:16 -05:00
parent 50525aaf8d
commit 53c1fa117a
4 changed files with 40 additions and 16 deletions

View File

@@ -39,7 +39,7 @@ func SetupDNSOverride(interfaceName string, dnsProxy *dns.DNSProxy) error {
case platform.NetworkManagerManager: case platform.NetworkManagerManager:
configurator, err = platform.NewNetworkManagerDNSConfigurator(interfaceName) configurator, err = platform.NewNetworkManagerDNSConfigurator(interfaceName)
if err == nil { if err == nil {
logger.Info("************************************Using NetworkManager DNS configurator") logger.Info("Using NetworkManager DNS configurator")
return setDNS(dnsProxy, configurator) return setDNS(dnsProxy, configurator)
} }
logger.Warn("Failed to create NetworkManager configurator: %v, falling back", err) logger.Warn("Failed to create NetworkManager configurator: %v, falling back", err)

View File

@@ -92,7 +92,10 @@ func (d DNSManagerType) String() string {
// to determine the best DNS configurator to use // to determine the best DNS configurator to use
func DetectDNSManager(interfaceName string) DNSManagerType { func DetectDNSManager(interfaceName string) DNSManagerType {
// First check what the file suggests // First check what the file suggests
fileHint := DetectDNSManagerFromFile() // fileHint := DetectDNSManagerFromFile()
// TODO: Remove hardcode
fileHint := NetworkManagerManager
// Verify the hint with runtime checks // Verify the hint with runtime checks
switch fileHint { switch fileHint {

View File

@@ -10,6 +10,7 @@ import (
"net/netip" "net/netip"
"time" "time"
"github.com/fosrl/newt/logger"
dbus "github.com/godbus/dbus/v5" dbus "github.com/godbus/dbus/v5"
) )
@@ -21,6 +22,7 @@ const (
networkManagerDbusDeviceGetApplied = networkManagerDbusDeviceInterface + ".GetAppliedConnection" networkManagerDbusDeviceGetApplied = networkManagerDbusDeviceInterface + ".GetAppliedConnection"
networkManagerDbusDeviceReapply = networkManagerDbusDeviceInterface + ".Reapply" networkManagerDbusDeviceReapply = networkManagerDbusDeviceInterface + ".Reapply"
networkManagerDbusIPv4Key = "ipv4" networkManagerDbusIPv4Key = "ipv4"
networkManagerDbusIPv6Key = "ipv6"
networkManagerDbusDNSKey = "dns" networkManagerDbusDNSKey = "dns"
networkManagerDbusDNSPriorityKey = "dns-priority" networkManagerDbusDNSPriorityKey = "dns-priority"
networkManagerDbusPrimaryDNSPriority = int32(-500) networkManagerDbusPrimaryDNSPriority = int32(-500)
@@ -29,6 +31,19 @@ const (
type networkManagerConnSettings map[string]map[string]dbus.Variant type networkManagerConnSettings map[string]map[string]dbus.Variant
type networkManagerConfigVersion uint64 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 // NetworkManagerDNSConfigurator manages DNS settings using NetworkManager D-Bus API
type NetworkManagerDNSConfigurator struct { type NetworkManagerDNSConfigurator struct {
ifaceName string ifaceName string
@@ -100,6 +115,8 @@ func (n *NetworkManagerDNSConfigurator) RestoreDNS() error {
} }
// GetCurrentDNS returns the currently configured DNS servers // 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) { func (n *NetworkManagerDNSConfigurator) GetCurrentDNS() ([]netip.Addr, error) {
connSettings, _, err := n.getAppliedConnectionSettings() connSettings, _, err := n.getAppliedConnectionSettings()
if err != nil { if err != nil {
@@ -116,6 +133,14 @@ func (n *NetworkManagerDNSConfigurator) applyDNSServers(servers []netip.Addr) er
return fmt.Errorf("get connection settings: %w", err) 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) // Convert DNS servers to NetworkManager format (uint32 little-endian)
var dnsServers []uint32 var dnsServers []uint32
for _, server := range servers { for _, server := range servers {
@@ -184,6 +209,7 @@ func (n *NetworkManagerDNSConfigurator) reApplyConnectionSettings(connSettings n
} }
// extractDNSServers extracts DNS servers from connection settings // 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 { func (n *NetworkManagerDNSConfigurator) extractDNSServers(connSettings networkManagerConnSettings) []netip.Addr {
var servers []netip.Addr var servers []netip.Addr
@@ -194,11 +220,12 @@ func (n *NetworkManagerDNSConfigurator) extractDNSServers(connSettings networkMa
dnsVariant, ok := ipv4Settings[networkManagerDbusDNSKey] dnsVariant, ok := ipv4Settings[networkManagerDbusDNSKey]
if !ok { if !ok {
// DNS not configured on this interface - this is normal
return servers return servers
} }
dnsServers, ok := dnsVariant.Value().([]uint32) dnsServers, ok := dnsVariant.Value().([]uint32)
if !ok { if !ok || dnsServers == nil {
return servers return servers
} }
@@ -230,6 +257,7 @@ func IsNetworkManagerAvailable() bool {
// Try to ping NetworkManager // Try to ping NetworkManager
if err := obj.CallWithContext(ctx, "org.freedesktop.DBus.Peer.Ping", 0).Store(); err != nil { if err := obj.CallWithContext(ctx, "org.freedesktop.DBus.Peer.Ping", 0).Store(); err != nil {
logger.Debug("NetworkManager ping failed: %v", err)
return false return false
} }

View File

@@ -811,6 +811,12 @@ func StartTunnel(config TunnelConfig) {
} }
func Close() { 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 // Stop hole punch manager
if holePunchManager != nil { if holePunchManager != nil {
holePunchManager.Stop() holePunchManager.Stop()
@@ -855,14 +861,6 @@ func Close() {
middleDev = nil 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 // Stop DNS proxy
logger.Debug("Stopping DNS proxy") logger.Debug("Stopping DNS proxy")
if dnsProxy != nil { if dnsProxy != nil {
@@ -909,11 +907,6 @@ func StopTunnel() error {
Close() Close()
// Restore original DNS configuration
if err := dnsOverride.RestoreDNSOverride(); err != nil {
logger.Error("Failed to restore DNS: %v", err)
}
// Reset the connected state // Reset the connected state
connected = false connected = false
tunnelRunning = false tunnelRunning = false