-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdns.go
126 lines (109 loc) · 2.27 KB
/
dns.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package main
import (
"fmt"
"net"
"strings"
)
type Host struct {
Host string
Address []Address
CNAME string
NS []string
MX []string
TXT []string
}
type Address struct {
Address string
Names []string
}
func (a Address) String() string {
if len(a.Names) == 0 {
return a.Address
}
return fmt.Sprintf("%s domain name pointer %s", a.Address, strings.Join(a.Names, ", "))
}
func (h Host) PrettyPrint() {
fmt.Printf("%s has address\n", h.Host)
for _, address := range h.Address {
fmt.Printf(" %s\n", address)
}
fmt.Printf("CNAME %s\n", h.CNAME)
fmt.Println("NS records")
for _, record := range h.NS {
fmt.Printf(" %s\n", record)
}
fmt.Println("MX records")
for _, record := range h.MX {
fmt.Printf(" %s\n", record)
}
fmt.Println("TXT records")
for _, record := range h.TXT {
fmt.Printf(" %s\n", record)
}
}
func LookupHost(host string) (Host, error) {
address, err := net.LookupHost(host)
if err != nil {
return Host{}, fmt.Errorf("lookup host %s: %w", host, err)
}
return Host{
Host: host,
MX: lookupMX(host),
CNAME: lookupCNAME(host),
NS: lookupNS(host),
TXT: lookupTXT(host),
Address: lookupAddr(address),
}, nil
}
func lookupAddr(address []string) []Address {
var addresses []Address
for _, a := range address {
names, err := net.LookupAddr(a)
if err != nil {
addresses = append(addresses, Address{Address: a})
continue
}
addresses = append(addresses, Address{Address: a, Names: names})
}
return addresses
}
func lookupMX(host string) []string {
mx, err := net.LookupMX(host)
if err != nil {
return []string{err.Error()}
}
var records []string
for _, record := range mx {
if record != nil {
records = append(records, record.Host)
}
}
return records
}
func lookupNS(host string) []string {
ns, err := net.LookupNS(host)
if err != nil {
return []string{err.Error()}
}
var records []string
for _, record := range ns {
if record != nil {
records = append(records, record.Host)
}
}
return records
}
func lookupTXT(host string) []string {
txt, err := net.LookupTXT(host)
if err != nil {
return []string{err.Error()}
}
return txt
}
func lookupCNAME(host string) string {
cname, err := net.LookupCNAME(host)
if err != nil {
return err.Error()
}
return cname
}