net/dns: bound how long we block looking for, restarting systemd-resolved

Fixes #3537

Change-Id: Iba6a3cde75983490d4072b5341f48dbfa2f997c0
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
(cherry picked from commit cab5c46481)
This commit is contained in:
Brad Fitzpatrick 2021-12-10 08:47:33 -08:00
parent 7d6407a632
commit 2d6404609d

View File

@ -7,6 +7,7 @@
import ( import (
"bufio" "bufio"
"bytes" "bytes"
"context"
"crypto/rand" "crypto/rand"
"fmt" "fmt"
"io" "io"
@ -16,6 +17,7 @@
"path/filepath" "path/filepath"
"runtime" "runtime"
"strings" "strings"
"time"
"inet.af/netaddr" "inet.af/netaddr"
"tailscale.com/types/logger" "tailscale.com/types/logger"
@ -132,12 +134,20 @@ func isResolvedRunning() bool {
return false return false
} }
// is-active exits with code 3 if the service is not active. ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
err = exec.Command("systemctl", "is-active", "systemd-resolved.service").Run() defer cancel()
err = exec.CommandContext(ctx, "systemctl", "is-active", "systemd-resolved.service").Run()
// is-active exits with code 3 if the service is not active.
return err == nil return err == nil
} }
func restartResolved() error {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
return exec.CommandContext(ctx, "systemctl", "restart", "systemd-resolved.service").Run()
}
// directManager is an OSConfigurator which replaces /etc/resolv.conf with a file // directManager is an OSConfigurator which replaces /etc/resolv.conf with a file
// generated from the given configuration, creating a backup of its old state. // generated from the given configuration, creating a backup of its old state.
// //
@ -394,7 +404,12 @@ func (m *directManager) Close() error {
} }
if isResolvedRunning() && !runningAsGUIDesktopUser() { if isResolvedRunning() && !runningAsGUIDesktopUser() {
exec.Command("systemctl", "restart", "systemd-resolved.service").Run() // Best-effort. m.logf("restarting systemd-resolved...")
if err := restartResolved(); err != nil {
m.logf("restart of systemd-resolved failed: %v", err)
} else {
m.logf("restarted systemd-resolved")
}
} }
return nil return nil