From 9ddedf926e083be04d8d6e6d2fd23ad99e6a0061 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Tue, 23 Jul 2024 22:00:19 +0700 Subject: [PATCH] cmd/cli: fix watching symlink /etc/resolv.conf Currently, ctrld watches changes to /etc/resolv.conf file, then reverting to the expected settings. However, if /etc/resolv.conf is a symlink, changes made to the target file maynot be seen if it's not under /etc directory. To fix this, just evaluate the /etc/resolv.conf file before watching it. --- cmd/cli/os_linux.go | 2 ++ cmd/cli/resolvconf.go | 14 +++++++------- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/cmd/cli/os_linux.go b/cmd/cli/os_linux.go index a36311d..eff5edf 100644 --- a/cmd/cli/os_linux.go +++ b/cmd/cli/os_linux.go @@ -24,6 +24,8 @@ import ( "github.com/Control-D-Inc/ctrld/internal/resolvconffile" ) +const resolvConfBackupFailedMsg = "open /etc/resolv.pre-ctrld-backup.conf: read-only file system" + // allocate loopback ip // sudo ip a add 127.0.0.2/24 dev lo func allocateIP(ip string) error { diff --git a/cmd/cli/resolvconf.go b/cmd/cli/resolvconf.go index f09d864..0b53af0 100644 --- a/cmd/cli/resolvconf.go +++ b/cmd/cli/resolvconf.go @@ -8,15 +8,15 @@ import ( "github.com/fsnotify/fsnotify" ) -const ( - resolvConfPath = "/etc/resolv.conf" - resolvConfBackupFailedMsg = "open /etc/resolv.pre-ctrld-backup.conf: read-only file system" -) - // watchResolvConf watches any changes to /etc/resolv.conf file, // and reverting to the original config set by ctrld. func watchResolvConf(iface *net.Interface, ns []netip.Addr, setDnsFn func(iface *net.Interface, ns []netip.Addr) error) { - mainLog.Load().Debug().Msg("start watching /etc/resolv.conf file") + resolvConfPath := "/etc/resolv.conf" + // Evaluating symbolics link to watch the target file that /etc/resolv.conf point to. + if rp, _ := filepath.EvalSymlinks(resolvConfPath); rp != "" { + resolvConfPath = rp + } + mainLog.Load().Debug().Msgf("start watching %s file", resolvConfPath) watcher, err := fsnotify.NewWatcher() if err != nil { mainLog.Load().Warn().Err(err).Msg("could not create watcher for /etc/resolv.conf") @@ -28,7 +28,7 @@ func watchResolvConf(iface *net.Interface, ns []netip.Addr, setDnsFn func(iface // see: https://github.com/fsnotify/fsnotify#watching-a-file-doesnt-work-well watchDir := filepath.Dir(resolvConfPath) if err := watcher.Add(watchDir); err != nil { - mainLog.Load().Warn().Err(err).Msg("could not add /etc/resolv.conf to watcher list") + mainLog.Load().Warn().Err(err).Msgf("could not add %s to watcher list", watchDir) return }