summarylogtreecommitdiffstats
path: root/0001-Incorporated-PR-from-vanmelick-to-fix-SOA-and-define.patch
blob: b5c12b332fad846e400ecd87331e6703921808a5 (plain)
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
From daab93c8d790d819e2bdbb4993ade65a9d63b6fd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C5=81aurent=20=CA=98=E2=9D=A2=C5=A6=20=C5=A6ough?=
 <laurent.fough@gmail.com>
Date: Sun, 23 Aug 2020 14:05:49 -0700
Subject: [PATCH] Incorporated PR from @vanmelick to fix SOA and defined array
 issues

---
 dnswalk | 44 +++++++++++++++++++++++---------------------
 1 file changed, 23 insertions(+), 21 deletions(-)

diff --git a/dnswalk b/dnswalk
index 356867f..94883ab 100755
--- a/dnswalk
+++ b/dnswalk
@@ -56,9 +56,9 @@ sub dowalk {
     return unless $domain;
     print "Checking $domain\n";
     @subdoms=&doaxfr($domain);
-    &check_zone($domain) if (defined(@zone) && @zone);
+    &check_zone($domain) if (@zone);
     undef @zone;
-    return if (!(defined(@subdoms) && @subdoms));
+    return if (!@subdoms);
     @sortdoms = sort byhostname @subdoms;
     local ($subdom);
     if ($opt_r) {
@@ -74,7 +74,7 @@ sub doaxfr {
     local (%subdoms)=();
     local ($subdom);
     local(@servers) = &getauthservers($domain);
-    &printerr("BAD", "$domain has only one authoritative nameserver\n") 
+    &printerr("BAD", "$domain has only one authoritative nameserver\n")
 	if (scalar(@servers) == 1);
     &printerr("BAD", "$domain has NO authoritative nameservers!\n")
 	if (scalar(@servers) == 0);
@@ -84,7 +84,7 @@ sub doaxfr {
 	my $res = new Net::DNS::Resolver;
 	$res->nameservers($server);
 	@zone=$res->axfr($domain);
-	unless (defined(@zone) && @zone) {
+	unless (@zone) {
 	    print STDERR "failed\n";
 		&printerr("FAIL",
 			"Zone transfer of $domain from $server failed: ".
@@ -104,7 +104,7 @@ sub doaxfr {
         print STDERR "done.\n";
         last SERVER;
     } # foreach #
-    unless (defined(@zone) && @zone) {
+    unless (@zone) {
 	    &printerr("BAD","All zone transfer attempts of $domain failed!\n");
 	    return undef;
     }
@@ -125,8 +125,8 @@ sub getauthservers {
     return if (!$domain);
     $res = new Net::DNS::Resolver;
     $ns_req = $res->query($domain, "NS");
-    &printerr("FAIL", "No nameservers found for $domain: ". 
-	$res->errorstring ."\n") 
+    &printerr("FAIL", "No nameservers found for $domain: ".
+	$res->errorstring ."\n")
 	    unless (defined($ns_req) and ($ns_req->header->ancount > 0));
     foreach $ns ($ns_req->answer) {
 	$ns_tmp = $ns->nsdname;
@@ -150,11 +150,11 @@ sub getmaster {
     my ($packet) = new Net::DNS::Packet($zone, "SOA", "IN");
     my ($soa_req) = $res->send($packet);
     unless (defined($soa_req)) {
-	&printerr("FAIL", "Cannot get SOA record for $zone:". 
+	&printerr("FAIL", "Cannot get SOA record for $zone:".
 	    $res->errorstring ."\n");
 	return "";
     }
-    unless (($soa_req->header->ancount >= 1) && 
+    unless (($soa_req->header->ancount >= 1) &&
 	   (($soa_req->answer)[0]->type eq "SOA")) {
 	&printerr("BAD", "SOA record not found for $zone\n");
 	return "";
@@ -180,11 +180,13 @@ sub check_zone {
         }
         if ($rr->type eq "SOA") {
 	    print STDERR 's' if $opt_d;
-	    print "SOA=". $rr->mname ."	contact=". $rr->rname ."\n";
+	    my @soa = split(/\s+/,$rr->rdstring);
+	    my $rname = $soa[1];
+	    print "SOA=". $rr->mname ."	contact=". $rname ."\n";
 	    # basic address check.  No "@", and user.dom.ain (two or more dots)
-	    if (($rr->rname =~ /@/)||!($rr->rname =~ /\..*\./)) {
-		&printerr("WARN", "SOA contact name (". 
-		    $rr->rname .") is invalid\n");
+	    if (($rname =~ /@/)||!($rname =~ /[^.]+(\.[^.]+){2,}/)) {
+		&printerr("WARN", "SOA contact name (".
+		    $rname .") is invalid\n");
 	    }
         } elsif ($rr->type eq "PTR") {
             print STDERR 'p' if $opt_d;
@@ -197,7 +199,7 @@ sub check_zone {
 			    @addrs)=gethostbyname($rr->ptrdname);
 #                   if (!(($name, $aliases, $addrtype, $length,
 #			    @addrs)=gethostbyname($rr->ptrdname))) {
-#                        &printerr("FAIL", "gethostbyname(". 
+#                        &printerr("FAIL", "gethostbyname(".
 #			    $rr->ptrdname ."): $!\n");
 #                   }
 #                   else {
@@ -206,9 +208,9 @@ sub check_zone {
 				." PTR ". $rr->ptrdname .": unknown host\n");
                         }
                         elsif (!&equal($name,$rr->ptrdname)) {
-                            &printerr("WARN", $rr->name 
+                            &printerr("WARN", $rr->name
 			      ." PTR ". $rr->ptrdname .": CNAME (to $name)\n");
-                        }    
+                        }
                         elsif (!&matchaddrlist($rr->name)) {
                             &printerr("WARN", $rr->name
 			     ." PTR ". $rr->ptrdname .": A record not found\n");
@@ -230,10 +232,10 @@ sub check_zone {
 	    }
 	    elsif ($opt_F && !&equal($name,$rr->name)) {
 		# Filter out "hostname-something" (like "neptune-le0")
-		if (index(split (/\./, $rr->name, 2) . "-", 
+		if (index(split (/\./, $rr->name, 2) . "-",
 			    split (/\./, $name, 2)) == -1 ) {
-			&printerr("WARN", $rr->name ." A ". 
-			    $rr->address .": points to $name\n") 
+			&printerr("WARN", $rr->name ." A ".
+			    $rr->address .": points to $name\n")
 			    if ((split(/\./,$name))[0] ne "localhost");
 		}
 	    }
@@ -408,7 +410,7 @@ sub checklamer {
 		$res->errorstring ."\n");
 	return;
     }
-    &printerr("BAD", "$zone NS $nameserver: lame NS delegation\n") 
+    &printerr("BAD", "$zone NS $nameserver: lame NS delegation\n")
 	unless ($soa_req->header->aa);
     return;
-}
+}
\ No newline at end of file
-- 
2.28.0