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.
Files changed (139) hide show
  1. data/Rakefile +61 -18
  2. data/bin/dnstraverse +30 -57
  3. data/lib/dnstraverse/caching_resolver.rb +2 -4
  4. data/lib/dnstraverse/decoded_query.rb +1 -0
  5. data/lib/dnstraverse/fingerprint.rb +1 -3
  6. data/lib/dnstraverse/fingerprint_rules.rb +249 -224
  7. data/lib/dnstraverse/message_utility.rb +20 -15
  8. data/lib/dnstraverse/referral.rb +32 -12
  9. data/lib/dnstraverse/response.rb +3 -1
  10. data/lib/dnstraverse/summary_stats.rb +94 -0
  11. data/lib/dnstraverse/traverser.rb +20 -20
  12. data/lib/dnstraverse/version.rb +8 -0
  13. metadata +101 -180
  14. data/a +0 -44
  15. data/doc.tar +0 -0
  16. data/doc/classes/DNSTraverse.html +0 -198
  17. data/doc/classes/DNSTraverse/CachingResolver.html +0 -172
  18. data/doc/classes/DNSTraverse/CachingResolver.src/M000055.html +0 -21
  19. data/doc/classes/DNSTraverse/CachingResolver.src/M000056.html +0 -42
  20. data/doc/classes/DNSTraverse/DecodedQuery.html +0 -475
  21. data/doc/classes/DNSTraverse/DecodedQuery.src/M000020.html +0 -34
  22. data/doc/classes/DNSTraverse/DecodedQuery.src/M000021.html +0 -23
  23. data/doc/classes/DNSTraverse/DecodedQuery.src/M000022.html +0 -19
  24. data/doc/classes/DNSTraverse/DecodedQuery.src/M000023.html +0 -33
  25. data/doc/classes/DNSTraverse/DecodedQuery.src/M000024.html +0 -26
  26. data/doc/classes/DNSTraverse/DecodedQuery.src/M000025.html +0 -24
  27. data/doc/classes/DNSTraverse/DecodedQuery.src/M000026.html +0 -29
  28. data/doc/classes/DNSTraverse/DecodedQuery.src/M000027.html +0 -19
  29. data/doc/classes/DNSTraverse/DecodedQuery.src/M000028.html +0 -18
  30. data/doc/classes/DNSTraverse/DecodedQuery.src/M000029.html +0 -32
  31. data/doc/classes/DNSTraverse/DecodedQuery.src/M000030.html +0 -19
  32. data/doc/classes/DNSTraverse/DecodedQuery.src/M000031.html +0 -19
  33. data/doc/classes/DNSTraverse/DecodedQuery.src/M000032.html +0 -20
  34. data/doc/classes/DNSTraverse/DecodedQuery.src/M000033.html +0 -31
  35. data/doc/classes/DNSTraverse/DecodedQueryCache.html +0 -182
  36. data/doc/classes/DNSTraverse/DecodedQueryCache.src/M000063.html +0 -21
  37. data/doc/classes/DNSTraverse/DecodedQueryCache.src/M000064.html +0 -33
  38. data/doc/classes/DNSTraverse/Fingerprint.html +0 -277
  39. data/doc/classes/DNSTraverse/Fingerprint.src/M000047.html +0 -29
  40. data/doc/classes/DNSTraverse/Fingerprint.src/M000048.html +0 -18
  41. data/doc/classes/DNSTraverse/Fingerprint.src/M000049.html +0 -57
  42. data/doc/classes/DNSTraverse/Fingerprint.src/M000050.html +0 -28
  43. data/doc/classes/DNSTraverse/Fingerprint.src/M000051.html +0 -27
  44. data/doc/classes/DNSTraverse/Fingerprint.src/M000052.html +0 -35
  45. data/doc/classes/DNSTraverse/Fingerprint.src/M000053.html +0 -24
  46. data/doc/classes/DNSTraverse/Fingerprint.src/M000054.html +0 -29
  47. data/doc/classes/DNSTraverse/InfoCache.html +0 -235
  48. data/doc/classes/DNSTraverse/InfoCache.src/M000034.html +0 -20
  49. data/doc/classes/DNSTraverse/InfoCache.src/M000035.html +0 -23
  50. data/doc/classes/DNSTraverse/InfoCache.src/M000036.html +0 -28
  51. data/doc/classes/DNSTraverse/InfoCache.src/M000037.html +0 -25
  52. data/doc/classes/DNSTraverse/InfoCache.src/M000038.html +0 -27
  53. data/doc/classes/DNSTraverse/InfoCache.src/M000039.html +0 -33
  54. data/doc/classes/DNSTraverse/MessageUtility.html +0 -275
  55. data/doc/classes/DNSTraverse/MessageUtility.src/M000011.html +0 -35
  56. data/doc/classes/DNSTraverse/MessageUtility.src/M000012.html +0 -37
  57. data/doc/classes/DNSTraverse/MessageUtility.src/M000013.html +0 -28
  58. data/doc/classes/DNSTraverse/MessageUtility.src/M000014.html +0 -27
  59. data/doc/classes/DNSTraverse/MessageUtility.src/M000015.html +0 -30
  60. data/doc/classes/DNSTraverse/MessageUtility.src/M000016.html +0 -32
  61. data/doc/classes/DNSTraverse/MessageUtility.src/M000017.html +0 -34
  62. data/doc/classes/DNSTraverse/MessageUtility.src/M000018.html +0 -23
  63. data/doc/classes/DNSTraverse/MessageUtility.src/M000019.html +0 -36
  64. data/doc/classes/DNSTraverse/Referral.html +0 -641
  65. data/doc/classes/DNSTraverse/Referral.src/M000065.html +0 -22
  66. data/doc/classes/DNSTraverse/Referral.src/M000066.html +0 -21
  67. data/doc/classes/DNSTraverse/Referral.src/M000067.html +0 -23
  68. data/doc/classes/DNSTraverse/Referral.src/M000068.html +0 -19
  69. data/doc/classes/DNSTraverse/Referral.src/M000069.html +0 -18
  70. data/doc/classes/DNSTraverse/Referral.src/M000070.html +0 -54
  71. data/doc/classes/DNSTraverse/Referral.src/M000071.html +0 -25
  72. data/doc/classes/DNSTraverse/Referral.src/M000072.html +0 -27
  73. data/doc/classes/DNSTraverse/Referral.src/M000073.html +0 -23
  74. data/doc/classes/DNSTraverse/Referral.src/M000074.html +0 -20
  75. data/doc/classes/DNSTraverse/Referral.src/M000075.html +0 -40
  76. data/doc/classes/DNSTraverse/Referral.src/M000076.html +0 -52
  77. data/doc/classes/DNSTraverse/Referral.src/M000077.html +0 -29
  78. data/doc/classes/DNSTraverse/Referral.src/M000078.html +0 -54
  79. data/doc/classes/DNSTraverse/Referral.src/M000079.html +0 -18
  80. data/doc/classes/DNSTraverse/Referral.src/M000080.html +0 -22
  81. data/doc/classes/DNSTraverse/Referral.src/M000081.html +0 -20
  82. data/doc/classes/DNSTraverse/Referral.src/M000082.html +0 -29
  83. data/doc/classes/DNSTraverse/Referral.src/M000083.html +0 -28
  84. data/doc/classes/DNSTraverse/Referral.src/M000084.html +0 -29
  85. data/doc/classes/DNSTraverse/Referral.src/M000085.html +0 -55
  86. data/doc/classes/DNSTraverse/Referral.src/M000086.html +0 -30
  87. data/doc/classes/DNSTraverse/Referral.src/M000087.html +0 -24
  88. data/doc/classes/DNSTraverse/Referral.src/M000088.html +0 -20
  89. data/doc/classes/DNSTraverse/Referral.src/M000089.html +0 -58
  90. data/doc/classes/DNSTraverse/ResolveError.html +0 -111
  91. data/doc/classes/DNSTraverse/Response.html +0 -271
  92. data/doc/classes/DNSTraverse/Response.src/M000057.html +0 -27
  93. data/doc/classes/DNSTraverse/Response.src/M000058.html +0 -21
  94. data/doc/classes/DNSTraverse/Response.src/M000059.html +0 -19
  95. data/doc/classes/DNSTraverse/Response.src/M000060.html +0 -21
  96. data/doc/classes/DNSTraverse/Response.src/M000061.html +0 -31
  97. data/doc/classes/DNSTraverse/Response.src/M000062.html +0 -23
  98. data/doc/classes/DNSTraverse/Response/NoGlue.html +0 -222
  99. data/doc/classes/DNSTraverse/Response/NoGlue.src/M000007.html +0 -32
  100. data/doc/classes/DNSTraverse/Response/NoGlue.src/M000008.html +0 -18
  101. data/doc/classes/DNSTraverse/Response/NoGlue.src/M000009.html +0 -18
  102. data/doc/classes/DNSTraverse/Response/NoGlue.src/M000010.html +0 -18
  103. data/doc/classes/DNSTraverse/Traverser.html +0 -247
  104. data/doc/classes/DNSTraverse/Traverser.src/M000040.html +0 -17
  105. data/doc/classes/DNSTraverse/Traverser.src/M000041.html +0 -52
  106. data/doc/classes/DNSTraverse/Traverser.src/M000042.html +0 -61
  107. data/doc/classes/DNSTraverse/Traverser.src/M000043.html +0 -110
  108. data/doc/classes/DNSTraverse/Traverser.src/M000044.html +0 -63
  109. data/doc/classes/DNSTraverse/Traverser.src/M000045.html +0 -28
  110. data/doc/classes/DNSTraverse/Traverser.src/M000046.html +0 -18
  111. data/doc/classes/FingerprintRules.html +0 -175
  112. data/doc/classes/Log.html +0 -174
  113. data/doc/classes/Log.src/M000002.html +0 -18
  114. data/doc/classes/Log.src/M000003.html +0 -18
  115. data/doc/classes/Log.src/M000004.html +0 -18
  116. data/doc/classes/Log/Formatter.html +0 -165
  117. data/doc/classes/Log/Formatter.src/M000005.html +0 -22
  118. data/doc/classes/Log/Formatter.src/M000006.html +0 -24
  119. data/doc/classes/TestFingerprint.html +0 -137
  120. data/doc/classes/TestFingerprint.src/M000001.html +0 -22
  121. data/doc/created.rid +0 -1
  122. data/doc/files/lib/dnstraverse/caching_resolver_rb.html +0 -132
  123. data/doc/files/lib/dnstraverse/decoded_query_cache_rb.html +0 -132
  124. data/doc/files/lib/dnstraverse/decoded_query_rb.html +0 -132
  125. data/doc/files/lib/dnstraverse/fingerprint_rb.html +0 -134
  126. data/doc/files/lib/dnstraverse/fingerprint_rules_rb.html +0 -143
  127. data/doc/files/lib/dnstraverse/info_cache_rb.html +0 -131
  128. data/doc/files/lib/dnstraverse/log_rb.html +0 -131
  129. data/doc/files/lib/dnstraverse/message_utility_rb.html +0 -124
  130. data/doc/files/lib/dnstraverse/referral_rb.html +0 -134
  131. data/doc/files/lib/dnstraverse/response_noglue_rb.html +0 -124
  132. data/doc/files/lib/dnstraverse/response_rb.html +0 -132
  133. data/doc/files/lib/dnstraverse/traverser_rb.html +0 -137
  134. data/doc/files/test/test_fingerprint_rb.html +0 -133
  135. data/doc/fr_class_index.html +0 -43
  136. data/doc/fr_file_index.html +0 -39
  137. data/doc/fr_method_index.html +0 -115
  138. data/doc/index.html +0 -24
  139. 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.push "#{msg.answerfrom} doesn't allow recursion"
27
+ warnings << "#{msg.answerfrom} doesn't allow recursion"
28
28
  end
29
29
  else
30
30
  if msg.header.ra then
31
- warnings.push "#{msg.answerfrom} allows recursion"
31
+ warnings << "#{msg.answerfrom} allows recursion"
32
32
  end
33
33
  end
34
34
  if msg.header.tc then
35
- warnings.push "#{msg.answerfrom} sent truncated packet"
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.push rr
137
+ ns << rr
138
138
  elsif type.casecmp('SOA') == 0 && klass.casecmp('IN') == 0
139
- soa.push rr
139
+ soa << rr
140
140
  else
141
- other.push rr
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 = :both)
177
- good, bad = Array.new, Array.new
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 [:additional, :authority] do
180
+ for section in [:answer, :authority, :additional] do
181
181
  for rr in msg.send(section) do
182
- name = rr.name.to_s
183
- if bailiwick.nil? or name.casecmp(bw) == 0 or
184
- name =~ /#{bwend}$/i then
185
- good.push rr
182
+ if rr.type.to_s == "OPT" then
183
+ other << rr
186
184
  else
187
- bad.push rr
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
@@ -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, :message, :infocache, :parent, :bailiwick, :stats
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
- :qtype => @nsatype, :bailiwick => newbailiwick,
181
- :refid => "#{refid}.#{child_refid}")
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
- refid_prefix = @refid == '' ? '' : "#{@refid}."
318
- refid = 1
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 => "#{refid_prefix}#{refid}")
335
+ :refid => "#{@refid}#{dot}#{child_refid}",
336
+ :refkey => "#{@refkey}#{dot}#{starters.count}")
324
337
  @children[:rootroot].push r
325
- refid+= 1
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
@@ -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.26'
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
- when :calc_resolve
148
+ when :calc_resolve
143
149
  r = stack.pop
144
150
  r.resolve_calculate
145
- refres = r.referral_resolution?
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
- when :calc_answer
154
+ when :calc_answer
151
155
  r = stack.pop
152
156
  r.answer_calculate
153
- refres = r.referral_resolution?
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
- refres = r.referral_resolution?
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
- stack.push(*r.resolve({}).reverse)
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
- refres = r.referral_resolution?
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
@@ -0,0 +1,8 @@
1
+ module DNSTraverse
2
+ module Version
3
+ MAJOR = 0
4
+ MINOR = 1
5
+ PATCH = 0
6
+ STRING = "#{MAJOR}.#{MINOR}.#{PATCH}"
7
+ end
8
+ end