From b0e96a6c3964f45d4c3693202a7d963e3a515003 Mon Sep 17 00:00:00 2001 From: Andrew Dunham Date: Tue, 13 Feb 2024 20:19:24 -0500 Subject: [PATCH] net/dns: log more info when openresolv commands fail Updates #11129 Signed-off-by: Andrew Dunham Change-Id: Ic594868ba3bc31f6d3b0721ecba4090749a81f7f --- net/dns/manager_freebsd.go | 2 +- net/dns/manager_linux.go | 2 +- net/dns/openresolv.go | 28 +++++++++++++++++++++++++--- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/net/dns/manager_freebsd.go b/net/dns/manager_freebsd.go index 534c1abc8..9d935d2e7 100644 --- a/net/dns/manager_freebsd.go +++ b/net/dns/manager_freebsd.go @@ -27,7 +27,7 @@ func NewOSConfigurator(logf logger.Logf, _ string) (OSConfigurator, error) { case "debian": return newDebianResolvconfManager(logf) case "openresolv": - return newOpenresolvManager() + return newOpenresolvManager(logf) default: logf("[unexpected] got unknown flavor of resolvconf %q, falling back to direct manager", resolvconfStyle()) return newDirectManager(logf), nil diff --git a/net/dns/manager_linux.go b/net/dns/manager_linux.go index b5d3d841c..e2a7224bc 100644 --- a/net/dns/manager_linux.go +++ b/net/dns/manager_linux.go @@ -60,7 +60,7 @@ func NewOSConfigurator(logf logger.Logf, interfaceName string) (ret OSConfigurat case "debian-resolvconf": return newDebianResolvconfManager(logf) case "openresolv": - return newOpenresolvManager() + return newOpenresolvManager(logf) default: logf("[unexpected] detected unknown DNS mode %q, using direct manager as last resort", mode) return newDirectManagerOnFS(logf, env.fs), nil diff --git a/net/dns/openresolv.go b/net/dns/openresolv.go index 9c6f90074..0b5c87a3b 100644 --- a/net/dns/openresolv.go +++ b/net/dns/openresolv.go @@ -10,20 +10,40 @@ import ( "fmt" "os/exec" "strings" + + "tailscale.com/types/logger" ) // openresolvManager manages DNS configuration using the openresolv // implementation of the `resolvconf` program. -type openresolvManager struct{} +type openresolvManager struct { + logf logger.Logf +} + +func newOpenresolvManager(logf logger.Logf) (openresolvManager, error) { + return openresolvManager{logf}, nil +} + +func (m openresolvManager) logCmdErr(cmd *exec.Cmd, err error) { + if err == nil { + return + } + + commandStr := fmt.Sprintf("path=%q args=%q", cmd.Path, cmd.Args) + exerr, ok := err.(*exec.ExitError) + if !ok { + m.logf("error running command %s: %v", commandStr, err) + return + } -func newOpenresolvManager() (openresolvManager, error) { - return openresolvManager{}, nil + m.logf("error running command %s stderr=%q exitCode=%d: %v", commandStr, exerr.Stderr, exerr.ExitCode(), err) } func (m openresolvManager) deleteTailscaleConfig() error { cmd := exec.Command("resolvconf", "-f", "-d", "tailscale") out, err := cmd.CombinedOutput() if err != nil { + m.logCmdErr(cmd, err) return fmt.Errorf("running %s: %s", cmd, out) } return nil @@ -41,6 +61,7 @@ func (m openresolvManager) SetDNS(config OSConfig) error { cmd.Stdin = &stdin out, err := cmd.CombinedOutput() if err != nil { + m.logCmdErr(cmd, err) return fmt.Errorf("running %s: %s", cmd, out) } return nil @@ -83,6 +104,7 @@ func (m openresolvManager) GetBaseConfig() (OSConfig, error) { cmd := exec.Command("resolvconf", args...) cmd.Stdout = &buf if err := cmd.Run(); err != nil { + m.logCmdErr(cmd, err) return OSConfig{}, err } return readResolv(&buf)