Skip to content

Commit c3e31a0

Browse files
committed
moved more code to modules
1 parent 958eb96 commit c3e31a0

File tree

10 files changed

+197
-190
lines changed

10 files changed

+197
-190
lines changed

axfr.go

+13-30
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package main
22

33
import (
44
"allxfr/save"
5+
"allxfr/zone"
56
"fmt"
67
"log"
78
"net"
@@ -14,22 +15,20 @@ import (
1415
)
1516

1617
// axfrWorker iterate through all possabilities and queries attempting an AXFR
17-
func axfrWorker(z zone, domain string) error {
18+
func axfrWorker(z zone.Zone, domain string) error {
1819
ips := make(map[string]bool)
1920
domain = dns.Fqdn(domain)
2021
var err error
2122
var records int64
22-
for _, nameserver := range z.ns[domain] {
23-
for _, ip := range z.ip[nameserver] {
23+
for _, nameserver := range z.NS[domain] {
24+
for _, ip := range z.IP[nameserver] {
2425
ipString := string(ip.To16())
2526
if !ips[ipString] {
2627
ips[ipString] = true
2728
for try := 0; try < *retry; try++ {
2829
records, err = axfr(domain, nameserver, ip)
2930
if err != nil {
30-
if *verbose {
31-
log.Printf("[%s] %s", domain, err)
32-
}
31+
v("[%s] %s", domain, err)
3332
} else {
3433
if records != 0 {
3534
break
@@ -52,9 +51,7 @@ func axfrWorker(z zone, domain string) error {
5251
for try := 0; try < *retry; try++ {
5352
qNameservers, err = queryNS(localNameserver, domain)
5453
if err != nil {
55-
if *verbose {
56-
log.Printf("[%s] %s", domain, err)
57-
}
54+
v("[%s] %s", domain, err)
5855
} else {
5956
break
6057
}
@@ -66,9 +63,7 @@ func axfrWorker(z zone, domain string) error {
6663
for try := 0; try < *retry; try++ {
6764
qIPs, err = queryIP(localNameserver, nameserver)
6865
if err != nil {
69-
if *verbose {
70-
log.Printf("[%s] %s", domain, err)
71-
}
66+
v("[%s] %s", domain, err)
7267
} else {
7368
break
7469
}
@@ -80,14 +75,10 @@ func axfrWorker(z zone, domain string) error {
8075
if !ips[ipString] {
8176
ips[ipString] = true
8277
for try := 0; try < *retry; try++ {
83-
if *verbose {
84-
log.Printf("[%s] trying AXFR: %s %s", domain, nameserver, ip.String())
85-
}
78+
v("[%s] trying AXFR: %s %s", domain, nameserver, ip.String())
8679
records, err = axfr(domain, nameserver, ip)
8780
if err != nil {
88-
if *verbose {
89-
log.Printf("[%s] %s", domain, err)
90-
}
81+
v("[%s] %s", domain, err)
9182
} else {
9283
if records != 0 {
9384
break
@@ -138,9 +129,7 @@ func axfrToFile(zone string, ip net.IP, nameserver string) (int64, error) {
138129
if err != nil {
139130
// skip on this error
140131
err = fmt.Errorf("transfer error from zone: %s ip: %s: %w", zone, ip.String(), err)
141-
if *verbose {
142-
log.Printf("[%s] %s", zone, err)
143-
}
132+
v("[%s] %s", zone, err)
144133
return 0, nil
145134
}
146135

@@ -153,17 +142,13 @@ func axfrToFile(zone string, ip net.IP, nameserver string) (int64, error) {
153142
}
154143
if !*overwrite {
155144
if _, err := os.Stat(filename); err == nil || !os.IsNotExist(err) {
156-
if *verbose {
157-
log.Printf("[%s] file %q exists, skipping", zone, filename)
158-
}
145+
v("[%s] file %q exists, skipping", zone, filename)
159146
return -1, nil
160147
}
161148
}
162149

163150
var envelope int64
164-
if *verbose {
165-
log.Printf("saving zone %q to file %s", zone, filename)
166-
}
151+
v("saving zone %q to file %s", zone, filename)
167152
zonefile := save.New(zone, filename)
168153
defer func() {
169154
err = zonefile.WriteComment("envelopes", fmt.Sprintf("%d", envelope))
@@ -197,9 +182,7 @@ func axfrToFile(zone string, ip net.IP, nameserver string) (int64, error) {
197182
if e.Error != nil {
198183
// skip on this error
199184
err = fmt.Errorf("transfer envelope error from zone: %s ip: %s (rec: %d, envelope: %d): %w", zone, ip.String(), zonefile.Records(), envelope, e.Error)
200-
if *verbose {
201-
log.Printf("[%s] %s", zone, err)
202-
}
185+
v("[%s] %s", zone, err)
203186
err = nil
204187
break
205188
}

go.mod

+6-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@ module allxfr
33
go 1.13
44

55
require (
6-
github.com/miekg/dns v1.1.30
6+
github.com/miekg/dns v1.1.38
77
github.com/weppos/publicsuffix-go v0.13.0
8-
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208
8+
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad // indirect
9+
golang.org/x/net v0.0.0-20210119194325-5f4716e94777 // indirect
10+
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a
11+
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c // indirect
12+
golang.org/x/text v0.3.5 // indirect
913
)

go.sum

+18
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,42 @@
11
github.com/miekg/dns v1.1.30 h1:Qww6FseFn8PRfw07jueqIXqodm0JKiiKuK0DeXSqfyo=
22
github.com/miekg/dns v1.1.30/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
3+
github.com/miekg/dns v1.1.38 h1:MtIY+fmHUVVgv1AXzmKMWcwdCYxTRPG1EDjpqF4RCEw=
4+
github.com/miekg/dns v1.1.38/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
35
github.com/weppos/publicsuffix-go v0.13.0 h1:0Tu1uzLBd1jPn4k6OnMmOPZH/l/9bj9kUOMMkoRs6Gg=
46
github.com/weppos/publicsuffix-go v0.13.0/go.mod h1:z3LCPQ38eedDQSwmsSRW4Y7t2L8Ln16JPQ02lHAdn5k=
57
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
68
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8=
79
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
10+
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY=
11+
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
812
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
913
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
1014
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
1115
golang.org/x/net v0.0.0-20190923162816-aa69164e4478 h1:l5EDrHhldLYb3ZRHDUhXF7Om7MvYXnkV9/iQNo1lX6g=
1216
golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
17+
golang.org/x/net v0.0.0-20210119194325-5f4716e94777 h1:003p0dJM77cxMSyCPFphvZf/Y5/NXf5fzg6ufd1/Oew=
18+
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
1319
golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
1420
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
1521
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 h1:qwRHBd0NqMbJxfbotnDhm2ByMI1Shq4Y6oRJo21SGJA=
1622
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
23+
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a h1:DcqTD9SDLc+1P/r1EmRBwnVsrOwW+kk2vWf9n+1sGhs=
24+
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
1725
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
1826
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
1927
golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe h1:6fAMxZRR6sl1Uq8U61gxU+kPTs2tR8uOySCbBP7BN/M=
2028
golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
29+
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
30+
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
31+
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk=
32+
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
33+
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
34+
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
2135
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
2236
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
37+
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
38+
golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ=
39+
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
40+
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
2341
golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
2442
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

main.go

+26-22
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
package main
22

33
import (
4+
"allxfr/psl"
5+
"allxfr/zone"
46
"flag"
7+
"fmt"
58
"log"
69
"net"
710
"os"
11+
"strings"
812
"time"
913

1014
"github.com/miekg/dns"
@@ -18,7 +22,7 @@ var (
1822
zonefile = flag.String("zonefile", "", "use the provided zonefile instead of getting the root zonefile")
1923
ns = flag.String("ns", "", "nameserver to use for manually querying of records not in zone file")
2024
saveAll = flag.Bool("save-all", false, "attempt AXFR from every nameserver for a given zone and save all answers")
21-
psl = flag.Bool("psl", false, "attempt AXFR from zones listed in the public suffix list, requires -ns flag")
25+
usePSL = flag.Bool("psl", false, "attempt AXFR from zones listed in the public suffix list, requires -ns flag")
2226
ixfr = flag.Bool("ixfr", false, "attempt an IXFR instead of AXFR")
2327
dryRun = flag.Bool("dry-run", false, "only test if xfr is allowed by retrieving one envelope")
2428
retry = flag.Int("retry", 3, "number of times to retry failed operations")
@@ -37,7 +41,7 @@ const (
3741
func main() {
3842
//log.SetFlags(0)
3943
flag.Parse()
40-
if *psl && len(*ns) == 0 {
44+
if *usePSL && len(*ns) == 0 {
4145
log.Fatal("must pass nameserver with -ns when using -psl")
4246
}
4347
if *retry < 1 {
@@ -49,45 +53,39 @@ func main() {
4953
var err error
5054
localNameserver, err = getNameserver()
5155
check(err)
52-
if *verbose {
53-
log.Printf("using initial nameserver %s", localNameserver)
54-
}
56+
v("using initial nameserver %s", localNameserver)
5557

5658
start := time.Now()
57-
var z zone
59+
var z zone.Zone
5860
if len(*zonefile) == 0 {
59-
rootNameservers, err := getRootServers()
61+
rootNameservers, err := zone.GetRootServers(localNameserver)
6062
check(err)
6163
// get zone file from root AXFR
6264
// not all the root nameservers allow AXFR, try them until we find one that does
6365
for _, ns := range rootNameservers {
64-
if *verbose {
65-
log.Printf("trying root nameserver %s", ns)
66-
}
67-
z, err = rootAXFR(ns)
66+
v("trying root nameserver %s", ns)
67+
z, err = zone.RootAXFR(ns)
6868
if err == nil {
6969
break
7070
}
7171
}
7272
} else {
7373
// zone file is provided
74-
z, err = parseZoneFile(*zonefile)
74+
z, err = zone.ParseZoneFile(*zonefile)
7575
check(err)
7676
}
7777

7878
if z.CountNS() == 0 {
7979
log.Fatal("Got empty zone")
8080
}
8181

82-
if *psl {
83-
pslDomains, err := getPSLDomsins()
82+
if *usePSL {
83+
pslDomains, err := psl.GetDomains()
8484
check(err)
8585
for _, domain := range pslDomains {
8686
z.AddNS(domain, "")
8787
}
88-
if *verbose {
89-
log.Printf("added %d domains from PSL\n", len(pslDomains))
90-
}
88+
v("added %d domains from PSL\n", len(pslDomains))
9189
}
9290

9391
// create outpout dir if does not exist
@@ -113,13 +111,11 @@ func main() {
113111
err = g.Wait()
114112
check(err)
115113
took := time.Since(start).Round(time.Millisecond)
116-
log.Printf("%d / %d transferred in %s\n", totalXFR, len(z.ns), took.String())
117-
if *verbose {
118-
log.Printf("exiting normally\n")
119-
}
114+
log.Printf("%d / %d transferred in %s\n", totalXFR, len(z.NS), took.String())
115+
v("exiting normally\n")
120116
}
121117

122-
func worker(z zone, c chan string) error {
118+
func worker(z zone.Zone, c chan string) error {
123119
for {
124120
domain, more := <-c
125121
if !more {
@@ -138,6 +134,14 @@ func check(err error) {
138134
}
139135
}
140136

137+
func v(format string, v ...interface{}) {
138+
if *verbose {
139+
line := fmt.Sprintf(format, v...)
140+
lines := strings.ReplaceAll(line, "\n", "\n\t")
141+
log.Print(lines)
142+
}
143+
}
144+
141145
// getNameserver returns the nameserver passed via flag if provided, if not returns the system's NS
142146
func getNameserver() (string, error) {
143147
var server string

psl.go psl/psl.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package main
1+
package psl
22

33
import (
44
"net/http"
@@ -9,7 +9,7 @@ import (
99

1010
const pslURL = "https://publicsuffix.org/list/public_suffix_list.dat"
1111

12-
func getPSLDomsins() ([]string, error) {
12+
func GetDomains() ([]string, error) {
1313
resp, err := http.Get(pslURL)
1414
if err != nil {
1515
return nil, err

query.go

+6-19
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package main
22

33
import (
4-
"log"
54
"net"
65
"strings"
76

@@ -22,9 +21,7 @@ func init() {
2221

2322
func queryNS(server, domain string) ([]string, error) {
2423
domain = dns.Fqdn(domain)
25-
if *verbose {
26-
log.Printf("dns query: @%s NS %s", server, domain)
27-
}
24+
v("dns query: @%s NS %s", server, domain)
2825
m := new(dns.Msg)
2926
m.SetQuestion(domain, dns.TypeNS)
3027

@@ -36,9 +33,7 @@ func queryNS(server, domain string) ([]string, error) {
3633
out := make([]string, 0, 2)
3734
for i := range in.Answer {
3835
if t, ok := in.Answer[i].(*dns.NS); ok {
39-
if *verbose {
40-
log.Printf("dns answer NS @%s\t%s:\t%s\n", server, domain, t.Ns)
41-
}
36+
v("dns answer NS @%s\t%s:\t%s\n", server, domain, t.Ns)
4237
t.Ns = strings.ToLower(t.Ns)
4338
out = append(out, t.Ns)
4439
}
@@ -49,9 +44,7 @@ func queryNS(server, domain string) ([]string, error) {
4944

5045
func queryA(server, domain string) ([]net.IP, error) {
5146
domain = dns.Fqdn(domain)
52-
if *verbose {
53-
log.Printf("dns query: @%s A %s", server, domain)
54-
}
47+
v("dns query: @%s A %s", server, domain)
5548
m := new(dns.Msg)
5649
m.SetQuestion(domain, dns.TypeA)
5750

@@ -63,9 +56,7 @@ func queryA(server, domain string) ([]net.IP, error) {
6356
out := make([]net.IP, 0, 1)
6457
for i := range in.Answer {
6558
if t, ok := in.Answer[i].(*dns.A); ok {
66-
if *verbose {
67-
log.Printf("dns answer A @%s\t%s:\t%s\n", server, domain, t.A.String())
68-
}
59+
v("dns answer A @%s\t%s:\t%s\n", server, domain, t.A.String())
6960
out = append(out, t.A)
7061
}
7162
}
@@ -75,9 +66,7 @@ func queryA(server, domain string) ([]net.IP, error) {
7566

7667
func queryAAAA(server, domain string) ([]net.IP, error) {
7768
domain = dns.Fqdn(domain)
78-
if *verbose {
79-
log.Printf("dns query: @%s AAAA %s", server, domain)
80-
}
69+
v("dns query: @%s AAAA %s", server, domain)
8170
m := new(dns.Msg)
8271
m.SetQuestion(domain, dns.TypeAAAA)
8372

@@ -89,9 +78,7 @@ func queryAAAA(server, domain string) ([]net.IP, error) {
8978
out := make([]net.IP, 0, 1)
9079
for i := range in.Answer {
9180
if t, ok := in.Answer[i].(*dns.AAAA); ok {
92-
if *verbose {
93-
log.Printf("dns answer AAAA @%s\t%s:\t%s\n", server, domain, t.AAAA.String())
94-
}
81+
v("dns answer AAAA @%s\t%s:\t%s\n", server, domain, t.AAAA.String())
9582
out = append(out, t.AAAA)
9683
}
9784
}

0 commit comments

Comments
 (0)