net/dns: add documentation to openresolv's config fetch.

Signed-off-by: David Anderson <danderson@tailscale.com>
This commit is contained in:
David Anderson 2021-04-10 20:21:05 -07:00
parent 61b361bac0
commit 55b39fa945

View File

@ -49,11 +49,15 @@ func (m openresolvManager) SupportsSplitDNS() bool {
} }
func (m openresolvManager) GetBaseConfig() (OSConfig, error) { func (m openresolvManager) GetBaseConfig() (OSConfig, error) {
// List the names of all config snippets openresolv is aware
// of. Snippets get listed in priority order (most to least),
// which we'll exploit later.
bs, err := exec.Command("resolvconf", "-i").CombinedOutput() bs, err := exec.Command("resolvconf", "-i").CombinedOutput()
if err != nil { if err != nil {
return OSConfig{}, err return OSConfig{}, err
} }
// Remove the "tailscale" snippet from the list.
args := []string{"-l"} args := []string{"-l"}
for _, f := range strings.Split(strings.TrimSpace(string(bs)), " ") { for _, f := range strings.Split(strings.TrimSpace(string(bs)), " ") {
if f == "tailscale" { if f == "tailscale" {
@ -62,6 +66,17 @@ func (m openresolvManager) GetBaseConfig() (OSConfig, error) {
args = append(args, f) args = append(args, f)
} }
// List all resolvconf snippets except our own, and parse that as
// a resolv.conf. This effectively generates a blended config of
// "everyone except tailscale", which is what would be in use if
// tailscale hadn't set exclusive mode.
//
// Note that this is not _entirely_ true. To be perfectly correct,
// we should be looking for other interfaces marked exclusive that
// predated tailscale, and stick to only those. However, in
// practice, openresolv uses are generally quite limited, and boil
// down to 1-2 DHCP leases, for which the correct outcome is a
// blended config like the one we produce here.
var buf bytes.Buffer var buf bytes.Buffer
cmd := exec.Command("resolvconf", args...) cmd := exec.Command("resolvconf", args...)
cmd.Stdout = &buf cmd.Stdout = &buf