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) }) } }