dnstraverse 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +61 -18
- data/bin/dnstraverse +30 -57
- data/lib/dnstraverse/caching_resolver.rb +2 -4
- data/lib/dnstraverse/decoded_query.rb +1 -0
- data/lib/dnstraverse/fingerprint.rb +1 -3
- data/lib/dnstraverse/fingerprint_rules.rb +249 -224
- data/lib/dnstraverse/message_utility.rb +20 -15
- data/lib/dnstraverse/referral.rb +32 -12
- data/lib/dnstraverse/response.rb +3 -1
- data/lib/dnstraverse/summary_stats.rb +94 -0
- data/lib/dnstraverse/traverser.rb +20 -20
- data/lib/dnstraverse/version.rb +8 -0
- metadata +101 -180
- data/a +0 -44
- data/doc.tar +0 -0
- data/doc/classes/DNSTraverse.html +0 -198
- data/doc/classes/DNSTraverse/CachingResolver.html +0 -172
- data/doc/classes/DNSTraverse/CachingResolver.src/M000055.html +0 -21
- data/doc/classes/DNSTraverse/CachingResolver.src/M000056.html +0 -42
- data/doc/classes/DNSTraverse/DecodedQuery.html +0 -475
- data/doc/classes/DNSTraverse/DecodedQuery.src/M000020.html +0 -34
- data/doc/classes/DNSTraverse/DecodedQuery.src/M000021.html +0 -23
- data/doc/classes/DNSTraverse/DecodedQuery.src/M000022.html +0 -19
- data/doc/classes/DNSTraverse/DecodedQuery.src/M000023.html +0 -33
- data/doc/classes/DNSTraverse/DecodedQuery.src/M000024.html +0 -26
- data/doc/classes/DNSTraverse/DecodedQuery.src/M000025.html +0 -24
- data/doc/classes/DNSTraverse/DecodedQuery.src/M000026.html +0 -29
- data/doc/classes/DNSTraverse/DecodedQuery.src/M000027.html +0 -19
- data/doc/classes/DNSTraverse/DecodedQuery.src/M000028.html +0 -18
- data/doc/classes/DNSTraverse/DecodedQuery.src/M000029.html +0 -32
- data/doc/classes/DNSTraverse/DecodedQuery.src/M000030.html +0 -19
- data/doc/classes/DNSTraverse/DecodedQuery.src/M000031.html +0 -19
- data/doc/classes/DNSTraverse/DecodedQuery.src/M000032.html +0 -20
- data/doc/classes/DNSTraverse/DecodedQuery.src/M000033.html +0 -31
- data/doc/classes/DNSTraverse/DecodedQueryCache.html +0 -182
- data/doc/classes/DNSTraverse/DecodedQueryCache.src/M000063.html +0 -21
- data/doc/classes/DNSTraverse/DecodedQueryCache.src/M000064.html +0 -33
- data/doc/classes/DNSTraverse/Fingerprint.html +0 -277
- data/doc/classes/DNSTraverse/Fingerprint.src/M000047.html +0 -29
- data/doc/classes/DNSTraverse/Fingerprint.src/M000048.html +0 -18
- data/doc/classes/DNSTraverse/Fingerprint.src/M000049.html +0 -57
- data/doc/classes/DNSTraverse/Fingerprint.src/M000050.html +0 -28
- data/doc/classes/DNSTraverse/Fingerprint.src/M000051.html +0 -27
- data/doc/classes/DNSTraverse/Fingerprint.src/M000052.html +0 -35
- data/doc/classes/DNSTraverse/Fingerprint.src/M000053.html +0 -24
- data/doc/classes/DNSTraverse/Fingerprint.src/M000054.html +0 -29
- data/doc/classes/DNSTraverse/InfoCache.html +0 -235
- data/doc/classes/DNSTraverse/InfoCache.src/M000034.html +0 -20
- data/doc/classes/DNSTraverse/InfoCache.src/M000035.html +0 -23
- data/doc/classes/DNSTraverse/InfoCache.src/M000036.html +0 -28
- data/doc/classes/DNSTraverse/InfoCache.src/M000037.html +0 -25
- data/doc/classes/DNSTraverse/InfoCache.src/M000038.html +0 -27
- data/doc/classes/DNSTraverse/InfoCache.src/M000039.html +0 -33
- data/doc/classes/DNSTraverse/MessageUtility.html +0 -275
- data/doc/classes/DNSTraverse/MessageUtility.src/M000011.html +0 -35
- data/doc/classes/DNSTraverse/MessageUtility.src/M000012.html +0 -37
- data/doc/classes/DNSTraverse/MessageUtility.src/M000013.html +0 -28
- data/doc/classes/DNSTraverse/MessageUtility.src/M000014.html +0 -27
- data/doc/classes/DNSTraverse/MessageUtility.src/M000015.html +0 -30
- data/doc/classes/DNSTraverse/MessageUtility.src/M000016.html +0 -32
- data/doc/classes/DNSTraverse/MessageUtility.src/M000017.html +0 -34
- data/doc/classes/DNSTraverse/MessageUtility.src/M000018.html +0 -23
- data/doc/classes/DNSTraverse/MessageUtility.src/M000019.html +0 -36
- data/doc/classes/DNSTraverse/Referral.html +0 -641
- data/doc/classes/DNSTraverse/Referral.src/M000065.html +0 -22
- data/doc/classes/DNSTraverse/Referral.src/M000066.html +0 -21
- data/doc/classes/DNSTraverse/Referral.src/M000067.html +0 -23
- data/doc/classes/DNSTraverse/Referral.src/M000068.html +0 -19
- data/doc/classes/DNSTraverse/Referral.src/M000069.html +0 -18
- data/doc/classes/DNSTraverse/Referral.src/M000070.html +0 -54
- data/doc/classes/DNSTraverse/Referral.src/M000071.html +0 -25
- data/doc/classes/DNSTraverse/Referral.src/M000072.html +0 -27
- data/doc/classes/DNSTraverse/Referral.src/M000073.html +0 -23
- data/doc/classes/DNSTraverse/Referral.src/M000074.html +0 -20
- data/doc/classes/DNSTraverse/Referral.src/M000075.html +0 -40
- data/doc/classes/DNSTraverse/Referral.src/M000076.html +0 -52
- data/doc/classes/DNSTraverse/Referral.src/M000077.html +0 -29
- data/doc/classes/DNSTraverse/Referral.src/M000078.html +0 -54
- data/doc/classes/DNSTraverse/Referral.src/M000079.html +0 -18
- data/doc/classes/DNSTraverse/Referral.src/M000080.html +0 -22
- data/doc/classes/DNSTraverse/Referral.src/M000081.html +0 -20
- data/doc/classes/DNSTraverse/Referral.src/M000082.html +0 -29
- data/doc/classes/DNSTraverse/Referral.src/M000083.html +0 -28
- data/doc/classes/DNSTraverse/Referral.src/M000084.html +0 -29
- data/doc/classes/DNSTraverse/Referral.src/M000085.html +0 -55
- data/doc/classes/DNSTraverse/Referral.src/M000086.html +0 -30
- data/doc/classes/DNSTraverse/Referral.src/M000087.html +0 -24
- data/doc/classes/DNSTraverse/Referral.src/M000088.html +0 -20
- data/doc/classes/DNSTraverse/Referral.src/M000089.html +0 -58
- data/doc/classes/DNSTraverse/ResolveError.html +0 -111
- data/doc/classes/DNSTraverse/Response.html +0 -271
- data/doc/classes/DNSTraverse/Response.src/M000057.html +0 -27
- data/doc/classes/DNSTraverse/Response.src/M000058.html +0 -21
- data/doc/classes/DNSTraverse/Response.src/M000059.html +0 -19
- data/doc/classes/DNSTraverse/Response.src/M000060.html +0 -21
- data/doc/classes/DNSTraverse/Response.src/M000061.html +0 -31
- data/doc/classes/DNSTraverse/Response.src/M000062.html +0 -23
- data/doc/classes/DNSTraverse/Response/NoGlue.html +0 -222
- data/doc/classes/DNSTraverse/Response/NoGlue.src/M000007.html +0 -32
- data/doc/classes/DNSTraverse/Response/NoGlue.src/M000008.html +0 -18
- data/doc/classes/DNSTraverse/Response/NoGlue.src/M000009.html +0 -18
- data/doc/classes/DNSTraverse/Response/NoGlue.src/M000010.html +0 -18
- data/doc/classes/DNSTraverse/Traverser.html +0 -247
- data/doc/classes/DNSTraverse/Traverser.src/M000040.html +0 -17
- data/doc/classes/DNSTraverse/Traverser.src/M000041.html +0 -52
- data/doc/classes/DNSTraverse/Traverser.src/M000042.html +0 -61
- data/doc/classes/DNSTraverse/Traverser.src/M000043.html +0 -110
- data/doc/classes/DNSTraverse/Traverser.src/M000044.html +0 -63
- data/doc/classes/DNSTraverse/Traverser.src/M000045.html +0 -28
- data/doc/classes/DNSTraverse/Traverser.src/M000046.html +0 -18
- data/doc/classes/FingerprintRules.html +0 -175
- data/doc/classes/Log.html +0 -174
- data/doc/classes/Log.src/M000002.html +0 -18
- data/doc/classes/Log.src/M000003.html +0 -18
- data/doc/classes/Log.src/M000004.html +0 -18
- data/doc/classes/Log/Formatter.html +0 -165
- data/doc/classes/Log/Formatter.src/M000005.html +0 -22
- data/doc/classes/Log/Formatter.src/M000006.html +0 -24
- data/doc/classes/TestFingerprint.html +0 -137
- data/doc/classes/TestFingerprint.src/M000001.html +0 -22
- data/doc/created.rid +0 -1
- data/doc/files/lib/dnstraverse/caching_resolver_rb.html +0 -132
- data/doc/files/lib/dnstraverse/decoded_query_cache_rb.html +0 -132
- data/doc/files/lib/dnstraverse/decoded_query_rb.html +0 -132
- data/doc/files/lib/dnstraverse/fingerprint_rb.html +0 -134
- data/doc/files/lib/dnstraverse/fingerprint_rules_rb.html +0 -143
- data/doc/files/lib/dnstraverse/info_cache_rb.html +0 -131
- data/doc/files/lib/dnstraverse/log_rb.html +0 -131
- data/doc/files/lib/dnstraverse/message_utility_rb.html +0 -124
- data/doc/files/lib/dnstraverse/referral_rb.html +0 -134
- data/doc/files/lib/dnstraverse/response_noglue_rb.html +0 -124
- data/doc/files/lib/dnstraverse/response_rb.html +0 -132
- data/doc/files/lib/dnstraverse/traverser_rb.html +0 -137
- data/doc/files/test/test_fingerprint_rb.html +0 -133
- data/doc/fr_class_index.html +0 -43
- data/doc/fr_file_index.html +0 -39
- data/doc/fr_method_index.html +0 -115
- data/doc/index.html +0 -24
- data/doc/rdoc-style.css +0 -208
|
@@ -24,15 +24,15 @@ module DNSTraverse
|
|
|
24
24
|
warnings = Array.new
|
|
25
25
|
if args[:want_recursion] then
|
|
26
26
|
if not msg.header.ra then
|
|
27
|
-
warnings
|
|
27
|
+
warnings << "#{msg.answerfrom} doesn't allow recursion"
|
|
28
28
|
end
|
|
29
29
|
else
|
|
30
30
|
if msg.header.ra then
|
|
31
|
-
warnings
|
|
31
|
+
warnings << "#{msg.answerfrom} allows recursion"
|
|
32
32
|
end
|
|
33
33
|
end
|
|
34
34
|
if msg.header.tc then
|
|
35
|
-
warnings
|
|
35
|
+
warnings << "#{msg.answerfrom} sent truncated packet"
|
|
36
36
|
end
|
|
37
37
|
for warn in warnings do
|
|
38
38
|
Log.warn { warn }
|
|
@@ -134,11 +134,11 @@ module DNSTraverse
|
|
|
134
134
|
type = rr.type.to_s
|
|
135
135
|
klass = rr.klass.to_s
|
|
136
136
|
if type.casecmp('NS') == 0 && klass.casecmp('IN') == 0
|
|
137
|
-
ns
|
|
137
|
+
ns << rr
|
|
138
138
|
elsif type.casecmp('SOA') == 0 && klass.casecmp('IN') == 0
|
|
139
|
-
soa
|
|
139
|
+
soa << rr
|
|
140
140
|
else
|
|
141
|
-
other
|
|
141
|
+
other << rr
|
|
142
142
|
end
|
|
143
143
|
end
|
|
144
144
|
return ns, soa, other
|
|
@@ -173,26 +173,31 @@ module DNSTraverse
|
|
|
173
173
|
return false
|
|
174
174
|
end
|
|
175
175
|
|
|
176
|
-
def msg_cacheable(msg, bailiwick, type = :
|
|
177
|
-
good, bad =
|
|
176
|
+
def msg_cacheable(msg, bailiwick, type = :all)
|
|
177
|
+
good, bad, other = [], [], []
|
|
178
178
|
bw = bailiwick.to_s
|
|
179
179
|
bwend = "." + bw
|
|
180
|
-
for section in [:
|
|
180
|
+
for section in [:answer, :authority, :additional] do
|
|
181
181
|
for rr in msg.send(section) do
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
name =~ /#{bwend}$/i then
|
|
185
|
-
good.push rr
|
|
182
|
+
if rr.type.to_s == "OPT" then
|
|
183
|
+
other << rr
|
|
186
184
|
else
|
|
187
|
-
|
|
185
|
+
name = rr.name.to_s
|
|
186
|
+
if bailiwick.nil? or name.casecmp(bw) == 0 or
|
|
187
|
+
name =~ /#{bwend}$/i then
|
|
188
|
+
good << rr
|
|
189
|
+
else
|
|
190
|
+
bad << rr
|
|
191
|
+
end
|
|
188
192
|
end
|
|
189
193
|
end
|
|
190
194
|
end
|
|
191
195
|
good.map {|x| Log.debug { "Records within bailiwick: " + x.to_s } }
|
|
192
196
|
bad.map {|x| Log.debug { "Records outside bailiwick: " + x.to_s } }
|
|
197
|
+
other.map {|x| Log.debug { "Other records discarded: " + x.to_s } }
|
|
193
198
|
return good if type == :good
|
|
194
199
|
return bad if type == :bad
|
|
195
|
-
return good, bad
|
|
200
|
+
return good, bad, other
|
|
196
201
|
end
|
|
197
202
|
|
|
198
203
|
end
|
data/lib/dnstraverse/referral.rb
CHANGED
|
@@ -17,6 +17,7 @@ require 'dnstraverse/response'
|
|
|
17
17
|
require 'dnstraverse/response_noglue'
|
|
18
18
|
require 'dnstraverse/info_cache'
|
|
19
19
|
require 'dnstraverse/decoded_query_cache'
|
|
20
|
+
require 'dnstraverse/summary_stats'
|
|
20
21
|
|
|
21
22
|
module DNSTraverse
|
|
22
23
|
|
|
@@ -24,9 +25,11 @@ module DNSTraverse
|
|
|
24
25
|
include MessageUtility
|
|
25
26
|
|
|
26
27
|
attr_reader :server, :serverips, :qname, :qclass, :qtype, :nsatype
|
|
27
|
-
attr_reader :refid, :
|
|
28
|
+
attr_reader :refid, :refkey, :infocache, :parent, :bailiwick
|
|
28
29
|
attr_reader :warnings, :children, :parent_ip
|
|
29
30
|
attr_reader :decoded_query_cache
|
|
31
|
+
attr_reader :responses
|
|
32
|
+
attr_reader :stats
|
|
30
33
|
|
|
31
34
|
EMPTY_ARRAY = [].freeze
|
|
32
35
|
|
|
@@ -88,7 +91,8 @@ module DNSTraverse
|
|
|
88
91
|
@infocache = args[:infocache] || DNSTraverse::InfoCache.new
|
|
89
92
|
@roots = args[:roots]
|
|
90
93
|
@resolves = nil # Array of referral objects for resolving phase
|
|
91
|
-
@refid = args[:refid] || ''
|
|
94
|
+
@refid = args[:refid] || '' # node identifier, e.g. 1.2.1
|
|
95
|
+
@refkey = args[:refkey] || '' # node key, e.g. 3.4.3 (maximums)
|
|
92
96
|
@server = args[:server] || nil # nil for the root-root server
|
|
93
97
|
@serverips = args[:serverips] || nil
|
|
94
98
|
@responses = Hash.new # responses/exception for each IP in @serverips
|
|
@@ -105,6 +109,7 @@ module DNSTraverse
|
|
|
105
109
|
@serverweights = Hash.new # key is IP
|
|
106
110
|
@warnings = Array.new # warnings will be placed here
|
|
107
111
|
@processed = false # flag for processed? method
|
|
112
|
+
@calculated = false # flag for calculated? method
|
|
108
113
|
raise "Must pass Resolver" unless @resolver
|
|
109
114
|
@infocache.add_hints('', args[:roots]) if args[:roots] # add root hints
|
|
110
115
|
unless @decoded_query_cache then
|
|
@@ -168,7 +173,6 @@ module DNSTraverse
|
|
|
168
173
|
" of #{bailiwick} - no glue record provided" }
|
|
169
174
|
return Array.new
|
|
170
175
|
end
|
|
171
|
-
refid = "#{@refid}.0"
|
|
172
176
|
child_refid = 1
|
|
173
177
|
starters, newbailiwick = @infocache.get_startservers(@server)
|
|
174
178
|
Log.debug { "Resolving #{@server} type #{@nsatype} " }
|
|
@@ -177,8 +181,10 @@ module DNSTraverse
|
|
|
177
181
|
:serverips => starter[:ips],
|
|
178
182
|
:referral_resolution => true,
|
|
179
183
|
:qname => @server, :qclass => 'IN',
|
|
180
|
-
|
|
181
|
-
|
|
184
|
+
:qtype => @nsatype,
|
|
185
|
+
:bailiwick => newbailiwick,
|
|
186
|
+
:refid => "#{@refid}.0.#{child_refid}",
|
|
187
|
+
:refkey => "#{@refkey}.0.#{starters.count}")
|
|
182
188
|
(@resolves||= []) << r
|
|
183
189
|
child_refid+= 1
|
|
184
190
|
end
|
|
@@ -249,6 +255,7 @@ module DNSTraverse
|
|
|
249
255
|
@stats.each_pair do |key, data|
|
|
250
256
|
Log.debug { sprintf "Answer: %.2f%% %s\n", data[:prob] * 100, key }
|
|
251
257
|
end
|
|
258
|
+
@calculated = true
|
|
252
259
|
return
|
|
253
260
|
end
|
|
254
261
|
for ip in @serverips do
|
|
@@ -277,12 +284,17 @@ module DNSTraverse
|
|
|
277
284
|
@stats.each_pair do |key, data|
|
|
278
285
|
Log.debug { sprintf "Answer: %.2f%% %s\n", data[:prob] * 100, key }
|
|
279
286
|
end
|
|
287
|
+
@calculated = true
|
|
280
288
|
end
|
|
281
289
|
|
|
282
290
|
def processed?
|
|
283
291
|
return @processed
|
|
284
292
|
end
|
|
285
293
|
|
|
294
|
+
def calculated?
|
|
295
|
+
return @calculated
|
|
296
|
+
end
|
|
297
|
+
|
|
286
298
|
def resolved?
|
|
287
299
|
# root-root is always resolved, otherwise check we have IP addresses
|
|
288
300
|
return true if is_rootroot?
|
|
@@ -314,15 +326,16 @@ module DNSTraverse
|
|
|
314
326
|
|
|
315
327
|
def process_add_roots(args)
|
|
316
328
|
Log.debug { "Special case processing, addding roots as referrals" }
|
|
317
|
-
|
|
318
|
-
|
|
329
|
+
dot = @refid == '' ? '' : "."
|
|
330
|
+
child_refid = 1
|
|
319
331
|
starters = (@infocache.get_startservers('', @nsatype))[0]
|
|
320
332
|
@children[:rootroot] = Array.new # use 'rootroot' instead of IP address
|
|
321
333
|
for root in starters do
|
|
322
334
|
r = make_referral(:server => root[:name], :serverips => root[:ips],
|
|
323
|
-
:refid => "#{
|
|
335
|
+
:refid => "#{@refid}#{dot}#{child_refid}",
|
|
336
|
+
:refkey => "#{@refkey}#{dot}#{starters.count}")
|
|
324
337
|
@children[:rootroot].push r
|
|
325
|
-
|
|
338
|
+
child_refid+= 1
|
|
326
339
|
end
|
|
327
340
|
end
|
|
328
341
|
|
|
@@ -390,7 +403,8 @@ module DNSTraverse
|
|
|
390
403
|
refargs = {
|
|
391
404
|
:server => starter[:name],
|
|
392
405
|
:serverips => starter[:ips],
|
|
393
|
-
:refid => "#{refid}.#{child_refid}"
|
|
406
|
+
:refid => "#{@refid}.#{child_refid}",
|
|
407
|
+
:refkey => "#{@refkey}.#{starters.count}"
|
|
394
408
|
}.merge(args)
|
|
395
409
|
children.push make_referral(refargs)
|
|
396
410
|
child_refid+= 1
|
|
@@ -400,6 +414,7 @@ module DNSTraverse
|
|
|
400
414
|
|
|
401
415
|
def make_referral(args)
|
|
402
416
|
raise "Must pass new refid" unless args[:refid]
|
|
417
|
+
raise "Must pass new refkey" unless args[:refkey]
|
|
403
418
|
refargs = { :qname => @qname, :qclass => @qclass,
|
|
404
419
|
:qtype => @qtype, :nsatype => @nsatype, :infocache => @infocache,
|
|
405
420
|
:referral_resolution => @referral_resolution,
|
|
@@ -437,7 +452,7 @@ module DNSTraverse
|
|
|
437
452
|
when :error
|
|
438
453
|
puts "#{response.error_message} at #{where}"
|
|
439
454
|
when :nodata
|
|
440
|
-
puts "NODATA (for this type) at #{where}
|
|
455
|
+
puts "NODATA (for this type) at #{where}"
|
|
441
456
|
when :answered
|
|
442
457
|
puts "Answer from #{where}"
|
|
443
458
|
if results then
|
|
@@ -457,7 +472,12 @@ module DNSTraverse
|
|
|
457
472
|
end
|
|
458
473
|
end
|
|
459
474
|
end
|
|
475
|
+
|
|
476
|
+
# Returns a SummaryStats object
|
|
477
|
+
def summary_stats
|
|
478
|
+
return nil unless calculated?
|
|
479
|
+
@summary_stats_object||= DNSTraverse::SummaryStats.new(self)
|
|
480
|
+
end
|
|
460
481
|
|
|
461
482
|
end
|
|
462
|
-
|
|
463
483
|
end
|
data/lib/dnstraverse/response.rb
CHANGED
|
@@ -65,6 +65,8 @@ module DNSTraverse
|
|
|
65
65
|
def evaluate
|
|
66
66
|
@status = @decoded_query.status # use this as a base
|
|
67
67
|
if @status != :exception
|
|
68
|
+
# XXX order of cacheable_good is answer, authority, additional
|
|
69
|
+
# perhaps we should add some checking for overlap between sections?
|
|
68
70
|
@infocache.add(@decoded_query.cacheable_good)
|
|
69
71
|
end
|
|
70
72
|
case @decoded_query.status
|
|
@@ -89,4 +91,4 @@ module DNSTraverse
|
|
|
89
91
|
end
|
|
90
92
|
end
|
|
91
93
|
end
|
|
92
|
-
end
|
|
94
|
+
end
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
module DNSTraverse
|
|
2
|
+
class SummaryStats
|
|
3
|
+
|
|
4
|
+
def initialize(referral)
|
|
5
|
+
@summary_stats = get_summary_stats(referral)
|
|
6
|
+
@answer_stats = get_answer_stats(referral)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
# summary returns a hash summarising the results
|
|
10
|
+
#
|
|
11
|
+
# the key is the type of result, e.g.:
|
|
12
|
+
# :exception, :noglue, :nodata, :answered, etc.
|
|
13
|
+
# the value is a hash containing:
|
|
14
|
+
# :prob #=> probability of getting this result
|
|
15
|
+
# all probabilities will add up to 1
|
|
16
|
+
#
|
|
17
|
+
# for example
|
|
18
|
+
# {
|
|
19
|
+
# :exception => { :prob => 0.5 },
|
|
20
|
+
# :answered => { :prob => 0.5 }
|
|
21
|
+
# }
|
|
22
|
+
def summary
|
|
23
|
+
@summary_stats
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# each_summary takes a block and yields the type and summary info
|
|
27
|
+
#
|
|
28
|
+
# for example
|
|
29
|
+
# stats.each_summary do |type, sinfo|
|
|
30
|
+
# puts "#{prob} = #{sinfo[:prob]}"
|
|
31
|
+
# end
|
|
32
|
+
def each_summary
|
|
33
|
+
@summary_stats.each_pair do |type, sinfo|
|
|
34
|
+
yield type, sinfo
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# answers returns a hash summarising the answers referred to
|
|
39
|
+
# by the key :answered in the summary statistics
|
|
40
|
+
#
|
|
41
|
+
# the key is the rdata string (e.g. 192.168.0.1)
|
|
42
|
+
# the value is a hash containing:
|
|
43
|
+
# :prob #=> probability of getting this result
|
|
44
|
+
# :rrs #=> array of Dnsruby::RR records
|
|
45
|
+
# all probabilities add up to the chance of getting an answer
|
|
46
|
+
# (e.g. get_summary_stats()[:answered][:prob] )
|
|
47
|
+
#
|
|
48
|
+
# for example
|
|
49
|
+
# {
|
|
50
|
+
# '192.168.0.1' => { :prob => 0.2, :rrs => [...] },
|
|
51
|
+
# '192.168.0.2' => { :prob => 0.3, :rrs => [...] }
|
|
52
|
+
# }
|
|
53
|
+
def answers
|
|
54
|
+
@answer_stats
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# each_answer takes a block and yields the probability and RR array
|
|
58
|
+
#
|
|
59
|
+
# for example
|
|
60
|
+
# stats.each_answer do |prob, records|
|
|
61
|
+
# puts "#{prob} = #{records.join(',')}"
|
|
62
|
+
# end
|
|
63
|
+
def each_answer
|
|
64
|
+
@answer_stats.each_pair do |type, ainfo|
|
|
65
|
+
yield ainfo[:prob], ainfo[:rr]
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
private
|
|
70
|
+
def get_summary_stats(referral)
|
|
71
|
+
s = {}
|
|
72
|
+
referral.stats.each_pair do |key, data|
|
|
73
|
+
response = data[:response]
|
|
74
|
+
type = response.status
|
|
75
|
+
s[type]||= { :prob => 0.0 }
|
|
76
|
+
s[type][:prob]+= data[:prob]
|
|
77
|
+
end
|
|
78
|
+
return s
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def get_answer_stats(referral)
|
|
82
|
+
a = {}
|
|
83
|
+
referral.stats.each_pair do |key, data|
|
|
84
|
+
response = data[:response]
|
|
85
|
+
if response.status == :answered then
|
|
86
|
+
key = response.answers.map {|rr| rr.rdata_to_string }.sort.join("@@@")
|
|
87
|
+
a[key]||= { :prob => 0.0, :rr => response.answers }
|
|
88
|
+
a[key][:prob]+= data[:prob]
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
return a
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
# You should have received a copy of the GNU General Public License
|
|
14
14
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
15
15
|
|
|
16
|
-
gem 'dnsruby', '>=1.
|
|
16
|
+
gem 'dnsruby', '>=1.30'
|
|
17
17
|
require 'dnsruby'
|
|
18
18
|
require 'dnstraverse/info_cache'
|
|
19
19
|
require 'dnstraverse/log'
|
|
@@ -61,7 +61,6 @@ module DNSTraverse
|
|
|
61
61
|
:ignore_truncation => ignore_truncation, :src_address => srcaddr,
|
|
62
62
|
:udp_size => udpsize.to_i, :packet_timeout => packet_timeout }
|
|
63
63
|
Log.debug { "Creating remote resolver object"}
|
|
64
|
-
CachingResolver.use_eventmachine(false)
|
|
65
64
|
@resolver = CachingResolver.new(resargs) # used for set nameservers
|
|
66
65
|
@resolver.udp_size = udpsize.to_i
|
|
67
66
|
Log.debug { "Creating local resolver object"}
|
|
@@ -71,6 +70,13 @@ module DNSTraverse
|
|
|
71
70
|
self
|
|
72
71
|
end
|
|
73
72
|
|
|
73
|
+
def report_progress(refobj, opts = {})
|
|
74
|
+
stage = opts[:stage] or raise "must pass option :stage"
|
|
75
|
+
refres = refobj.referral_resolution?
|
|
76
|
+
p = (refres == true ? @progress_resolve : @progress_main)
|
|
77
|
+
p.call(:state => @state, :referral => refobj, :stage => stage)
|
|
78
|
+
end
|
|
79
|
+
|
|
74
80
|
### change to get_all or something?
|
|
75
81
|
def get_a_root(args)
|
|
76
82
|
aaaa = args[:aaaa] || false
|
|
@@ -139,25 +145,19 @@ module DNSTraverse
|
|
|
139
145
|
r = stack.pop
|
|
140
146
|
Log.debug { "running on stack entry #{r}" }
|
|
141
147
|
case r
|
|
142
|
-
|
|
148
|
+
when :calc_resolve
|
|
143
149
|
r = stack.pop
|
|
144
150
|
r.resolve_calculate
|
|
145
|
-
|
|
146
|
-
p = (refres == true ? @progress_resolve : @progress_main)
|
|
147
|
-
p.call(:state => @state, :referral => r, :stage => :resolve)
|
|
151
|
+
report_progress r, :stage => :resolve
|
|
148
152
|
stack << r # now need to process
|
|
149
153
|
next
|
|
150
|
-
|
|
154
|
+
when :calc_answer
|
|
151
155
|
r = stack.pop
|
|
152
156
|
r.answer_calculate
|
|
153
|
-
|
|
154
|
-
p = (refres == true ? @progress_resolve : @progress_main)
|
|
155
|
-
p.call(:state => @state, :referral => r, :stage => :answer)
|
|
157
|
+
report_progress r, :stage => :answer
|
|
156
158
|
r.cleanup(cleanup)
|
|
157
159
|
if @fast then
|
|
158
160
|
# store away in @answered hash so we can lookup later
|
|
159
|
-
# XXX fast method should use IP and not server name?
|
|
160
|
-
# or maybe we should append IPs to end...
|
|
161
161
|
key = "#{r.qname}:#{r.qclass}:#{r.qtype}:#{r.server}:#{r.txt_ips_verbose}"
|
|
162
162
|
key.downcase!
|
|
163
163
|
Log.debug { "Fast mode cache store: #{key}" }
|
|
@@ -170,14 +170,14 @@ module DNSTraverse
|
|
|
170
170
|
end
|
|
171
171
|
next
|
|
172
172
|
else
|
|
173
|
-
|
|
174
|
-
p = (refres == true ? @progress_resolve : @progress_main)
|
|
175
|
-
p.call(:state => @state, :referral => r, :stage => :start)
|
|
173
|
+
report_progress r, :stage => :start
|
|
176
174
|
end
|
|
177
175
|
unless r.resolved? then
|
|
178
176
|
# get resolve Referral objects, place on stack with placeholder
|
|
179
177
|
stack << r << :calc_resolve
|
|
180
|
-
|
|
178
|
+
referrals = r.resolve({})
|
|
179
|
+
referrals.each { |c| report_progress c, :stage => :new }
|
|
180
|
+
stack.push(*referrals.reverse) # XXX
|
|
181
181
|
next
|
|
182
182
|
end
|
|
183
183
|
unless r.processed? then
|
|
@@ -199,15 +199,14 @@ module DNSTraverse
|
|
|
199
199
|
if @answered.key?(key) and (not c.noglue?) then
|
|
200
200
|
Log.debug { "Fast method - completed #{c}" }
|
|
201
201
|
r.replace_child(c, @answered[key])
|
|
202
|
-
|
|
203
|
-
p = (refres == true ? @progress_resolve : @progress_main)
|
|
204
|
-
p.call(:state => @state, :referral => c, :stage => :answer_fast)
|
|
202
|
+
report_progress c, :stage => :answer_fast
|
|
205
203
|
else
|
|
206
204
|
newchildren << c
|
|
207
205
|
end
|
|
208
206
|
end
|
|
209
207
|
children = newchildren
|
|
210
208
|
end
|
|
209
|
+
children.each { |c| report_progress c, :stage => :new }
|
|
211
210
|
stack.push(*children.reverse)
|
|
212
211
|
next
|
|
213
212
|
end
|
|
@@ -260,7 +259,7 @@ module DNSTraverse
|
|
|
260
259
|
Log.warn { "Failed to resolve #{rr.domainname} type #{qtype}" }
|
|
261
260
|
next
|
|
262
261
|
end
|
|
263
|
-
roots.push({ :name => rr.domainname, :ips => ips })
|
|
262
|
+
roots.push({ :name => rr.domainname.to_s, :ips => ips })
|
|
264
263
|
end
|
|
265
264
|
Log.debug { "find_roots exit, #{roots.map { |x| x[:name] }.join(', ') }" }
|
|
266
265
|
return roots
|
|
@@ -275,6 +274,7 @@ module DNSTraverse
|
|
|
275
274
|
r = Referral.new(:qname => qname, :qtype => qtype, :roots => args[:roots],
|
|
276
275
|
:maxdepth => maxdepth, :resolver => @resolver,
|
|
277
276
|
:nsatype => 'A')
|
|
277
|
+
report_progress r, :stage => :new
|
|
278
278
|
run(r, :cleanup => cleanup)
|
|
279
279
|
Log.debug { "run_query exit" }
|
|
280
280
|
return r
|