Skip to content

Commit

Permalink
Make sure server has port attached
Browse files Browse the repository at this point in the history
Also make sure that we check for search domains

Revert the TCP lookup change and fallback to UDP

Signed-off-by: Goutham Veeramachaneni <gouthamve@gmail.com>
  • Loading branch information
gouthamve committed Mar 11, 2019
1 parent 93fc127 commit 64e3a6f
Showing 1 changed file with 34 additions and 29 deletions.
63 changes: 34 additions & 29 deletions pkg/util/dns.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,61 +2,66 @@ package util

import (
"fmt"
"net"

"github.com/go-kit/kit/log/level"
"github.com/miekg/dns"
)

const defaultResolvConf = "/etc/resolv.conf"

// GetDefaultDNSServers returns the DNS servers from the default
// resolver configuration.
func GetDefaultDNSServers() ([]string, error) {
conf, err := dns.ClientConfigFromFile(defaultResolvConf)
if err != nil {
return nil, err
func getDefaultDNSServers(conf *dns.ClientConfig) []string {
servers := make([]string, 0, len(conf.Servers))
for _, server := range conf.Servers {
servers = append(servers, net.JoinHostPort(server, conf.Port))
}
return conf.Servers, nil

return servers
}

// LookupSRV tries to resolve an SRV query of the given service, proto and domain name.
// proto can be 'tcp' or udp'.
// The query will be of the form _service._proto.name.
func LookupSRV(service, proto, name string) ([]*dns.SRV, error) {
dnsServers, err := GetDefaultDNSServers()
conf, err := dns.ClientConfigFromFile(defaultResolvConf)
if err != nil {
return nil, err
}

msg := &dns.Msg{}
dnsServers := getDefaultDNSServers(conf)

name = "_" + service + "._" + proto + "." + name
msg.SetQuestion(dns.Fqdn(name), dns.TypeSRV)
names := conf.NameList(name)

client := dns.Client{
Net: "tcp",
}
var result []*dns.SRV
dnsResolved := false
for _, serverAddr := range dnsServers {
resMsg, _, err := client.Exchange(msg, serverAddr)
if err != nil {
level.Warn(Logger).Log("msg", "DNS exchange failed", "err", err)
continue
}
dnsResolved = true
for _, ans := range resMsg.Answer {
if srvRecord, ok := ans.(*dns.SRV); ok {
result = append(result, srvRecord)
client := dns.Client{}

for _, name := range names {
msg := &dns.Msg{}
msg.SetQuestion(dns.Fqdn(name), dns.TypeSRV)

var result []*dns.SRV
for _, serverAddr := range dnsServers {
resMsg, _, err := client.Exchange(msg, serverAddr)
if err != nil {
level.Warn(Logger).Log("msg", "DNS exchange failed", "err", err)
continue
}
dnsResolved = true
for _, ans := range resMsg.Answer {
if srvRecord, ok := ans.(*dns.SRV); ok {
result = append(result, srvRecord)
}
}
if len(result) > 0 {
return result, nil
}
}
if len(result) > 0 {
return result, nil
}
}

if !dnsResolved {
return result, fmt.Errorf("Couldn't resolve %s: No server responded", name)
return nil, fmt.Errorf("Couldn't resolve %s: No server responded", name)
}

return result, nil
return nil, nil
}

0 comments on commit 64e3a6f

Please sign in to comment.