func()

in pkg/dnsmasq/nanny.go [58:120]


func (n *Nanny) Configure(args []string, config *config.Config, kubednsServer string) {
	n.args = args

	munge := func(s string) string {
		if colonIndex := strings.LastIndex(s, ":"); colonIndex != -1 {
			bracketIndex := strings.Index(s, "]")
			isV4 := strings.Count(s, ":") == 1
			isBracketedV6 := bracketIndex != -1
			if isV4 || isBracketedV6 && colonIndex > bracketIndex {
				s = s[:colonIndex] + "#" + s[colonIndex+1:]
			}
		}
		return s
	}

	for domain, serverList := range config.StubDomains {
		resolver := &net.Resolver{
			PreferGo: true,
			Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
				d := net.Dialer{}
				return d.DialContext(ctx, "udp", kubednsServer)
			},
		}
		for _, server := range serverList {
			if isIP := (net.ParseIP(server) != nil); !isIP {
				switch {
				case strings.HasSuffix(server, "cluster.local"):
					if IPs, err := resolver.LookupIPAddr(context.Background(), server); err != nil {
						klog.Errorf("Error looking up IP for name %q: %v", server, err)
					} else if len(IPs) > 0 {
						server = IPs[0].String()
					} else {
						klog.Errorf("Name %q does not resolve to any IPs", server)
					}
				default:
					if IPs, err := net.LookupIP(server); err != nil {
						klog.Errorf("Error looking up IP for name %q: %v", server, err)
					} else if len(IPs) > 0 {
						server = IPs[0].String()
					} else {
						klog.Errorf("Name %q does not resolve to any IPs", server)
					}
				}
			}
			// dnsmasq port separator is '#' for some reason.
			server = munge(server)
			n.args = append(
				n.args, "--server", fmt.Sprintf("/%v/%v", domain, server))
		}
	}

	for _, server := range config.UpstreamNameservers {
		// dnsmasq port separator is '#' for some reason.
		server = munge(server)
		n.args = append(n.args, "--server", server)
	}

	// If upstream nameservers are explicitly specified, then do not look
	// at /etc/resolv.conf.
	if len(config.UpstreamNameservers) > 0 {
		n.args = append(n.args, "--no-resolv")
	}
}