From 8c7c3901e8606aff857bee89ea1595b47b7819bf Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Wed, 6 Mar 2024 15:05:08 +0700 Subject: [PATCH] cmd/cli: ignore un-usable interfaces on darwin So multi interfaces config won't emit un-necessary errors if the network cable adapters are not being used on MacOS. --- cmd/cli/os_darwin.go | 13 +++++++++++++ cmd/cli/os_freebsd.go | 5 +++++ cmd/cli/os_linux.go | 6 +++++- cmd/cli/os_windows.go | 6 ++++++ cmd/cli/prog.go | 2 +- 5 files changed, 30 insertions(+), 2 deletions(-) diff --git a/cmd/cli/os_darwin.go b/cmd/cli/os_darwin.go index 7ce4aa1..f0f0cd6 100644 --- a/cmd/cli/os_darwin.go +++ b/cmd/cli/os_darwin.go @@ -6,6 +6,7 @@ import ( "fmt" "net" "os/exec" + "strings" "github.com/Control-D-Inc/ctrld/internal/resolvconffile" ) @@ -30,6 +31,18 @@ func deAllocateIP(ip string) error { return nil } +// setDnsIgnoreUnusableInterface likes setDNS, but return a nil error if the interface is not usable. +func setDnsIgnoreUnusableInterface(iface *net.Interface, nameservers []string) error { + if err := setDNS(iface, nameservers); err != nil { + // TODO: investiate whether we can detect this without relying on error message. + if strings.Contains(err.Error(), " is not a recognized network service") { + return nil + } + return err + } + return nil +} + // set the dns server for the provided network interface // networksetup -setdnsservers Wi-Fi 8.8.8.8 1.1.1.1 // TODO(cuonglm): use system API diff --git a/cmd/cli/os_freebsd.go b/cmd/cli/os_freebsd.go index 216b36f..2cbfeb4 100644 --- a/cmd/cli/os_freebsd.go +++ b/cmd/cli/os_freebsd.go @@ -29,6 +29,11 @@ func deAllocateIP(ip string) error { return nil } +// setDnsIgnoreUnusableInterface likes setDNS, but return a nil error if the interface is not usable. +func setDnsIgnoreUnusableInterface(iface *net.Interface, nameservers []string) error { + return setDNS(iface, nameservers) +} + // set the dns server for the provided network interface func setDNS(iface *net.Interface, nameservers []string) error { r, err := dns.NewOSConfigurator(logf, iface.Name) diff --git a/cmd/cli/os_linux.go b/cmd/cli/os_linux.go index 3d9bffd..83a8f62 100644 --- a/cmd/cli/os_linux.go +++ b/cmd/cli/os_linux.go @@ -45,7 +45,11 @@ func deAllocateIP(ip string) error { const maxSetDNSAttempts = 5 -// set the dns server for the provided network interface +// setDnsIgnoreUnusableInterface likes setDNS, but return a nil error if the interface is not usable. +func setDnsIgnoreUnusableInterface(iface *net.Interface, nameservers []string) error { + return setDNS(iface, nameservers) +} + func setDNS(iface *net.Interface, nameservers []string) error { r, err := dns.NewOSConfigurator(logf, iface.Name) if err != nil { diff --git a/cmd/cli/os_windows.go b/cmd/cli/os_windows.go index 56097f8..1fd9535 100644 --- a/cmd/cli/os_windows.go +++ b/cmd/cli/os_windows.go @@ -26,6 +26,12 @@ var ( resetDNSOnce sync.Once ) +// setDnsIgnoreUnusableInterface likes setDNS, but return a nil error if the interface is not usable. +func setDnsIgnoreUnusableInterface(iface *net.Interface, nameservers []string) error { + return setDNS(iface, nameservers) +} + +// setDNS sets the dns server for the provided network interface func setDNS(iface *net.Interface, nameservers []string) error { if len(nameservers) == 0 { return errors.New("empty DNS nameservers") diff --git a/cmd/cli/prog.go b/cmd/cli/prog.go index 6febff8..fa8b861 100644 --- a/cmd/cli/prog.go +++ b/cmd/cli/prog.go @@ -477,7 +477,7 @@ func (p *prog) setDNS() { } if allIfaces { withEachPhysicalInterfaces(netIface.Name, "set DNS", func(i *net.Interface) error { - return setDNS(i, nameservers) + return setDnsIgnoreUnusableInterface(i, nameservers) }) } }