dnstraverse 0.0.1

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 (144) hide show
  1. data/LICENSE +674 -0
  2. data/README +4 -0
  3. data/Rakefile +19 -0
  4. data/a +44 -0
  5. data/bin/dnstraverse +300 -0
  6. data/doc.tar +0 -0
  7. data/doc/classes/DNSTraverse.html +198 -0
  8. data/doc/classes/DNSTraverse/CachingResolver.html +172 -0
  9. data/doc/classes/DNSTraverse/CachingResolver.src/M000055.html +21 -0
  10. data/doc/classes/DNSTraverse/CachingResolver.src/M000056.html +42 -0
  11. data/doc/classes/DNSTraverse/DecodedQuery.html +475 -0
  12. data/doc/classes/DNSTraverse/DecodedQuery.src/M000020.html +34 -0
  13. data/doc/classes/DNSTraverse/DecodedQuery.src/M000021.html +23 -0
  14. data/doc/classes/DNSTraverse/DecodedQuery.src/M000022.html +19 -0
  15. data/doc/classes/DNSTraverse/DecodedQuery.src/M000023.html +33 -0
  16. data/doc/classes/DNSTraverse/DecodedQuery.src/M000024.html +26 -0
  17. data/doc/classes/DNSTraverse/DecodedQuery.src/M000025.html +24 -0
  18. data/doc/classes/DNSTraverse/DecodedQuery.src/M000026.html +29 -0
  19. data/doc/classes/DNSTraverse/DecodedQuery.src/M000027.html +19 -0
  20. data/doc/classes/DNSTraverse/DecodedQuery.src/M000028.html +18 -0
  21. data/doc/classes/DNSTraverse/DecodedQuery.src/M000029.html +32 -0
  22. data/doc/classes/DNSTraverse/DecodedQuery.src/M000030.html +19 -0
  23. data/doc/classes/DNSTraverse/DecodedQuery.src/M000031.html +19 -0
  24. data/doc/classes/DNSTraverse/DecodedQuery.src/M000032.html +20 -0
  25. data/doc/classes/DNSTraverse/DecodedQuery.src/M000033.html +31 -0
  26. data/doc/classes/DNSTraverse/DecodedQueryCache.html +182 -0
  27. data/doc/classes/DNSTraverse/DecodedQueryCache.src/M000063.html +21 -0
  28. data/doc/classes/DNSTraverse/DecodedQueryCache.src/M000064.html +33 -0
  29. data/doc/classes/DNSTraverse/Fingerprint.html +277 -0
  30. data/doc/classes/DNSTraverse/Fingerprint.src/M000047.html +29 -0
  31. data/doc/classes/DNSTraverse/Fingerprint.src/M000048.html +18 -0
  32. data/doc/classes/DNSTraverse/Fingerprint.src/M000049.html +57 -0
  33. data/doc/classes/DNSTraverse/Fingerprint.src/M000050.html +28 -0
  34. data/doc/classes/DNSTraverse/Fingerprint.src/M000051.html +27 -0
  35. data/doc/classes/DNSTraverse/Fingerprint.src/M000052.html +35 -0
  36. data/doc/classes/DNSTraverse/Fingerprint.src/M000053.html +24 -0
  37. data/doc/classes/DNSTraverse/Fingerprint.src/M000054.html +29 -0
  38. data/doc/classes/DNSTraverse/InfoCache.html +235 -0
  39. data/doc/classes/DNSTraverse/InfoCache.src/M000034.html +20 -0
  40. data/doc/classes/DNSTraverse/InfoCache.src/M000035.html +23 -0
  41. data/doc/classes/DNSTraverse/InfoCache.src/M000036.html +28 -0
  42. data/doc/classes/DNSTraverse/InfoCache.src/M000037.html +25 -0
  43. data/doc/classes/DNSTraverse/InfoCache.src/M000038.html +27 -0
  44. data/doc/classes/DNSTraverse/InfoCache.src/M000039.html +33 -0
  45. data/doc/classes/DNSTraverse/MessageUtility.html +275 -0
  46. data/doc/classes/DNSTraverse/MessageUtility.src/M000011.html +35 -0
  47. data/doc/classes/DNSTraverse/MessageUtility.src/M000012.html +37 -0
  48. data/doc/classes/DNSTraverse/MessageUtility.src/M000013.html +28 -0
  49. data/doc/classes/DNSTraverse/MessageUtility.src/M000014.html +27 -0
  50. data/doc/classes/DNSTraverse/MessageUtility.src/M000015.html +30 -0
  51. data/doc/classes/DNSTraverse/MessageUtility.src/M000016.html +32 -0
  52. data/doc/classes/DNSTraverse/MessageUtility.src/M000017.html +34 -0
  53. data/doc/classes/DNSTraverse/MessageUtility.src/M000018.html +23 -0
  54. data/doc/classes/DNSTraverse/MessageUtility.src/M000019.html +36 -0
  55. data/doc/classes/DNSTraverse/Referral.html +641 -0
  56. data/doc/classes/DNSTraverse/Referral.src/M000065.html +22 -0
  57. data/doc/classes/DNSTraverse/Referral.src/M000066.html +21 -0
  58. data/doc/classes/DNSTraverse/Referral.src/M000067.html +23 -0
  59. data/doc/classes/DNSTraverse/Referral.src/M000068.html +19 -0
  60. data/doc/classes/DNSTraverse/Referral.src/M000069.html +18 -0
  61. data/doc/classes/DNSTraverse/Referral.src/M000070.html +54 -0
  62. data/doc/classes/DNSTraverse/Referral.src/M000071.html +25 -0
  63. data/doc/classes/DNSTraverse/Referral.src/M000072.html +27 -0
  64. data/doc/classes/DNSTraverse/Referral.src/M000073.html +23 -0
  65. data/doc/classes/DNSTraverse/Referral.src/M000074.html +20 -0
  66. data/doc/classes/DNSTraverse/Referral.src/M000075.html +40 -0
  67. data/doc/classes/DNSTraverse/Referral.src/M000076.html +52 -0
  68. data/doc/classes/DNSTraverse/Referral.src/M000077.html +29 -0
  69. data/doc/classes/DNSTraverse/Referral.src/M000078.html +54 -0
  70. data/doc/classes/DNSTraverse/Referral.src/M000079.html +18 -0
  71. data/doc/classes/DNSTraverse/Referral.src/M000080.html +22 -0
  72. data/doc/classes/DNSTraverse/Referral.src/M000081.html +20 -0
  73. data/doc/classes/DNSTraverse/Referral.src/M000082.html +29 -0
  74. data/doc/classes/DNSTraverse/Referral.src/M000083.html +28 -0
  75. data/doc/classes/DNSTraverse/Referral.src/M000084.html +29 -0
  76. data/doc/classes/DNSTraverse/Referral.src/M000085.html +55 -0
  77. data/doc/classes/DNSTraverse/Referral.src/M000086.html +30 -0
  78. data/doc/classes/DNSTraverse/Referral.src/M000087.html +24 -0
  79. data/doc/classes/DNSTraverse/Referral.src/M000088.html +20 -0
  80. data/doc/classes/DNSTraverse/Referral.src/M000089.html +58 -0
  81. data/doc/classes/DNSTraverse/ResolveError.html +111 -0
  82. data/doc/classes/DNSTraverse/Response.html +271 -0
  83. data/doc/classes/DNSTraverse/Response.src/M000057.html +27 -0
  84. data/doc/classes/DNSTraverse/Response.src/M000058.html +21 -0
  85. data/doc/classes/DNSTraverse/Response.src/M000059.html +19 -0
  86. data/doc/classes/DNSTraverse/Response.src/M000060.html +21 -0
  87. data/doc/classes/DNSTraverse/Response.src/M000061.html +31 -0
  88. data/doc/classes/DNSTraverse/Response.src/M000062.html +23 -0
  89. data/doc/classes/DNSTraverse/Response/NoGlue.html +222 -0
  90. data/doc/classes/DNSTraverse/Response/NoGlue.src/M000007.html +32 -0
  91. data/doc/classes/DNSTraverse/Response/NoGlue.src/M000008.html +18 -0
  92. data/doc/classes/DNSTraverse/Response/NoGlue.src/M000009.html +18 -0
  93. data/doc/classes/DNSTraverse/Response/NoGlue.src/M000010.html +18 -0
  94. data/doc/classes/DNSTraverse/Traverser.html +247 -0
  95. data/doc/classes/DNSTraverse/Traverser.src/M000040.html +17 -0
  96. data/doc/classes/DNSTraverse/Traverser.src/M000041.html +52 -0
  97. data/doc/classes/DNSTraverse/Traverser.src/M000042.html +61 -0
  98. data/doc/classes/DNSTraverse/Traverser.src/M000043.html +110 -0
  99. data/doc/classes/DNSTraverse/Traverser.src/M000044.html +63 -0
  100. data/doc/classes/DNSTraverse/Traverser.src/M000045.html +28 -0
  101. data/doc/classes/DNSTraverse/Traverser.src/M000046.html +18 -0
  102. data/doc/classes/FingerprintRules.html +175 -0
  103. data/doc/classes/Log.html +174 -0
  104. data/doc/classes/Log.src/M000002.html +18 -0
  105. data/doc/classes/Log.src/M000003.html +18 -0
  106. data/doc/classes/Log.src/M000004.html +18 -0
  107. data/doc/classes/Log/Formatter.html +165 -0
  108. data/doc/classes/Log/Formatter.src/M000005.html +22 -0
  109. data/doc/classes/Log/Formatter.src/M000006.html +24 -0
  110. data/doc/classes/TestFingerprint.html +137 -0
  111. data/doc/classes/TestFingerprint.src/M000001.html +22 -0
  112. data/doc/created.rid +1 -0
  113. data/doc/files/lib/dnstraverse/caching_resolver_rb.html +132 -0
  114. data/doc/files/lib/dnstraverse/decoded_query_cache_rb.html +132 -0
  115. data/doc/files/lib/dnstraverse/decoded_query_rb.html +132 -0
  116. data/doc/files/lib/dnstraverse/fingerprint_rb.html +134 -0
  117. data/doc/files/lib/dnstraverse/fingerprint_rules_rb.html +143 -0
  118. data/doc/files/lib/dnstraverse/info_cache_rb.html +131 -0
  119. data/doc/files/lib/dnstraverse/log_rb.html +131 -0
  120. data/doc/files/lib/dnstraverse/message_utility_rb.html +124 -0
  121. data/doc/files/lib/dnstraverse/referral_rb.html +134 -0
  122. data/doc/files/lib/dnstraverse/response_noglue_rb.html +124 -0
  123. data/doc/files/lib/dnstraverse/response_rb.html +132 -0
  124. data/doc/files/lib/dnstraverse/traverser_rb.html +137 -0
  125. data/doc/files/test/test_fingerprint_rb.html +133 -0
  126. data/doc/fr_class_index.html +43 -0
  127. data/doc/fr_file_index.html +39 -0
  128. data/doc/fr_method_index.html +115 -0
  129. data/doc/index.html +24 -0
  130. data/doc/rdoc-style.css +208 -0
  131. data/lib/dnstraverse/caching_resolver.rb +63 -0
  132. data/lib/dnstraverse/decoded_query.rb +199 -0
  133. data/lib/dnstraverse/decoded_query_cache.rb +53 -0
  134. data/lib/dnstraverse/fingerprint.rb +166 -0
  135. data/lib/dnstraverse/fingerprint_rules.rb +389 -0
  136. data/lib/dnstraverse/info_cache.rb +108 -0
  137. data/lib/dnstraverse/log.rb +55 -0
  138. data/lib/dnstraverse/message_utility.rb +199 -0
  139. data/lib/dnstraverse/referral.rb +463 -0
  140. data/lib/dnstraverse/response.rb +92 -0
  141. data/lib/dnstraverse/response_noglue.rb +54 -0
  142. data/lib/dnstraverse/traverser.rb +291 -0
  143. data/test/test_fingerprint.rb +29 -0
  144. metadata +231 -0
data/README ADDED
@@ -0,0 +1,4 @@
1
+ DNSTraverse is a rubygem and command line program that allows you to traverse
2
+ the DNS from the root exploring all possible ways of getting to the final
3
+ destination domain name. The results are probabilities of which server will
4
+ respond and what they will respond with.
data/Rakefile ADDED
@@ -0,0 +1,19 @@
1
+ require 'rake/gempackagetask'
2
+ spec = Gem::Specification.new do |s|
3
+ s.name = 'dnstraverse'
4
+ s.summary = 'Complete DNS traversal checker'
5
+ s.description = File.read(File.join(File.dirname(__FILE__), 'README'))
6
+ s.requirements = []
7
+ s.version = '0.0.1'
8
+ s.author = 'James Ponder'
9
+ s.email = 'james@squish.net'
10
+ s.homepage = 'http://www.squish.net/dnstraverse/'
11
+ s.platform = Gem::Platform::RUBY
12
+ s.required_ruby_version = '>=1.8'
13
+ s.files = Dir['**/**']
14
+ s.executables = [ 'dnstraverse' ]
15
+ s.test_files = Dir["test/test*.rb"]
16
+ s.has_rdoc = true
17
+ s.add_dependency('dnsruby', '>= 1.26')
18
+ end
19
+ Rake::GemPackageTask.new(spec).define
data/a ADDED
@@ -0,0 +1,44 @@
1
+
2
+ ri v1.0.1 - 20041108
3
+
4
+ Usage:
5
+
6
+ ri [options] [names...]
7
+
8
+ Display information on Ruby classes, modules, and methods.
9
+ Give the names of classes or methods to see their documentation.
10
+ Partial names may be given: if the names match more than
11
+ one entity, a list will be shown, otherwise details on
12
+ that entity will be displayed.
13
+
14
+ Nested classes and modules can be specified using the normal
15
+ Name::Name notation, and instance methods can be distinguished
16
+ from class methods using "." (or "#") instead of "::".
17
+
18
+ For example:
19
+
20
+ ri File
21
+ ri File.new
22
+ ri F.n
23
+ ri zip
24
+
25
+ Note that shell quoting may be required for method names
26
+ containing punctuation:
27
+
28
+ ri 'Array.[]'
29
+ ri compact\!
30
+
31
+ By default ri searches for documentation in the following
32
+ directories:
33
+
34
+ /usr/share/ri/1.8/system
35
+ /usr/share/ri/1.8/site
36
+ /home/james/.rdoc
37
+ /usr/lib/ruby/gems/1.8/doc/*/ri
38
+
39
+ Specifying the --system, --site, --home, --gems or --doc-dir
40
+ options will limit ri to searching only the specified
41
+ directories.
42
+
43
+ For help on options, type 'ri -h'
44
+ For a list of classes I know about, type 'ri -c'
data/bin/dnstraverse ADDED
@@ -0,0 +1,300 @@
1
+ #!/usr/bin/env ruby
2
+ # = Summary
3
+ # Traverse the DNS from the root exploring all possible ways of
4
+ # getting to the final destination domain name. This is the command
5
+ # line interface to the DNSTraverse module.
6
+ #
7
+ # = Usage
8
+ # dnstraverse [options] DOMAIN
9
+ # -t, --type TYPE Select record type (A, AAAA, SRV, WKS, NS,
10
+ # CNAME, SOA, PTR, HINFO, MINFO, MX, TXT, ANY)
11
+ # --root-server HOST Root DNS server (default - ask local resolver)
12
+ # --[no-]all-root-servers Find all root servers (default false)
13
+ # --root-aaaa TODO Look for IPv6 addresses for root servers
14
+ # --follow-aaaa TODO Only follow AAAA records for referrals
15
+ # --udp-size SIZE Turn on EDNS0 with given UDP size
16
+ # --max-depth DEPTH Maximum depth to traverse (default 10)
17
+ # --retries TIMES Number of 2s retries before timing out (2)
18
+ # --[no-]allow-tcp Try using tcp if udp truncated (default true)
19
+ # --[no-]always-tcp Always use tcp (default false)
20
+ #
21
+ # --[no-]show-progress Display progress information (default true)
22
+ # --[no-]show-all-stats Display statistics as we go (default false)
23
+ # --[no-]show-resolves Display referral resolutions (default false)
24
+ # --[no-]show-serverlist Display list of servers seen (default true)
25
+ # --[no-]show-versions Display versions of dns servers (default true)
26
+ # --[no-]show-results Display the results (default true)
27
+ #
28
+ # --fast Short-cut answers using previous information,
29
+ # less accurate but usually ok - by-passes the
30
+ # proper simulation of the resolver cache.
31
+ #
32
+ # -v, --[no-]verbose Run verbosely
33
+ # -d, --debug Debug mode: One -d for DNSCheck debug
34
+ # Two -d also turns on library debug
35
+ # -h, --help Show full help
36
+ # -V, --version Show version and exit
37
+ #
38
+ # == Example
39
+ # dnstraverse www.nic.uk
40
+ # dnstraverse --fast www.google.com
41
+ # dnstraverse --fast --show-resolves --udp-size 1000 www.microsoft.com
42
+ #
43
+ # = Copyright
44
+ # Copyright (c) 2008 James Ponder <james@squish.net>
45
+ # Portions Copyright (c) 2003,2004,2005 Roy Arends & Jakob Schlyter
46
+ #
47
+ # This program is free software: you can redistribute it and/or modify
48
+ # it under the terms of the GNU General Public License as published by
49
+ # the Free Software Foundation, version 3 of the License.
50
+
51
+ require 'optparse'
52
+ require 'logger'
53
+ require 'rdoc/usage'
54
+ require 'pp'
55
+
56
+ require 'dnstraverse/traverser'
57
+ require 'dnstraverse/log'
58
+ require 'dnstraverse/fingerprint'
59
+
60
+ Version = [ 0, 0, 1].freeze
61
+
62
+ EMPTY_STRING = ''.freeze
63
+
64
+ def referral_txt_normal(r)
65
+ if r.serverips then
66
+ return "#{r.refid} #{r.server} (#{r.txt_ips})"
67
+ end
68
+ return "#{r.refid} #{r.server}"
69
+ end
70
+
71
+ def referral_txt_verbose(r)
72
+ if r.serverips then
73
+ return sprintf("%s [%s] %s (%s) <%s>", r.refid, r.qname, r.server,
74
+ r.txt_ips, r.bailiwick)
75
+ end
76
+ return sprintf("%s [%s] %s <%s>", r.refid, r.qname, r.server,
77
+ r.bailiwick)
78
+ end
79
+
80
+ # TODO: warnings aren't in referral object any more, they are in bubbled up to response object from decoded_query, and there are several for each referral object as each IP address for a referral could have warnings.
81
+ # TODO: display warnings after each response object is created
82
+ def progress_main(args)
83
+ o = args[:state]
84
+ r = args[:referral]
85
+ stage = args[:stage]
86
+ return if r.refid.empty?
87
+ case stage
88
+ when :answer then
89
+ if o[:verbose] then
90
+ for warning in r.warnings do
91
+ puts "#{r.refid} WARNING: #{warning}"
92
+ end
93
+ end
94
+ if o[:allstats] then
95
+ r.stats_display(:prefix => "#{r.refid} Results:", :results => false)
96
+ end
97
+ when :start then
98
+ print o[:verbose] ? referral_txt_verbose(r) : referral_txt_normal(r)
99
+ if r.serverips.nil? then
100
+ print " -- resolving"
101
+ end
102
+ print "\n"
103
+ when :answer_fast then
104
+ print o[:verbose] ? referral_txt_verbose(r) : referral_txt_normal(r)
105
+ puts " -- completed earlier"
106
+ end
107
+ end
108
+
109
+ def progress_resolves(args)
110
+ o = args[:state]
111
+ r = args[:referral]
112
+ stage = args[:stage]
113
+ case stage
114
+ when :start then
115
+ print o[:verbose] ? referral_txt_verbose(r) : referral_txt_normal(r)
116
+ print "\n"
117
+ when :answer_fast then
118
+ print o[:verbose] ? referral_txt_verbose(r) : referral_txt_normal(r)
119
+ puts " -- completed earlier"
120
+ end
121
+ end
122
+
123
+ def require_relative(path)
124
+ require File.join(File.dirname(caller[0]), path.to_str)
125
+ end
126
+
127
+ ### Main program
128
+
129
+ options = Hash.new
130
+ options[:verbose] = false
131
+ options[:debug] = 0
132
+ options[:type] = :a
133
+ options[:root] = nil
134
+ options[:allroots] = false
135
+ options[:broken] = false
136
+ options[:progress] = true
137
+ options[:summary] = true
138
+ options[:resolves] = false
139
+ options[:serverlist] = true
140
+ options[:versions] = true
141
+ options[:domainname] = nil
142
+ options[:follow_aaaa] = false
143
+ options[:root_aaaa] = false
144
+ options[:always_tcp] = false
145
+ options[:allow_tcp] = false
146
+ options[:allstats] = false
147
+ options[:saveobjects] = false
148
+ options[:fast] = false
149
+ options[:udpsize] = 512
150
+ options[:maxdepth] = 10
151
+ options[:retries] = 2
152
+ options[:results] = true
153
+
154
+ opts = OptionParser.new
155
+ opts.banner = "Usage: #{File.basename($0)} [options] DOMAIN"
156
+ opts.on("-v", "--[no-]verbose") { |o| options[:verbose] = o }
157
+ opts.on("-d", "--[no-]debug") { |o| options[:debug]+= 1 }
158
+ opts.on("-r", "--root-server HOST") { |o| options[:root] = o }
159
+ opts.on("-a", "--all-root-servers") { |o| options[:allroots] = o }
160
+ opts.on("-t", "--type TYPE", Dnsruby::Types.constants) { |o| options[:type] = o }
161
+ opts.on("--udp-size SIZE") { |o| options[:udpsize] = o }
162
+ opts.on("--allow-tcp") { |o| options[:allow_tcp] = o }
163
+ opts.on("--always-tcp") { |o| options[:always_tcp] = o }
164
+ opts.on("--max-depth DEPTH") { |o| options[:maxdepth] = o }
165
+ opts.on("--retries TIMES") { |o| options[:retries] = o }
166
+ opts.on("--[no-]follow-aaaa") { |o| options[:follow_aaaa] = o }
167
+ opts.on("--[no-]root-aaaa") { |o| options[:root_aaaa] = o }
168
+ opts.on("--[no-]show-progress") { |o| options[:progress] = o }
169
+ opts.on("--[no-]show-resolves") { |o| options[:resolves] = o }
170
+ opts.on("--[no-]show-serverlist") { |o| options[:serverlist] = o }
171
+ opts.on("--[no-]show-versions") { |o| options[:versions] = o }
172
+ opts.on("--[no-]show-all-stats") { |o| options[:allstats] = o }
173
+ opts.on("--[no-]show-results") { |o| options[:results] = o }
174
+ opts.on("--save-objects") { |o| options[:saveobjects] = o }
175
+ opts.on("--fast") { |o| options[:fast] = o }
176
+ opts.on_tail("-h", "--help") { RDoc::usage }
177
+ opts.on_tail("-V", "--version") { puts Version.join('.'); exit }
178
+ begin
179
+ opts.parse!
180
+ if ARGV.size != 1 then
181
+ raise OptionParser::ParseError, "Missing domain name parameter"
182
+ end
183
+ options[:domainname] = ARGV.shift
184
+ rescue OptionParser::ParseError => e
185
+ puts e
186
+ RDoc::usage(1, 'Usage')
187
+ end
188
+ Log.level = options[:debug] > 0 ? Logger::DEBUG : Logger::UNKNOWN
189
+ Log.debug {"Options chosen:\n" }
190
+ Log.debug { options.map {|x,y| " #{x}: #{y}" }.join("\n") }
191
+ args = { :state => options, :aaaa => options[:follow_aaaa],
192
+ :udpsize => options[:udpsize] }
193
+ args[:progress_main] = method(:progress_main) if options[:progress]
194
+ args[:progress_resolve] = method(:progress_resolves) if options[:progress] and options[:resolves]
195
+ args[:loglevel] = options[:debug] >= 1 ? Logger::DEBUG : Logger::UNKNOWN
196
+ args[:libloglevel] = options[:debug] >= 2 ? Logger::DEBUG : Logger::UNKNOWN
197
+ args[:always_tcp] = true if options[:always_tcp]
198
+ args[:allow_tcp] = true if options[:allow_tcp]
199
+ args[:fast] = true if options[:fast]
200
+ begin
201
+ traverser = DNSTraverse::Traverser.new(args)
202
+ if options[:root] then
203
+ root = options[:root]
204
+ rootip = root # XXX fix me need to look up IP address if not passed
205
+ else
206
+ begin
207
+ (root, rootip) = traverser.get_a_root(:aaaa => options[:root_aaaa])
208
+ rescue => e
209
+ $stderr.puts "Failed to find a root: #{e}"
210
+ exit 2
211
+ end
212
+ end
213
+ puts "Using #{root} (#{rootip}) as initial root"
214
+ if options[:allroots] then
215
+ begin
216
+ roots = traverser.find_all_roots(:root => root, :rootip => rootip,
217
+ :aaaa => options[:root_aaaa] )
218
+ rescue => e
219
+ $stderr.puts "Failed to find all roots: #{e}"
220
+ exit 2
221
+ end
222
+ puts "All roots:"
223
+ for aroot in roots do
224
+ puts " #{aroot[:name]} #{aroot[:ips].join(', ')}"
225
+ end
226
+ else
227
+ roots = [ { :name => root, :ips => [ rootip ] } ]
228
+ end
229
+ puts "Running query #{options[:domainname]} type #{options[:type]}"
230
+ result = traverser.run_query(:qname => options[:domainname],
231
+ :qtype => options[:type].to_s, :roots => roots,
232
+ :maxdepth => options[:maxdepth],
233
+ :retries => options[:retries])
234
+ puts if options[:progress]
235
+ if options[:serverlist] then
236
+ puts "The following servers were encountered:"
237
+ fp = options[:versions] ? DNSTraverse::Fingerprint.new : nil
238
+ seen = traverser.servers_encountered
239
+ ss = seen.keys.sort! { |a,b| a.downcase.reverse! <=> b.downcase.reverse! }
240
+ w = 16
241
+ ss.each { |a| w = a.length if a.length > w }
242
+ ss.each do |server|
243
+ for ip in seen[server] do
244
+ ver = ""
245
+ if options[:versions] then
246
+ fpres = fp.fingerprint(ip)
247
+ ver += " #{fpres[:vendor]}" if fpres.has_key?(:vendor)
248
+ ver += " #{fpres[:product]}" if fpres.has_key?(:product)
249
+ ver += " #{fpres[:version]}" if fpres.has_key?(:version)
250
+ ver += " #{fpres[:error]}" if fpres.has_key?(:error)
251
+ end
252
+ printf "%#{w}s: %-15s%s", server, ip, ver
253
+ puts
254
+ end
255
+ end
256
+ puts
257
+ end
258
+ if options[:results] then
259
+ puts "Results:"
260
+ result.stats_display(:results => true, :spacing => true)
261
+ end
262
+ rescue Interrupt => e
263
+ $stderr.puts "Interrupted by user"
264
+ end
265
+ if options[:saveobjects] then
266
+ GC.start
267
+ s = Hash.new
268
+ ObjectSpace.each_object do |o|
269
+ s[o.class]||= 0
270
+ s[o.class]= s[o.class] + 1
271
+ end
272
+ f = File.open("classes.dump", "w")
273
+ s.sort {|a,b| a[1] <=> b[1]}.each do | c |
274
+ f.puts "#{c[1]} #{c[0]}"
275
+ end
276
+ f = File.open("strings.dump", "w")
277
+ ObjectSpace.each_object do |o|
278
+ if o.instance_of? String then
279
+ f.puts o
280
+ end
281
+ end
282
+ f = File.open("hashes.dump", "w")
283
+ ObjectSpace.each_object do |o|
284
+ if o.instance_of? Hash then
285
+ f.puts o.size.to_s
286
+ end
287
+ end
288
+ f = File.open("label.dump", "w")
289
+ ObjectSpace.each_object do |o|
290
+ if o.instance_of? Dnsruby::Name::Label then
291
+ f.puts o.to_s
292
+ end
293
+ end
294
+ f = File.open("referral.dump", "w")
295
+ ObjectSpace.each_object do |o|
296
+ if o.instance_of? DNSTraverse::Referral then
297
+ f.puts o.to_s
298
+ end
299
+ end
300
+ end
data/doc.tar ADDED
Binary file
@@ -0,0 +1,198 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
+ <head>
8
+ <title>Module: DNSTraverse</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
+ <link rel="stylesheet" href=".././rdoc-style.css" type="text/css" media="screen" />
12
+ <script type="text/javascript">
13
+ // <![CDATA[
14
+
15
+ function popupCode( url ) {
16
+ window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
+ }
18
+
19
+ function toggleCode( id ) {
20
+ if ( document.getElementById )
21
+ elem = document.getElementById( id );
22
+ else if ( document.all )
23
+ elem = eval( "document.all." + id );
24
+ else
25
+ return false;
26
+
27
+ elemStyle = elem.style;
28
+
29
+ if ( elemStyle.display != "block" ) {
30
+ elemStyle.display = "block"
31
+ } else {
32
+ elemStyle.display = "none"
33
+ }
34
+
35
+ return true;
36
+ }
37
+
38
+ // Make codeblocks hidden by default
39
+ document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
+
41
+ // ]]>
42
+ </script>
43
+
44
+ </head>
45
+ <body>
46
+
47
+
48
+
49
+ <div id="classHeader">
50
+ <table class="header-table">
51
+ <tr class="top-aligned-row">
52
+ <td><strong>Module</strong></td>
53
+ <td class="class-name-in-header">DNSTraverse</td>
54
+ </tr>
55
+ <tr class="top-aligned-row">
56
+ <td><strong>In:</strong></td>
57
+ <td>
58
+ <a href="../files/lib/dnstraverse/fingerprint_rb.html">
59
+ lib/dnstraverse/fingerprint.rb
60
+ </a>
61
+ <br />
62
+ <a href="../files/lib/dnstraverse/decoded_query_rb.html">
63
+ lib/dnstraverse/decoded_query.rb
64
+ </a>
65
+ <br />
66
+ <a href="../files/lib/dnstraverse/traverser_rb.html">
67
+ lib/dnstraverse/traverser.rb
68
+ </a>
69
+ <br />
70
+ <a href="../files/lib/dnstraverse/decoded_query_cache_rb.html">
71
+ lib/dnstraverse/decoded_query_cache.rb
72
+ </a>
73
+ <br />
74
+ <a href="../files/lib/dnstraverse/response_noglue_rb.html">
75
+ lib/dnstraverse/response_noglue.rb
76
+ </a>
77
+ <br />
78
+ <a href="../files/lib/dnstraverse/referral_rb.html">
79
+ lib/dnstraverse/referral.rb
80
+ </a>
81
+ <br />
82
+ <a href="../files/lib/dnstraverse/response_rb.html">
83
+ lib/dnstraverse/response.rb
84
+ </a>
85
+ <br />
86
+ <a href="../files/lib/dnstraverse/info_cache_rb.html">
87
+ lib/dnstraverse/info_cache.rb
88
+ </a>
89
+ <br />
90
+ <a href="../files/lib/dnstraverse/caching_resolver_rb.html">
91
+ lib/dnstraverse/caching_resolver.rb
92
+ </a>
93
+ <br />
94
+ <a href="../files/lib/dnstraverse/message_utility_rb.html">
95
+ lib/dnstraverse/message_utility.rb
96
+ </a>
97
+ <br />
98
+ </td>
99
+ </tr>
100
+
101
+ </table>
102
+ </div>
103
+ <!-- banner header -->
104
+
105
+ <div id="bodyContent">
106
+
107
+
108
+
109
+ <div id="contextContent">
110
+
111
+ <div id="description">
112
+ <p>
113
+ <a href="DNSTraverse.html">DNSTraverse</a> traverses the DNS to show
114
+ statistics and information Copyright (C) 2008 James Ponder
115
+ </p>
116
+ <p>
117
+ This program is free software: you can redistribute it and/or modify it
118
+ under the terms of the GNU General Public License as published by the Free
119
+ Software Foundation, version 3 of the License.
120
+ </p>
121
+ <p>
122
+ This program is distributed in the hope that it will be useful, but WITHOUT
123
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
124
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
125
+ more details.
126
+ </p>
127
+ <p>
128
+ You should have received a copy of the GNU General Public License along
129
+ with this program. If not, see &lt;<a
130
+ href="http://www.gnu.org/licenses">www.gnu.org/licenses</a>/&gt;.
131
+ </p>
132
+
133
+ </div>
134
+
135
+
136
+ </div>
137
+
138
+
139
+ </div>
140
+
141
+
142
+ <!-- if includes -->
143
+
144
+ <div id="section">
145
+
146
+ <div id="class-list">
147
+ <h3 class="section-bar">Classes and Modules</h3>
148
+
149
+ Module <a href="DNSTraverse/MessageUtility.html" class="link">DNSTraverse::MessageUtility</a><br />
150
+ Module <a href="DNSTraverse/Response.html" class="link">DNSTraverse::Response</a><br />
151
+ Class <a href="DNSTraverse/CachingResolver.html" class="link">DNSTraverse::CachingResolver</a><br />
152
+ Class <a href="DNSTraverse/DecodedQuery.html" class="link">DNSTraverse::DecodedQuery</a><br />
153
+ Class <a href="DNSTraverse/DecodedQueryCache.html" class="link">DNSTraverse::DecodedQueryCache</a><br />
154
+ Class <a href="DNSTraverse/Fingerprint.html" class="link">DNSTraverse::Fingerprint</a><br />
155
+ Class <a href="DNSTraverse/InfoCache.html" class="link">DNSTraverse::InfoCache</a><br />
156
+ Class <a href="DNSTraverse/Referral.html" class="link">DNSTraverse::Referral</a><br />
157
+ Class <a href="DNSTraverse/ResolveError.html" class="link">DNSTraverse::ResolveError</a><br />
158
+ Class <a href="DNSTraverse/Response.html" class="link">DNSTraverse::Response</a><br />
159
+ Class <a href="DNSTraverse/Traverser.html" class="link">DNSTraverse::Traverser</a><br />
160
+
161
+ </div>
162
+
163
+ <div id="constants-list">
164
+ <h3 class="section-bar">Constants</h3>
165
+
166
+ <div class="name-list">
167
+ <table summary="Constants">
168
+ <tr class="top-aligned-row context-row">
169
+ <td class="context-item-name">TYPE_ARRAY_AAAA</td>
170
+ <td>=</td>
171
+ <td class="context-item-value">['AAAA', 'A'].freeze</td>
172
+ </tr>
173
+ <tr class="top-aligned-row context-row">
174
+ <td class="context-item-name">TYPE_ARRAY_A</td>
175
+ <td>=</td>
176
+ <td class="context-item-value">['A'].freeze</td>
177
+ </tr>
178
+ </table>
179
+ </div>
180
+ </div>
181
+
182
+
183
+
184
+
185
+
186
+
187
+ <!-- if method_list -->
188
+
189
+
190
+ </div>
191
+
192
+
193
+ <div id="validator-badges">
194
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
195
+ </div>
196
+
197
+ </body>
198
+ </html>