func resolveIPwServer()

in internal/network/network.go [96:127]


func resolveIPwServer(ip string, servers []net.IP, logger *log.Logger) (string, error) {

	if servers == nil {
		return "", errors.New("no alternate DNS servers configured")
	}

	c := dns.Client{}
	m := dns.Msg{}

	fqdn, err := dns.ReverseAddr(ip)
	if err != nil {
		return "", err
	}
	m.SetQuestion(fqdn, dns.TypePTR)
	for _, s := range servers {
		r, t, err := c.Exchange(&m, s.String()+":53")
		if err != nil || len(r.Answer) == 0 {
			continue
		}
		logger.Debug("Reverse DNS resolution for ip with user-configured DNS server took",
			zap.String("ip", ip),
			zap.Float64("duration", t.Seconds()))

		resolved := strings.Split(r.Answer[0].String(), "\t")

		// return fourth tab-delimited field of DNS query response
		return resolved[4], nil
	}

	logger.Warn("failed to DNS resolve IP with alternate servers", zap.String("ip", ip))
	return "", errors.Errorf("failed to DNS resolve %s with alternate servers", ip)
}