dnstraverse 0.0.1 → 0.1.0

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