mirror of
https://github.com/fosrl/olm.git
synced 2026-03-01 08:16:56 +00:00
@@ -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)
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
19
olm/olm.go
19
olm/olm.go
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user