// Copyright (c) 2020 Tailscale Inc & AUTHORS All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package dns import ( "fmt" "os" "tailscale.com/types/logger" ) func NewOSConfigurator(logf logger.Logf, _ string) (OSConfigurator, error) { bs, err := os.ReadFile("/etc/resolv.conf") if os.IsNotExist(err) { return newDirectManager(logf), nil } if err != nil { return nil, fmt.Errorf("reading /etc/resolv.conf: %w", err) } switch resolvOwner(bs) { case "resolvconf": switch resolvconfStyle() { case "": return newDirectManager(logf), nil case "debian": return newDebianResolvconfManager(logf) case "openresolv": return newOpenresolvManager() default: logf("[unexpected] got unknown flavor of resolvconf %q, falling back to direct manager", resolvconfStyle()) return newDirectManager(logf), nil } default: return newDirectManager(logf), nil } }