mirror of
https://github.com/Control-D-Inc/ctrld.git
synced 2026-07-04 01:07:49 +02:00
cmd/cli: fix issue with editing /etc/resolv.conf directly on Darwin
On Darwin, modifying /etc/resolv.conf directly does not change interface network settings. Thus the networksetup command uses to set DNS does not do anything. To fix this, after setting DNS using networksetup, re-check the content of /etc/resolv.conf file to see if the nameservers are what we expected. Otherwise, re-generate the file with proper nameservers.
This commit is contained in:
committed by
Cuong Manh Le
parent
5f4a399850
commit
30320ec9c7
@@ -651,6 +651,8 @@ func (p *prog) dnsWatchdog(iface *net.Interface, nameservers []string, allIfaces
|
|||||||
if dnsChanged(i, ns) {
|
if dnsChanged(i, ns) {
|
||||||
if err := setDnsIgnoreUnusableInterface(i, nameservers); err != nil {
|
if err := setDnsIgnoreUnusableInterface(i, nameservers); err != nil {
|
||||||
mainLog.Load().Error().Err(err).Str("iface", i.Name).Msgf("could not re-apply DNS settings")
|
mainLog.Load().Error().Err(err).Str("iface", i.Name).Msgf("could not re-apply DNS settings")
|
||||||
|
} else {
|
||||||
|
mainLog.Load().Debug().Msgf("re-applying DNS for interface %q successfully", i.Name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -3,15 +3,44 @@ package cli
|
|||||||
import (
|
import (
|
||||||
"net"
|
"net"
|
||||||
"net/netip"
|
"net/netip"
|
||||||
|
"os"
|
||||||
|
"slices"
|
||||||
|
|
||||||
|
"github.com/Control-D-Inc/ctrld/internal/dns/resolvconffile"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const resolvConfPath = "/etc/resolv.conf"
|
||||||
|
|
||||||
// setResolvConf sets the content of resolv.conf file using the given nameservers list.
|
// setResolvConf sets the content of resolv.conf file using the given nameservers list.
|
||||||
func setResolvConf(iface *net.Interface, ns []netip.Addr) error {
|
func setResolvConf(iface *net.Interface, ns []netip.Addr) error {
|
||||||
servers := make([]string, len(ns))
|
servers := make([]string, len(ns))
|
||||||
for i := range ns {
|
for i := range ns {
|
||||||
servers[i] = ns[i].String()
|
servers[i] = ns[i].String()
|
||||||
}
|
}
|
||||||
return setDNS(iface, servers)
|
if err := setDNS(iface, servers); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
slices.Sort(servers)
|
||||||
|
curNs := currentDNS(iface)
|
||||||
|
slices.Sort(curNs)
|
||||||
|
if !slices.Equal(curNs, servers) {
|
||||||
|
c, err := resolvconffile.ParseFile(resolvConfPath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
c.Nameservers = ns
|
||||||
|
f, err := os.Create(resolvConfPath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
|
||||||
|
if err := c.Write(f); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return f.Close()
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// shouldWatchResolvconf reports whether ctrld should watch changes to resolv.conf file with given OS configurator.
|
// shouldWatchResolvconf reports whether ctrld should watch changes to resolv.conf file with given OS configurator.
|
||||||
|
|||||||
Reference in New Issue
Block a user