diff --git a/main.go b/main.go index 4ecc9c0..66ec7ce 100644 --- a/main.go +++ b/main.go @@ -1,6 +1,7 @@ package main import ( + "context" "encoding/json" "fmt" "github.com/go-git/go-git/v5" @@ -94,6 +95,71 @@ func updateRunner() { } } +func resolver(addr string) net.Resolver { + var ( + dnsResolverProto = "udp" // Protocol to use for the DNS resolver + dnsResolverTimeoutMs = 5000 // Timeout (ms) for the DNS resolver (optional) + ) + + return net.Resolver{ + Dial: func(ctx context.Context, network, address string) (net.Conn, error) { + d := net.Dialer{ + Timeout: time.Duration(dnsResolverTimeoutMs) * time.Millisecond, + } + return d.DialContext(ctx, dnsResolverProto, addr) + }, + } +} + +func reverseDNS(ip net.IP) ([]string, error) { + results := make([]string, 0) + + // resolve using system resolver + names, err := net.LookupAddr(ip.String()) + if err == nil { + results = append(results, names...) + } + + // resolve using 1.1.1.1 + cloudflare := resolver("1.1.1.1") + names, err = cloudflare.LookupAddr(context.Background(), ip.String()) + if err == nil { + results = append(results, names...) + } else { + log.Tracef("Failed to resolve reverse DNS using Cloduflare for %s: %s", ip.String(), err.Error()) + } + + // resolve using 8.8.8.8 + google := resolver("8.8.8.8") + names, err = google.LookupAddr(context.Background(), ip.String()) + if err == nil { + results = append(results, names...) + } else { + log.Tracef("Failed to resolve reverse DNS using Google for %s: %s", ip.String(), err.Error()) + } + + // resolve using 77.88.8.8 + yandex := resolver("77.88.8.8") + names, err = yandex.LookupAddr(context.Background(), ip.String()) + if err == nil { + results = append(results, names...) + } else { + log.Tracef("Failed to resolve reverse DNS using Yandex for %s: %s", ip.String(), err.Error()) + } + + // remove duplicates + unique := make(map[string]struct{}) + for _, v := range results { + unique[v] = struct{}{} + } + + results = make([]string, 0, len(unique)) + for k := range unique { + results = append(results, k) + } + return results, nil +} + func update(repository *git.Repository, branch string, auth transport.AuthMethod, fileName string) { type structuredBlacklist []string @@ -269,11 +335,13 @@ func update(repository *git.Repository, branch string, auth transport.AuthMethod logMessages.WriteString(fmt.Sprintf("server='%s' addr='%s'", v.Server, v.IP.String())) commitMessage.WriteString(v.IP.String()) - reverseDNSNames, err := net.LookupAddr(v.IP.String()) + reverseDNSNames, err := reverseDNS(v.IP) if err == nil { - line := fmt.Sprintf(" hostname='%s'", reverseDNSNames[0]) - commitMessage.WriteString(line) - logMessages.WriteString(line) + for _, name := range reverseDNSNames { + line := fmt.Sprintf(" hostname='%s'", name) + commitMessage.WriteString(line) + logMessages.WriteString(line) + } } else { log.Warnf("Failed to lookup reverse DNS for %s: %s", v.IP.String(), err.Error()) }