From 154d1cde058063a2e9abb8fee91514064ffc0364 Mon Sep 17 00:00:00 2001 From: Dmytro Shynkevych Date: Wed, 29 Jul 2020 20:57:25 -0400 Subject: [PATCH] router: reload systemd-resolved after changing /etc/resolv.conf (#619) Signed-off-by: Dmytro Shynkevych --- wgengine/router/dns_direct.go | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/wgengine/router/dns_direct.go b/wgengine/router/dns_direct.go index 3418eea25..90615153d 100644 --- a/wgengine/router/dns_direct.go +++ b/wgengine/router/dns_direct.go @@ -13,6 +13,8 @@ import ( "io" "io/ioutil" "os" + "os/exec" + "runtime" "strings" "inet.af/netaddr" @@ -79,6 +81,25 @@ func dnsReadConfig() (DNSConfig, error) { return config, nil } +// isResolvedRunning reports whether systemd-resolved is running on the system, +// even if it is not managing the system DNS settings. +func isResolvedRunning() bool { + if runtime.GOOS != "linux" { + return false + } + + // systemd-resolved is never installed without systemd. + _, err := exec.LookPath("systemctl") + if err != nil { + return false + } + + // is-active exits with code 3 if the service is not active. + err = exec.Command("systemctl", "is-active", "systemd-resolved.service").Run() + + return err == nil +} + // dnsDirectUp replaces /etc/resolv.conf with a file generated // from the given configuration, creating a backup of its old state. // @@ -124,6 +145,10 @@ func dnsDirectUp(config DNSConfig) error { return err } + if isResolvedRunning() { + exec.Command("systemctl", "restart", "systemd-resolved.service").Run() // Best-effort. + } + return nil } @@ -147,5 +172,10 @@ func dnsDirectDown() error { return err } os.Remove(tsConf) + + if isResolvedRunning() { + exec.Command("systemctl", "restart", "systemd-resolved.service").Run() // Best-effort. + } + return nil }