@@ -20,19 +20,21 @@ func NewGlue(s *scan.Scan, ns []structs.NSData) *Glue {
20
20
s : s ,
21
21
NS : ns ,
22
22
}
23
+
23
24
return g
24
25
}
25
26
26
27
func (g * Glue ) Scan (domain string ) {
27
-
28
28
}
29
29
30
30
func (g * Glue ) CheckParent (domain string ) (bool , []string , error ) {
31
31
parentGlue , err := g .getParentGlue (domain )
32
32
if err != nil {
33
33
return false , []string {}, err
34
34
}
35
+
35
36
ok , res := g .Compare (parentGlue )
37
+
36
38
return ok , res , nil
37
39
}
38
40
@@ -41,99 +43,129 @@ func (g *Glue) CheckSelf(domain string) (bool, []string, error) {
41
43
if err != nil {
42
44
return false , []string {}, err
43
45
}
46
+
44
47
ok , res := g .Compare (selfGlue )
48
+
45
49
return ok , res , nil
46
50
}
47
51
48
52
func (g * Glue ) CreateReport (domain string ) Report {
49
53
res := ReportResult {}
50
54
rep := Report {}
51
- var missed []string
52
- var err error
55
+
56
+ var (
57
+ missed []string
58
+ err error
59
+ )
60
+
53
61
res .Status , missed , err = g .CheckParent (domain )
62
+
54
63
res .Name = "Parent"
55
64
if err != nil {
56
65
res .Error = err .Error ()
57
66
}
67
+
58
68
if ! res .Status {
59
69
res .Result = fmt .Sprintf ("WARN: no glue records found for %s in NS of parent %s" , missed , dns .Fqdn (getParentDomain (domain )))
60
70
res .Name = "Parent"
61
71
}
72
+
62
73
if res .Error != "" {
63
74
res .Result = fmt .Sprintf ("ERR : CheckParentGlue test failed: %s" , res .Error )
64
75
}
76
+
65
77
rep .Result = append (rep .Result , res )
66
78
res = ReportResult {Result : fmt .Sprintf ("OK : glue records found for all nameservers in NS record of %s" , dns .Fqdn (domain ))}
67
79
res .Status , missed , err = g .CheckSelf (domain )
68
80
res .Name = "Self"
81
+
69
82
if ! res .Status {
70
83
res .Result = fmt .Sprintf ("WARN: no glue records found for %s in NS of %s" , missed , dns .Fqdn (domain ))
71
84
res .Name = "Self"
72
85
}
86
+
73
87
if err != nil {
74
88
res .Error = err .Error ()
75
89
}
90
+
76
91
if res .Error != "" {
77
92
res .Result = fmt .Sprintf ("ERR : CheckSelfGlue test failed: %s" , res .Error )
78
93
}
94
+
79
95
rep .Result = append (rep .Result , res )
80
96
rep .Type = "GLUE"
81
97
g .Report = rep
98
+
82
99
return rep
83
100
}
84
101
85
102
func (g * Glue ) Compare (parentGlue []net.IP ) (bool , []string ) {
86
103
var NSips []net.IP
104
+
87
105
for _ , data := range g .NS {
88
106
NSips = append (NSips , data .IP ... )
89
107
}
90
108
91
109
m := make (map [string ]bool )
110
+
92
111
var ips []string
112
+
93
113
for _ , ip := range NSips {
94
114
m [ip .String ()] = false
95
115
}
116
+
96
117
for _ , ip := range parentGlue {
97
118
m [ip .String ()] = true
98
119
}
120
+
99
121
for k , v := range m {
100
122
if ! v {
101
123
ips = append (ips , k )
102
124
}
103
125
}
126
+
104
127
if len (ips ) == 0 {
105
128
return true , ips
106
129
}
130
+
107
131
return false , ips
108
132
}
109
133
110
134
func (g * Glue ) getParentGlue (domain string ) ([]net.IP , error ) {
111
135
// TODO ask every parent
112
136
log .Debugf ("Finding NS of parent: %s" , dns .Fqdn (getParentDomain (domain )))
137
+
113
138
var ips []net.IP
139
+
114
140
nsdata , err := g .s .FindNS (getParentDomain (domain ))
115
141
if err != nil {
116
142
return ips , err
117
143
}
118
144
// asking parent about NS
119
145
log .Debugf ("Asking parent %s (%s) NS of %s" , nsdata [0 ].Info [0 ].IP .String (), getParentDomain (domain ), domain )
146
+
120
147
return g .getGlueIPs (domain , nsdata [0 ].Info [0 ].IP .String ())
121
148
}
122
149
123
150
func (g * Glue ) getSelfGlue (domain string ) ([]net.IP , error ) {
124
151
// TODO all NS
125
152
log .Debugf ("Asking self %s (%s) NS of %s" , g .NS [0 ].IP [0 ].String (), domain , domain )
153
+
126
154
return g .getGlueIPs (domain , g .NS [0 ].IP [0 ].String ())
127
155
}
128
156
129
157
func (g * Glue ) getGlueIPs (domain string , server string ) ([]net.IP , error ) {
130
158
log .Debugf ("GLUE: getGlueIPs" )
131
159
defer log .Debugf ("GLUE: getGlueIPs exit" )
160
+
132
161
var ips []net.IP
162
+
133
163
res , err := scan .Query (domain , dns .TypeNS , server , true )
134
164
if err != nil {
135
165
return ips , err
136
166
}
167
+
137
168
rrset := extractRR (res .Msg .Extra , dns .TypeA , dns .TypeAAAA )
169
+
138
170
return extractIP (rrset ), nil
139
171
}
0 commit comments