@@ -2,61 +2,66 @@ package util
2
2
3
3
import (
4
4
"fmt"
5
+ "net"
5
6
6
7
"github.com/go-kit/kit/log/level"
7
8
"github.com/miekg/dns"
8
9
)
9
10
10
11
const defaultResolvConf = "/etc/resolv.conf"
11
12
12
- // GetDefaultDNSServers returns the DNS servers from the default
13
- // resolver configuration.
14
- func GetDefaultDNSServers () ([]string , error ) {
15
- conf , err := dns .ClientConfigFromFile (defaultResolvConf )
16
- if err != nil {
17
- return nil , err
13
+ func getDefaultDNSServers (conf * dns.ClientConfig ) []string {
14
+ servers := make ([]string , 0 , len (conf .Servers ))
15
+ for _ , server := range conf .Servers {
16
+ servers = append (servers , net .JoinHostPort (server , conf .Port ))
18
17
}
19
- return conf .Servers , nil
18
+
19
+ return servers
20
20
}
21
21
22
22
// LookupSRV tries to resolve an SRV query of the given service, proto and domain name.
23
23
// proto can be 'tcp' or udp'.
24
24
// The query will be of the form _service._proto.name.
25
25
func LookupSRV (service , proto , name string ) ([]* dns.SRV , error ) {
26
- dnsServers , err := GetDefaultDNSServers ( )
26
+ conf , err := dns . ClientConfigFromFile ( defaultResolvConf )
27
27
if err != nil {
28
28
return nil , err
29
29
}
30
30
31
- msg := & dns.Msg {}
31
+ dnsServers := getDefaultDNSServers (conf )
32
+
32
33
name = "_" + service + "._" + proto + "." + name
33
- msg . SetQuestion ( dns . Fqdn ( name ), dns . TypeSRV )
34
+ names := conf . NameList ( name )
34
35
35
- client := dns.Client {
36
- Net : "tcp" ,
37
- }
38
- var result []* dns.SRV
39
36
dnsResolved := false
40
- for _ , serverAddr := range dnsServers {
41
- resMsg , _ , err := client .Exchange (msg , serverAddr )
42
- if err != nil {
43
- level .Warn (Logger ).Log ("msg" , "DNS exchange failed" , "err" , err )
44
- continue
45
- }
46
- dnsResolved = true
47
- for _ , ans := range resMsg .Answer {
48
- if srvRecord , ok := ans .(* dns.SRV ); ok {
49
- result = append (result , srvRecord )
37
+ client := dns.Client {}
38
+
39
+ for _ , name := range names {
40
+ msg := & dns.Msg {}
41
+ msg .SetQuestion (dns .Fqdn (name ), dns .TypeSRV )
42
+
43
+ var result []* dns.SRV
44
+ for _ , serverAddr := range dnsServers {
45
+ resMsg , _ , err := client .Exchange (msg , serverAddr )
46
+ if err != nil {
47
+ level .Warn (Logger ).Log ("msg" , "DNS exchange failed" , "err" , err )
48
+ continue
49
+ }
50
+ dnsResolved = true
51
+ for _ , ans := range resMsg .Answer {
52
+ if srvRecord , ok := ans .(* dns.SRV ); ok {
53
+ result = append (result , srvRecord )
54
+ }
55
+ }
56
+ if len (result ) > 0 {
57
+ return result , nil
50
58
}
51
- }
52
- if len (result ) > 0 {
53
- return result , nil
54
59
}
55
60
}
56
61
57
62
if ! dnsResolved {
58
- return result , fmt .Errorf ("Couldn't resolve %s: No server responded" , name )
63
+ return nil , fmt .Errorf ("Couldn't resolve %s: No server responded" , name )
59
64
}
60
65
61
- return result , nil
66
+ return nil , nil
62
67
}
0 commit comments