net-dns 0.5.3 → 0.6.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 (53) hide show
  1. data/.gitignore +6 -0
  2. data/AUTHORS.rdoc +7 -0
  3. data/CHANGELOG.rdoc +34 -0
  4. data/README.rdoc +26 -14
  5. data/Rakefile +23 -30
  6. data/{THANKS → THANKS.rdoc} +0 -0
  7. data/VERSION.yml +3 -2
  8. data/demo/check_soa.rb +6 -11
  9. data/lib/net/{dns/dns.rb → dns.rb} +5 -12
  10. data/lib/net/dns/core_ext.rb +52 -0
  11. data/lib/net/dns/header.rb +55 -49
  12. data/lib/net/dns/names/names.rb +20 -10
  13. data/lib/net/dns/packet.rb +33 -26
  14. data/lib/net/dns/question.rb +60 -27
  15. data/lib/net/dns/resolver.rb +101 -156
  16. data/lib/net/dns/resolver/timeouts.rb +71 -65
  17. data/lib/net/dns/rr.rb +131 -166
  18. data/lib/net/dns/rr/a.rb +20 -26
  19. data/lib/net/dns/rr/aaaa.rb +15 -20
  20. data/lib/net/dns/rr/classes.rb +1 -1
  21. data/lib/net/dns/rr/cname.rb +8 -14
  22. data/lib/net/dns/rr/hinfo.rb +8 -14
  23. data/lib/net/dns/rr/mr.rb +8 -14
  24. data/lib/net/dns/rr/mx.rb +11 -18
  25. data/lib/net/dns/rr/ns.rb +8 -14
  26. data/lib/net/dns/rr/null.rb +7 -14
  27. data/lib/net/dns/rr/ptr.rb +9 -15
  28. data/lib/net/dns/rr/soa.rb +9 -15
  29. data/lib/net/dns/rr/srv.rb +10 -19
  30. data/lib/net/dns/rr/txt.rb +9 -20
  31. data/lib/net/dns/rr/types.rb +51 -58
  32. data/lib/net/dns/version.rb +22 -0
  33. data/test/{net/dns/test_header.rb → header_test.rb} +20 -20
  34. data/test/{net/dns/test_packet.rb → packet_test.rb} +2 -2
  35. data/test/question_test.rb +84 -0
  36. data/test/resolver/timeouts_test.rb +109 -0
  37. data/test/{net/dns/test_resolver.rb → resolver_test.rb} +6 -6
  38. data/test/rr/a_test.rb +66 -0
  39. data/test/{net/dns/rr/test_classes.rb → rr/classes_test.rb} +5 -5
  40. data/test/rr/ns_test.rb +64 -0
  41. data/test/rr/types_test.rb +69 -0
  42. data/test/{net/dns/test_rr.rb → rr_test.rb} +10 -12
  43. data/test/test_helper.rb +4 -0
  44. metadata +50 -35
  45. data/AUTHORS +0 -10
  46. data/CHANGELOG +0 -7
  47. data/INSTALL +0 -8
  48. data/net-dns.gemspec +0 -92
  49. data/test/net/dns/resolver/test_timeouts.rb +0 -59
  50. data/test/net/dns/rr/test_a.rb +0 -72
  51. data/test/net/dns/rr/test_ns.rb +0 -66
  52. data/test/net/dns/rr/test_types.rb +0 -124
  53. data/test/net/dns/test_question.rb +0 -54
@@ -1,8 +1,21 @@
1
- module Net # :nodoc:
1
+ module Net
2
2
  module DNS
3
3
 
4
- module Names # :nodoc: all
5
-
4
+ module Names
5
+
6
+ # Argument Error for class Net::DNS::Names.
7
+ class ArgumentError < ArgumentError
8
+ end
9
+
10
+ # Base error class.
11
+ class Error < StandardError
12
+ end
13
+
14
+ # Generic Names Error.
15
+ class ExpandError < Error
16
+ end
17
+
18
+
6
19
  INT16SZ = 2
7
20
 
8
21
  # Expand a compressed name in a DNS Packet object. Please
@@ -18,7 +31,7 @@ module Net # :nodoc:
18
31
  name = ""
19
32
  packetlen = packet.size
20
33
  while true
21
- raise ExpandError, "offset is greater than packet lenght!" if packetlen < (offset+1)
34
+ raise ExpandError, "Offset is greater than packet lenght!" if packetlen < (offset+1)
22
35
  len = packet.unpack("@#{offset} C")[0]
23
36
 
24
37
  if len == 0
@@ -101,9 +114,6 @@ module Net # :nodoc:
101
114
  end
102
115
  end
103
116
 
104
- end # module Names
105
- end # module DNS
106
- end # module Net
107
-
108
- class ExpandError < StandardError # :nodoc:
109
- end
117
+ end
118
+ end
119
+ end
@@ -1,6 +1,6 @@
1
1
  require 'logger'
2
2
  require 'net/dns/names/names'
3
- require 'net/dns/dns'
3
+ require 'net/dns'
4
4
  require 'net/dns/header'
5
5
  require 'net/dns/question'
6
6
  require 'net/dns/rr'
@@ -94,8 +94,8 @@ module Net # :nodoc:
94
94
  # which are listed here to keep a light and browsable main documentation.
95
95
  # We have:
96
96
  #
97
- # * PacketArgumentError: Generic argument error for class Net::DNS::Packet
98
- # * PacketError: Generic Packet error
97
+ # ArgumentError:: Argument Error for class Net::DNS::Packet
98
+ # PacketError:: Generic Packet Error
99
99
  #
100
100
  # =Copyright
101
101
  #
@@ -105,12 +105,24 @@ module Net # :nodoc:
105
105
  # it and/or modify it under the same terms as Ruby itself.
106
106
  #
107
107
  class Packet
108
-
109
108
  include Names
110
109
 
110
+ # Argument Error for class Net::DNS::Packet.
111
+ class ArgumentError < ArgumentError
112
+ end
113
+
114
+ # Base error class.
115
+ class Error < StandardError
116
+ end
117
+
118
+ # Generic Packet Error.
119
+ class PacketError < Error
120
+ end
121
+
122
+
111
123
  attr_reader :header, :question, :answer, :authority, :additional
112
124
  attr_reader :answerfrom, :answersize
113
-
125
+
114
126
  # Create a new instance of Net::DNS::Packet class. Arguments are the
115
127
  # canonical name of the resourse, an optional type field and an optional
116
128
  # class field. The record type and class can be omitted; they default
@@ -305,7 +317,7 @@ module Net # :nodoc:
305
317
  if object.kind_of? Net::DNS::Header
306
318
  @header = object
307
319
  else
308
- raise PacketArgumentError, "Argument must be a Net::DNS::Header object"
320
+ raise ArgumentError, "Argument must be a Net::DNS::Header object"
309
321
  end
310
322
  end
311
323
 
@@ -318,12 +330,12 @@ module Net # :nodoc:
318
330
  if object.all? {|x| x.kind_of? Net::DNS::Question}
319
331
  @question = object
320
332
  else
321
- raise PacketArgumentError, "Some of the elements is not an Net::DNS::Question object"
333
+ raise ArgumentError, "Some of the elements is not an Net::DNS::Question object"
322
334
  end
323
335
  when Net::DNS::Question
324
336
  @question = [object]
325
337
  else
326
- raise PacketArgumentError, "Invalid argument, not a Question object nor an array of objects"
338
+ raise ArgumentError, "Invalid argument, not a Question object nor an array of objects"
327
339
  end
328
340
  end
329
341
 
@@ -337,12 +349,12 @@ module Net # :nodoc:
337
349
  if object.all? {|x| x.kind_of? Net::DNS::RR}
338
350
  @answer = object
339
351
  else
340
- raise PacketArgumentError, "Some of the elements is not an Net::DNS::RR object"
352
+ raise ArgumentError, "Some of the elements is not an Net::DNS::RR object"
341
353
  end
342
354
  when Net::DNS::RR
343
355
  @answer = [object]
344
356
  else
345
- raise PacketArgumentError, "Invalid argument, not a RR object nor an array of objects"
357
+ raise ArgumentError, "Invalid argument, not a RR object nor an array of objects"
346
358
  end
347
359
  end
348
360
 
@@ -356,12 +368,12 @@ module Net # :nodoc:
356
368
  if object.all? {|x| x.kind_of? Net::DNS::RR}
357
369
  @additional = object
358
370
  else
359
- raise PacketArgumentError, "Some of the elements is not an Net::DNS::RR object"
371
+ raise ArgumentError, "Some of the elements is not an Net::DNS::RR object"
360
372
  end
361
373
  when Net::DNS::RR
362
374
  @additional = [object]
363
375
  else
364
- raise PacketArgumentError, "Invalid argument, not a RR object nor an array of objects"
376
+ raise ArgumentError, "Invalid argument, not a RR object nor an array of objects"
365
377
  end
366
378
  end
367
379
 
@@ -375,12 +387,12 @@ module Net # :nodoc:
375
387
  if object.all? {|x| x.kind_of? Net::DNS::RR}
376
388
  @authority = object
377
389
  else
378
- raise PacketArgumentError, "Some of the elements is not an Net::DNS::RR object"
390
+ raise ArgumentError, "Some of the elements is not an Net::DNS::RR object"
379
391
  end
380
392
  when Net::DNS::RR
381
393
  @authority = [object]
382
394
  else
383
- raise PacketArgumentError, "Invalid argument, not a RR object nor an array of objects"
395
+ raise ArgumentError, "Invalid argument, not a RR object nor an array of objects"
384
396
  end
385
397
  end
386
398
 
@@ -468,7 +480,7 @@ module Net # :nodoc:
468
480
  data.size
469
481
  end
470
482
 
471
- # Chacks whether a query has returned a NXDOMAIN error,
483
+ # Checks whether a query has returned a NXDOMAIN error,
472
484
  # meaning the domain name queried doesn't exists.
473
485
  #
474
486
  # %w[a.com google.com ibm.com d.com].each do |domain|
@@ -479,7 +491,7 @@ module Net # :nodoc:
479
491
  # #=> d.com doesn't exist
480
492
  #
481
493
  def nxdomain?
482
- header.rCode == Net::DNS::Header::NAME
494
+ header.rCode.code == Net::DNS::Header::RCode::NAME
483
495
  end
484
496
 
485
497
  private
@@ -566,16 +578,11 @@ module Net # :nodoc:
566
578
  def parse_question(data,offset)
567
579
  size = (dn_expand(data,offset)[1]-offset) + 2*Net::DNS::INT16SZ
568
580
  return [Net::DNS::Question.parse(data[offset,size]), offset+size]
569
- rescue StandardError => err
570
- raise PacketError, "Caught exception, maybe packet malformed => #{err}"
581
+ rescue StandardError => e
582
+ raise PacketError, "Caught exception, maybe packet malformed => #{e.message}"
571
583
  end
572
584
 
573
- end # class Packet
585
+ end
574
586
 
575
- end # module DNS
576
- end # module Net
577
-
578
- class PacketError < StandardError # :nodoc:
579
- end
580
- class PacketArgumentError < ArgumentError # :nodoc:
581
- end
587
+ end
588
+ end
@@ -1,12 +1,9 @@
1
- #---
2
- # $Id: Question.rb,v 1.8 2006/07/28 19:00:03 bluemonk Exp $
3
- #+++
4
-
5
- require 'net/dns/dns'
1
+ require 'net/dns'
6
2
  require 'net/dns/names/names'
7
3
  require 'net/dns/rr/types'
8
4
  require 'net/dns/rr/classes'
9
5
 
6
+
10
7
  module Net # :nodoc:
11
8
  module DNS
12
9
 
@@ -49,8 +46,8 @@ module Net # :nodoc:
49
46
  # which are listed here to keep a light and browsable main documentation.
50
47
  # We have:
51
48
  #
52
- # * QuestionArgumentError: generic argument error
53
- # * QuestionNameError: an error in the +name+ part of a Question entry
49
+ # ArgumentError:: Argument Error for class Net::DNS::Question
50
+ # NameError:: An error in the +name+ part of a Question entry
54
51
  #
55
52
  # =Copyright
56
53
  #
@@ -60,9 +57,20 @@ module Net # :nodoc:
60
57
  # it and/or modify it under the same terms as Ruby itself.
61
58
  #
62
59
  class Question
63
-
64
60
  include Net::DNS::Names
65
61
 
62
+ # Argument Error for class Net::DNS::Question
63
+ class ArgumentError < ArgumentError
64
+ end
65
+
66
+ # Base error class.
67
+ class Error < StandardError
68
+ end
69
+
70
+ # An error in the +name+ part of a Question entry
71
+ class NameError < Error
72
+ end
73
+
66
74
  # +name+ part of a Question entry
67
75
  attr_reader :qName
68
76
  # +type+ part of a Question entry
@@ -97,15 +105,11 @@ module Net # :nodoc:
97
105
  # #=> Queried for example.com type A
98
106
  #
99
107
  def self.parse(arg)
100
- if arg.kind_of? String
101
- o = allocate
102
- o.send(:new_from_binary,arg)
103
- o
104
- else
105
- raise QuestionArgumentError, "Wrong argument format, must be a String"
106
- end
108
+ o = allocate
109
+ o.send(:new_from_binary, arg.to_s)
110
+ o
107
111
  end
108
-
112
+
109
113
  # Known inspect method with nice formatting
110
114
  def inspect
111
115
  if @qName.size > 29 then
@@ -148,6 +152,40 @@ module Net # :nodoc:
148
152
  [[str,@qType.to_i,@qClass.to_i].pack("a*nn"),offset,names]
149
153
  end
150
154
 
155
+
156
+ #
157
+ # call-seq:
158
+ # question.inspect -> string
159
+ #
160
+ # Returns a printable version of question with nice formatting.
161
+ #
162
+ # q = Net::DNS::Question.new("google.com.", Net::DNS::A)
163
+ # q.inspect # => "google.com. IN A "
164
+ #
165
+ def inspect
166
+ if @qName.size > 29 then
167
+ len = @qName.size + 1
168
+ else
169
+ len = 29
170
+ end
171
+ [@qName, @qClass.to_s, @qType.to_s].pack("A#{len} A8 A8")
172
+ end
173
+
174
+ #
175
+ # call-seq:
176
+ # question.to_s -> string
177
+ #
178
+ # Returns a string representation of question.
179
+ # It is the same as <tt>inspect</tt>.
180
+ #
181
+ # q = Net::DNS::Question.new("google.com.", Net::DNS::A)
182
+ # q.inspect # => "google.com. IN A "
183
+ #
184
+ def to_s
185
+ "#{self.inspect}"
186
+ end
187
+
188
+
151
189
  private
152
190
 
153
191
  def build_qName(str)
@@ -167,12 +205,12 @@ module Net # :nodoc:
167
205
  def check_name(name)
168
206
  name.strip!
169
207
  if name =~ /[^\w\.\-_]/
170
- raise QuestionNameError, "Question name #{name.inspect} not valid"
208
+ raise NameError, "Question name #{name.inspect} not valid"
171
209
  else
172
210
  name
173
211
  end
174
212
  rescue
175
- raise QuestionNameError, "Question name #{name.inspect} not valid"
213
+ raise NameError, "Question name #{name.inspect} not valid"
176
214
  end
177
215
 
178
216
  def new_from_binary(data)
@@ -181,15 +219,10 @@ module Net # :nodoc:
181
219
  @qType = Net::DNS::RR::Types.new type
182
220
  @qClass = Net::DNS::RR::Classes.new cls
183
221
  rescue StandardError => e
184
- raise QuestionArgumentError, "Invalid data: #{data.inspect}\n{e.backtrace}"
222
+ raise ArgumentError, "Invalid data: #{data.inspect}\n{e.backtrace}"
185
223
  end
186
224
 
187
- end # class Question
225
+ end
188
226
 
189
- end # class DNS
190
- end # module Net
191
-
192
- class QuestionArgumentError < ArgumentError # :nodoc:
193
- end
194
- class QuestionNameError < StandardError # :nodoc:
195
- end
227
+ end
228
+ end
@@ -1,9 +1,3 @@
1
- #
2
- # $Id: Resolver.rb,v 1.11 2006/07/30 16:55:35 bluemonk Exp $
3
- #
4
-
5
-
6
-
7
1
  require 'rbconfig'
8
2
  require 'socket'
9
3
  require 'timeout'
@@ -15,18 +9,18 @@ require 'net/dns/resolver/timeouts'
15
9
  alias old_send send
16
10
 
17
11
  #
18
- # Resolver helper method
12
+ # = Resolver helper method
19
13
  #
20
- # Calling the resolver directly
14
+ # Calling the resolver directly:
21
15
  #
22
16
  # require 'net/dns/resolver'
23
17
  # puts Resolver("www.google.com").answer.size
24
- # #=> 5
18
+ # #=> 5
25
19
  #
26
- # An optional block can be passed yielding the Net::DNS::Packet object
20
+ # An optional block can be passed yielding the Net::DNS::Packet object.
27
21
  #
28
22
  # Resolver("www.google.com") {|packet| puts packet.size + " bytes"}
29
- # #=> 484 bytes
23
+ # #=> 484 bytes
30
24
  #
31
25
  def Resolver(name,type=Net::DNS::A,cls=Net::DNS::IN,&blk)
32
26
  obj = Net::DNS::Resolver.start(name,type,cls)
@@ -42,16 +36,8 @@ module Net # :nodoc:
42
36
 
43
37
  include Logger::Severity
44
38
 
45
- # =Name
46
- #
47
- # Net::DNS::Resolver - DNS resolver class
48
- #
49
- # =Synopsis
39
+ # = Net::DNS::Resolver - DNS resolver class
50
40
  #
51
- # require 'net/dns/resolver'
52
- #
53
- # =Description
54
- #
55
41
  # The Net::DNS::Resolver class implements a complete DNS resolver written
56
42
  # in pure Ruby, without a single C line of code. It has all of the
57
43
  # tipical properties of an evoluted resolver, and a bit of OO which
@@ -63,9 +49,7 @@ module Net # :nodoc:
63
49
  # the Perl version are still missing, but guys, at least this is
64
50
  # readable code!
65
51
  #
66
- # FIXME
67
- #
68
- # =Environment
52
+ # == Environment
69
53
  #
70
54
  # The Following Environment variables can also be used to configure
71
55
  # the resolver:
@@ -109,7 +93,18 @@ module Net # :nodoc:
109
93
  # % setenv RES_OPTIONS "retrans:3 retry:2 debug"
110
94
  #
111
95
  class Resolver
112
-
96
+
97
+ # Argument Error for class Net::DNS::Resolver.
98
+ class ArgumentError < ArgumentError
99
+ end
100
+
101
+ class Error < StandardError
102
+ end
103
+
104
+ class NoResponseError < Error
105
+ end
106
+
107
+
113
108
  # An hash with the defaults values of almost all the
114
109
  # configuration parameters of a resolver object. See
115
110
  # the description for each parameter to have an
@@ -131,8 +126,9 @@ module Net # :nodoc:
131
126
  :use_tcp => false,
132
127
  :ignore_truncated => false,
133
128
  :packet_size => 512,
134
- :tcp_timeout => TcpTimeout.new(120),
135
- :udp_timeout => UdpTimeout.new(0)}
129
+ :tcp_timeout => TcpTimeout.new(5),
130
+ :udp_timeout => UdpTimeout.new(5),
131
+ }
136
132
 
137
133
  # Create a new resolver object.
138
134
  #
@@ -152,7 +148,7 @@ module Net # :nodoc:
152
148
  # :recursive => false,
153
149
  # :retry => 10)
154
150
  #
155
- # ===Config file
151
+ # == Config file
156
152
  #
157
153
  # Net::DNS::Resolver uses a config file to read the usual
158
154
  # values a resolver needs, such as nameserver list and
@@ -191,42 +187,42 @@ module Net # :nodoc:
191
187
  # Explicit arguments to Resolver::new override both the system's defaults
192
188
  # and the values of the custom configuration file, if any.
193
189
  #
194
- # ===Parameters
190
+ # == Parameters
195
191
  #
196
192
  # The following arguments to Resolver::new are supported:
197
193
  #
198
- # - nameservers: an array reference of nameservers to query.
199
- # - searchlist: an array reference of domains.
200
- # - recurse
201
- # - debug
202
- # - domain
203
- # - port
204
- # - srcaddr
205
- # - srcport
206
- # - tcp_timeout
207
- # - udp_timeout
208
- # - retrans
209
- # - retry
210
- # - usevc
211
- # - stayopen
212
- # - igntc
213
- # - defnames
214
- # - dnsrch
215
- # - persistent_tcp
216
- # - persistent_udp
217
- # - dnssec
194
+ # * nameservers: an array reference of nameservers to query.
195
+ # * searchlist: an array reference of domains.
196
+ # * recurse
197
+ # * debug
198
+ # * domain
199
+ # * port
200
+ # * srcaddr
201
+ # * srcport
202
+ # * tcp_timeout
203
+ # * udp_timeout
204
+ # * retrans
205
+ # * retry
206
+ # * usevc
207
+ # * stayopen
208
+ # * igntc
209
+ # * defnames
210
+ # * dnsrch
211
+ # * persistent_tcp
212
+ # * persistent_udp
213
+ # * dnssec
218
214
  #
219
215
  # For more information on any of these options, please consult the
220
216
  # method of the same name.
221
217
  #
222
- # ===Disclaimer
218
+ # == Disclaimer
223
219
  #
224
220
  # Part of the above documentation is taken from the one in the
225
221
  # Net::DNS::Resolver Perl module.
226
222
  #
227
223
  def initialize(config = {})
228
- raise ResolverArgumentError, "Argument has to be Hash" unless config.kind_of? Hash
229
- # config.key_downcase!
224
+ raise ArgumentError, "Argument has to be Hash" unless config.kind_of? Hash
225
+ # config.downcase_keys!
230
226
  @config = Defaults.merge config
231
227
  @raw = false
232
228
 
@@ -262,33 +258,33 @@ module Net # :nodoc:
262
258
  begin
263
259
  eval "self.#{key.to_s} = val"
264
260
  rescue NoMethodError
265
- raise ResolverArgumentError, "Option #{key} not valid"
261
+ raise ArgumentError, "Option #{key} not valid"
266
262
  end
267
263
  end
268
264
  end
269
265
 
270
- # Get the resolver searchlist, returned as an array of entries
266
+ # Get the resolver search list, returned as an array of entries.
271
267
  #
272
268
  # res.searchlist
273
- # #=> ["example.com","a.example.com","b.example.com"]
269
+ # #=> ["example.com","a.example.com","b.example.com"]
274
270
  #
275
271
  def searchlist
276
272
  @config[:searchlist].inspect
277
273
  end
278
274
 
279
275
  # Set the resolver searchlist.
280
- # +arg+ can be a single string or an array of strings
276
+ # +arg+ can be a single string or an array of strings.
281
277
  #
282
278
  # res.searchstring = "example.com"
283
279
  # res.searchstring = ["example.com","a.example.com","b.example.com"]
284
280
  #
285
- # Note that you can also append a new name to the searchlist
281
+ # Note that you can also append a new name to the searchlist.
286
282
  #
287
283
  # res.searchlist << "c.example.com"
288
284
  # res.searchlist
289
- # #=> ["example.com","a.example.com","b.example.com","c.example.com"]
285
+ # #=> ["example.com","a.example.com","b.example.com","c.example.com"]
290
286
  #
291
- # The default is an empty array
287
+ # The default is an empty array.
292
288
  #
293
289
  def searchlist=(arg)
294
290
  case arg
@@ -299,11 +295,11 @@ module Net # :nodoc:
299
295
  @config[:searchlist] = arg if arg.all? {|x| valid? x}
300
296
  @logger.info "Searchlist changed to value #{@config[:searchlist].inspect}"
301
297
  else
302
- raise ResolverArgumentError, "Wrong argument format, neither String nor Array"
298
+ raise ArgumentError, "Wrong argument format, neither String nor Array"
303
299
  end
304
300
  end
305
301
 
306
- # Get the list of resolver nameservers, in a dotted decimal format
302
+ # Get the list of resolver nameservers, in a dotted decimal format-
307
303
  #
308
304
  # res.nameservers
309
305
  # #=> ["192.168.0.1","192.168.0.2"]
@@ -317,17 +313,17 @@ module Net # :nodoc:
317
313
  end
318
314
  alias_method :nameserver, :nameservers
319
315
 
320
- # Set the list of resolver nameservers
321
- # +arg+ can be a single ip address or an array of addresses
316
+ # Set the list of resolver nameservers.
317
+ # +arg+ can be a single ip address or an array of addresses.
322
318
  #
323
319
  # res.nameservers = "192.168.0.1"
324
320
  # res.nameservers = ["192.168.0.1","192.168.0.2"]
325
321
  #
326
- # If you want you can specify the addresses as IPAddr instances
322
+ # If you want you can specify the addresses as IPAddr instances.
327
323
  #
328
324
  # ip = IPAddr.new("192.168.0.3")
329
325
  # res.nameservers << ip
330
- # #=> ["192.168.0.1","192.168.0.2","192.168.0.3"]
326
+ # #=> ["192.168.0.1","192.168.0.2","192.168.0.3"]
331
327
  #
332
328
  # The default is 127.0.0.1 (localhost)
333
329
  #
@@ -357,30 +353,27 @@ module Net # :nodoc:
357
353
  when IPAddr
358
354
  x
359
355
  else
360
- raise ResolverArgumentError, "Wrong argument format"
356
+ raise ArgumentError, "Wrong argument format"
361
357
  end
362
358
  end
363
359
  @logger.info "Nameservers list changed to value #{@config[:nameservers].inspect}"
364
360
  else
365
- raise ResolverArgumentError, "Wrong argument format, neither String, Array nor IPAddr"
361
+ raise ArgumentError, "Wrong argument format, neither String, Array nor IPAddr"
366
362
  end
367
363
  end
368
364
  alias_method("nameserver=","nameservers=")
369
365
 
370
- # Return a string with the default domain
371
- #
366
+ # Return a string with the default domain.
372
367
  def domain
373
368
  @config[:domain].inspect
374
369
  end
375
370
 
376
- # Set the domain for the query
377
- #
371
+ # Set the domain for the query.
378
372
  def domain=(name)
379
373
  @config[:domain] = name if valid? name
380
374
  end
381
375
 
382
- # Return the defined size of the packet
383
- #
376
+ # Return the defined size of the packet.
384
377
  def packet_size
385
378
  @config[:packet_size]
386
379
  end
@@ -405,11 +398,11 @@ module Net # :nodoc:
405
398
  @config[:port] = num
406
399
  @logger.info "Port number changed to #{num}"
407
400
  else
408
- raise ResolverArgumentError, "Wrong port number #{num}"
401
+ raise ArgumentError, "Wrong port number #{num}"
409
402
  end
410
403
  end
411
404
 
412
- # Get the value of the source port number
405
+ # Get the value of the source port number.
413
406
  #
414
407
  # puts "Sending queries using port #{res.source_port}"
415
408
  #
@@ -436,7 +429,7 @@ module Net # :nodoc:
436
429
  if (0..65535).include?(num)
437
430
  @config[:source_port] = num
438
431
  else
439
- raise ResolverArgumentError, "Wrong port number #{num}"
432
+ raise ArgumentError, "Wrong port number #{num}"
440
433
  end
441
434
  end
442
435
  alias srcport= source_port=
@@ -450,8 +443,7 @@ module Net # :nodoc:
450
443
  end
451
444
  alias srcaddr source_address
452
445
 
453
- # Set the local source address from which the resolver sends its
454
- # queries.
446
+ # Set the local source address from which the resolver sends its queries.
455
447
  #
456
448
  # res.source_address = "172.16.100.1"
457
449
  # res.source_address = IPAddr.new("172.16.100.1")
@@ -472,12 +464,11 @@ module Net # :nodoc:
472
464
  # root priviledges, as raw sockets will be used to generate packets.
473
465
  # The class will then generate an exception if you're not root.
474
466
  #
475
- # The default is 0.0.0.0, meaning any local address (chosen on routing
476
- # needs).
467
+ # The default is 0.0.0.0, meaning any local address (chosen on routing needs).
477
468
  #
478
469
  def source_address=(addr)
479
470
  unless addr.respond_to? :to_s
480
- raise ResolverArgumentError, "Wrong address argument #{addr}"
471
+ raise ArgumentError, "Wrong address argument #{addr}"
481
472
  end
482
473
 
483
474
  begin
@@ -513,26 +504,24 @@ module Net # :nodoc:
513
504
  alias srcaddr= source_address=
514
505
 
515
506
  # Return the retrasmission interval (in seconds) the resolvers has
516
- # been set on
517
- #
507
+ # been set on.
518
508
  def retry_interval
519
509
  @config[:retry_interval]
520
510
  end
521
511
  alias retrans retry_interval
522
512
 
523
- # Set the retrasmission interval in seconds. Default 5 seconds
524
- #
513
+ # Set the retrasmission interval in seconds. Default 5 seconds.
525
514
  def retry_interval=(num)
526
515
  if num > 0
527
516
  @config[:retry_interval] = num
528
517
  @logger.info "Retransmission interval changed to #{num} seconds"
529
518
  else
530
- raise ResolverArgumentError, "Interval must be positive"
519
+ raise ArgumentError, "Interval must be positive"
531
520
  end
532
521
  end
533
522
  alias retrans= retry_interval=
534
523
 
535
- # The number of times the resolver will try a query
524
+ # The number of times the resolver will try a query.
536
525
  #
537
526
  # puts "Will try a max of #{res.retry_number} queries"
538
527
  #
@@ -541,14 +530,13 @@ module Net # :nodoc:
541
530
  end
542
531
 
543
532
  # Set the number of times the resolver will try a query.
544
- # Default 4 times
545
- #
533
+ # Default 4 times.
546
534
  def retry_number=(num)
547
535
  if num.kind_of? Integer and num > 0
548
536
  @config[:retry_number] = num
549
537
  @logger.info "Retrasmissions number changed to #{num}"
550
538
  else
551
- raise ResolverArgumentError, "Retry value must be a positive integer"
539
+ raise ArgumentError, "Retry value must be a positive integer"
552
540
  end
553
541
  end
554
542
  alias_method('retry=', 'retry_number=')
@@ -577,12 +565,12 @@ module Net # :nodoc:
577
565
  @config[:recursive] = bool
578
566
  @logger.info("Recursive state changed to #{bool}")
579
567
  else
580
- raise ResolverArgumentError, "Argument must be boolean"
568
+ raise ArgumentError, "Argument must be boolean"
581
569
  end
582
570
  end
583
571
  alias_method :recurse=, :recursive=
584
572
 
585
- # Return a string rapresenting the resolver state, suitable
573
+ # Return a string representing the resolver state, suitable
586
574
  # for printing on the screen.
587
575
  #
588
576
  # puts "Resolver state:"
@@ -629,11 +617,11 @@ module Net # :nodoc:
629
617
  @config[:defname] = bool
630
618
  @logger.info("Defname state changed to #{bool}")
631
619
  else
632
- raise ResolverArgumentError, "Argument must be boolean"
620
+ raise ArgumentError, "Argument must be boolean"
633
621
  end
634
622
  end
635
623
 
636
- # Get the state of the dns_search flag
624
+ # Get the state of the dns_search flag.
637
625
  def dns_search
638
626
  @config[:dns_search]
639
627
  end
@@ -642,14 +630,13 @@ module Net # :nodoc:
642
630
  # Set the flag +dns_search+ in a boolean state. If +dns_search+
643
631
  # is true, when using the Resolver#search method will be applied
644
632
  # the search list. Default is true.
645
- #
646
633
  def dns_search=(bool)
647
634
  case bool
648
635
  when TrueClass,FalseClass
649
636
  @config[:dns_search] = bool
650
637
  @logger.info("DNS search state changed to #{bool}")
651
638
  else
652
- raise ResolverArgumentError, "Argument must be boolean"
639
+ raise ArgumentError, "Argument must be boolean"
653
640
  end
654
641
  end
655
642
  alias_method("dnsrch=","dns_search=")
@@ -678,7 +665,7 @@ module Net # :nodoc:
678
665
  @config[:use_tcp] = bool
679
666
  @logger.info("Use tcp flag changed to #{bool}")
680
667
  else
681
- raise ResolverArgumentError, "Argument must be boolean"
668
+ raise ArgumentError, "Argument must be boolean"
682
669
  end
683
670
  end
684
671
  alias usevc= use_tcp=
@@ -694,7 +681,7 @@ module Net # :nodoc:
694
681
  @config[:ignore_truncated] = bool
695
682
  @logger.info("Ignore truncated flag changed to #{bool}")
696
683
  else
697
- raise ResolverArgumentError, "Argument must be boolean"
684
+ raise ArgumentError, "Argument must be boolean"
698
685
  end
699
686
  end
700
687
 
@@ -712,8 +699,7 @@ module Net # :nodoc:
712
699
  # puts "You set a timeout of " + res.tcp_timeout.pretty_to_s
713
700
  # #=> You set a timeout of 2 minutes and 30 seconds
714
701
  #
715
- # If the timeout is infinite, a string "infinite" will
716
- # be returned.
702
+ # If the timeout is infinite, a string "infinite" will be returned.
717
703
  #
718
704
  def tcp_timeout
719
705
  @config[:tcp_timeout].to_s
@@ -725,7 +711,8 @@ module Net # :nodoc:
725
711
  # The value is stored internally as a +TcpTimeout+ object, see
726
712
  # the description for Resolver#tcp_timeout
727
713
  #
728
- # Default is 120 seconds
714
+ # Default is 5 seconds.
715
+ #
729
716
  def tcp_timeout=(secs)
730
717
  @config[:tcp_timeout] = TcpTimeout.new(secs)
731
718
  @logger.info("New TCP timeout value: #{@config[:tcp_timeout]} seconds")
@@ -734,7 +721,7 @@ module Net # :nodoc:
734
721
  # Return an object representing the value of the stored UDP
735
722
  # timeout the resolver will use in is queries. This object
736
723
  # is an instance of the class +UdpTimeout+, and two methods
737
- # are available for printing informations: UdpTimeout#to_s
724
+ # are available for printing information: UdpTimeout#to_s
738
725
  # and UdpTimeout#pretty_to_s.
739
726
  #
740
727
  # Here's some example:
@@ -756,10 +743,11 @@ module Net # :nodoc:
756
743
  # will be performed using UDP. A value of 0 means that
757
744
  # the timeout will not be used, and the resolver will use
758
745
  # only +retry_number+ and +retry_interval+ parameters.
759
- # That is the default.
746
+ #
747
+ # Default is 5 seconds.
760
748
  #
761
749
  # The value is stored internally as a +UdpTimeout+ object, see
762
- # the description for Resolver#udp_timeout
750
+ # the description for Resolver#udp_timeout.
763
751
  #
764
752
  def udp_timeout=(secs)
765
753
  @config[:udp_timeout] = UdpTimeout.new(secs)
@@ -803,7 +791,7 @@ module Net # :nodoc:
803
791
  @logger.close
804
792
  @logger = logger
805
793
  else
806
- raise ResolverArgumentError, "Argument must be an instance of Logger class"
794
+ raise ArgumentError, "Argument must be an instance of Logger class"
807
795
  end
808
796
  end
809
797
 
@@ -995,8 +983,9 @@ module Net # :nodoc:
995
983
  ans = self.old_send(method,packet,packet_data)
996
984
 
997
985
  unless ans
998
- @logger.fatal "No response from nameservers list: aborting"
999
- raise NoResponseError
986
+ message = "No response from nameservers list"
987
+ @logger.fatal(message)
988
+ raise NoResponseError, message
1000
989
  end
1001
990
 
1002
991
  @logger.info "Received #{ans[0].size} bytes from #{ans[1][2]+":"+ans[1][1].to_s}"
@@ -1033,8 +1022,6 @@ module Net # :nodoc:
1033
1022
  # use, but automatically sort the results based on preferences
1034
1023
  # and returns an ordered array.
1035
1024
  #
1036
- # Example:
1037
- #
1038
1025
  # res = Net::DNS::Resolver.new
1039
1026
  # res.mx("google.com")
1040
1027
  #
@@ -1046,13 +1033,10 @@ module Net # :nodoc:
1046
1033
  return arr.sort_by {|a| a.preference}
1047
1034
  end
1048
1035
 
1049
- #
1050
1036
  # Quick resolver method. Bypass the configuration using
1051
1037
  # the defaults.
1052
1038
  #
1053
- # Example:
1054
- #
1055
- # puts Net::DNS::Resolver.start "www.google.com"
1039
+ # Net::DNS::Resolver.start "www.google.com"
1056
1040
  #
1057
1041
  def self.start(*params)
1058
1042
  self.new.search(*params)
@@ -1060,8 +1044,7 @@ module Net # :nodoc:
1060
1044
 
1061
1045
  private
1062
1046
 
1063
- # Parse a configuration file specified as the argument.
1064
- #
1047
+ # Parses a configuration file specified as the argument.
1065
1048
  def parse_config_file
1066
1049
  if self.class.platform_windows?
1067
1050
  require 'win32/resolv'
@@ -1084,7 +1067,7 @@ module Net # :nodoc:
1084
1067
  end
1085
1068
  end
1086
1069
 
1087
- # Parse environment variables
1070
+ # Parses environment variables.
1088
1071
  def parse_environment_variables
1089
1072
  if ENV['RES_NAMESERVERS']
1090
1073
  self.nameservers = ENV['RES_NAMESERVERS'].split(" ")
@@ -1101,7 +1084,7 @@ module Net # :nodoc:
1101
1084
  begin
1102
1085
  eval("self.#{name} = #{val}")
1103
1086
  rescue NoMethodError
1104
- raise ResolverArgumentError, "Invalid ENV option #{name}"
1087
+ raise ArgumentError, "Invalid ENV option #{name}"
1105
1088
  end
1106
1089
  end
1107
1090
  end
@@ -1219,7 +1202,7 @@ module Net # :nodoc:
1219
1202
 
1220
1203
  def valid?(name)
1221
1204
  if name =~ /[^-\w\.]/
1222
- raise ResolverArgumentError, "Invalid domain name #{name}"
1205
+ raise ArgumentError, "Invalid domain name #{name}"
1223
1206
  else
1224
1207
  true
1225
1208
  end
@@ -1239,44 +1222,6 @@ module Net # :nodoc:
1239
1222
 
1240
1223
  end
1241
1224
 
1242
- end # class Resolver
1243
- end # module DNS
1244
- end # module Net
1245
-
1246
- class ResolverArgumentError < ArgumentError # :nodoc:
1247
- end
1248
- class NoResponseError < StandardError # :nodoc:
1249
- end
1250
-
1251
- module ExtendHash # :nodoc:
1252
- # Returns an hash with all the
1253
- # keys turned into downcase
1254
- #
1255
- # hsh = {"Test" => 1, "FooBar" => 2}
1256
- # hsh.key_downcase!
1257
- # #=> {"test"=>1,"foobar"=>2}
1258
- #
1259
- def key_downcase!
1260
- hsh = Hash.new
1261
- self.each do |key,val|
1262
- hsh[key.downcase] = val
1263
1225
  end
1264
- self.replace(hsh)
1265
1226
  end
1266
- end
1267
-
1268
- class Hash # :nodoc:
1269
- include ExtendHash
1270
- end
1271
-
1272
-
1273
-
1274
-
1275
-
1276
-
1277
-
1278
-
1279
-
1280
-
1281
-
1282
-
1227
+ end