dnstraverse 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|