net-dns 0.6.1 → 0.7.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.
- data/.gitignore +8 -6
- data/.travis.yml +14 -0
- data/CHANGELOG.md +79 -0
- data/Gemfile +4 -0
- data/Rakefile +56 -66
- data/demo/check_soa.rb +1 -1
- data/demo/threads.rb +1 -1
- data/lib/net/dns.rb +24 -22
- data/lib/net/dns/header.rb +77 -103
- data/lib/net/dns/{names/names.rb → names.rb} +19 -20
- data/lib/net/dns/packet.rb +231 -256
- data/lib/net/dns/question.rb +11 -40
- data/lib/net/dns/resolver.rb +248 -250
- data/lib/net/dns/resolver/socks.rb +6 -6
- data/lib/net/dns/resolver/timeouts.rb +1 -1
- data/lib/net/dns/rr.rb +112 -117
- data/lib/net/dns/rr/a.rb +98 -89
- data/lib/net/dns/rr/aaaa.rb +84 -68
- data/lib/net/dns/rr/classes.rb +91 -106
- data/lib/net/dns/rr/cname.rb +64 -45
- data/lib/net/dns/rr/hinfo.rb +90 -50
- data/lib/net/dns/rr/mr.rb +61 -44
- data/lib/net/dns/rr/mx.rb +73 -48
- data/lib/net/dns/rr/ns.rb +60 -46
- data/lib/net/dns/rr/null.rb +11 -12
- data/lib/net/dns/rr/ptr.rb +47 -34
- data/lib/net/dns/rr/soa.rb +5 -6
- data/lib/net/dns/rr/srv.rb +1 -4
- data/lib/net/dns/rr/txt.rb +14 -14
- data/lib/net/dns/rr/types.rb +13 -13
- data/lib/net/dns/version.rb +8 -14
- data/net-dns.gemspec +35 -0
- data/setup.rb +3 -2
- data/test/header_test.rb +18 -18
- data/test/names_test.rb +21 -0
- data/test/packet_test.rb +38 -31
- data/test/question_test.rb +23 -24
- data/test/resolver/timeouts_test.rb +13 -13
- data/test/resolver_test.rb +28 -20
- data/test/rr/a_test.rb +70 -23
- data/test/rr/aaaa_test.rb +109 -0
- data/test/rr/classes_test.rb +61 -49
- data/test/rr/cname_test.rb +97 -0
- data/test/rr/hinfo_test.rb +117 -0
- data/test/rr/mr_test.rb +105 -0
- data/test/rr/mx_test.rb +112 -0
- data/test/rr/ns_test.rb +34 -12
- data/test/rr/types_test.rb +4 -4
- data/test/rr_test.rb +1 -1
- metadata +77 -52
- data/AUTHORS.rdoc +0 -7
- data/CHANGELOG.rdoc +0 -46
- data/VERSION.yml +0 -5
@@ -62,12 +62,12 @@ class RawSocket # :nodoc:
|
|
62
62
|
|
63
63
|
def check_addr addr
|
64
64
|
case addr
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
65
|
+
when String
|
66
|
+
IPAddr.new(addr)
|
67
|
+
when IPAddr
|
68
|
+
addr
|
69
|
+
else
|
70
|
+
raise ArgumentError, "Wrong address format: #{addr}"
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
data/lib/net/dns/rr.rb
CHANGED
@@ -1,37 +1,37 @@
|
|
1
|
-
require '
|
1
|
+
require 'ipaddr'
|
2
|
+
require 'net/dns/names'
|
2
3
|
require 'net/dns/rr/types'
|
3
4
|
require 'net/dns/rr/classes'
|
4
5
|
|
5
|
-
|
6
|
-
%w[a ns mx cname txt soa ptr aaaa mr].each do |file|
|
6
|
+
%w(a aaaa cname hinfo mr mx ns ptr soa srv txt).each do |file|
|
7
7
|
require "net/dns/rr/#{file}"
|
8
8
|
end
|
9
9
|
|
10
|
-
module Net
|
11
|
-
module DNS
|
12
|
-
|
10
|
+
module Net
|
11
|
+
module DNS
|
12
|
+
|
13
13
|
#
|
14
14
|
# = Net::DNS::RR - DNS Resource Record class
|
15
15
|
#
|
16
|
-
# The Net::DNS::RR is the base class for DNS Resource
|
16
|
+
# The Net::DNS::RR is the base class for DNS Resource
|
17
17
|
# Record (RR) objects. A RR is a pack of data that represents
|
18
|
-
# resources for a DNS zone. The form in which this data is
|
18
|
+
# resources for a DNS zone. The form in which this data is
|
19
19
|
# shows can be drawed as follow:
|
20
20
|
#
|
21
21
|
# "name ttl class type data"
|
22
|
-
#
|
22
|
+
#
|
23
23
|
# The +name+ is the name of the resource, like an canonical
|
24
24
|
# name for an +A+ record (internet ip address). The +ttl+ is the
|
25
|
-
# time to live, expressed in seconds. +type+ and +class+ are
|
25
|
+
# time to live, expressed in seconds. +type+ and +class+ are
|
26
26
|
# respectively the type of resource (+A+ for ip addresses, +NS+
|
27
|
-
# for nameservers, and so on) and the class, which is almost
|
27
|
+
# for nameservers, and so on) and the class, which is almost
|
28
28
|
# always +IN+, the Internet class. At the end, +data+ is the
|
29
|
-
# value associated to the name for that particular type of
|
29
|
+
# value associated to the name for that particular type of
|
30
30
|
# resource record. An example:
|
31
31
|
#
|
32
32
|
# # A record for IP address
|
33
33
|
# "www.example.com 86400 IN A 172.16.100.1"
|
34
|
-
#
|
34
|
+
#
|
35
35
|
# # NS record for name server
|
36
36
|
# "www.example.com 86400 IN NS ns.example.com"
|
37
37
|
#
|
@@ -39,34 +39,22 @@ module Net # :nodoc:
|
|
39
39
|
# such the ones above, or specifying each field as the pair
|
40
40
|
# of an hash. See the Net::DNS::RR.new method for details.
|
41
41
|
#
|
42
|
-
# == Error classes
|
43
|
-
#
|
44
|
-
# Some error classes has been defined for the Net::DNS::RR class,
|
45
|
-
# which are listed here to keep a light and browsable main documentation.
|
46
|
-
# We have:
|
47
|
-
#
|
48
|
-
# ArgumentError:: Generic argument error for class Net::DNS::RR
|
49
|
-
# DataError:: Error in parsing binary data, maybe from a malformed packet.
|
50
|
-
#
|
51
42
|
class RR
|
52
|
-
include
|
53
|
-
|
54
|
-
|
55
|
-
class ArgumentError < ArgumentError
|
56
|
-
end
|
57
|
-
|
43
|
+
include Names
|
44
|
+
|
45
|
+
|
58
46
|
# Base error class.
|
59
47
|
class Error < StandardError
|
60
48
|
end
|
61
|
-
|
49
|
+
|
62
50
|
# Error in parsing binary data, maybe from a malformed packet.
|
63
51
|
class DataError < Error
|
64
52
|
end
|
65
|
-
|
66
|
-
|
53
|
+
|
54
|
+
|
67
55
|
# Regexp matching an RR string
|
68
56
|
RR_REGEXP = Regexp.new("^\\s*(\\S+)\\s*(\\d+)?\\s+(" +
|
69
|
-
Net::DNS::RR::Classes.regexp +
|
57
|
+
Net::DNS::RR::Classes.regexp +
|
70
58
|
"|CLASS\\d+)?\\s*(" +
|
71
59
|
Net::DNS::RR::Types.regexp +
|
72
60
|
"|TYPE\\d+)?\\s*(.*)$", Regexp::IGNORECASE)
|
@@ -75,17 +63,10 @@ module Net # :nodoc:
|
|
75
63
|
# RR portion of the packet, in bytes
|
76
64
|
RRFIXEDSZ = 10
|
77
65
|
|
78
|
-
|
79
|
-
attr_reader :name
|
80
|
-
# TTL time (in seconds) of the RR
|
81
|
-
attr_reader :ttl
|
82
|
-
# Data belonging to that appropriate class,
|
83
|
-
# not to be used (use real accessors instead)
|
84
|
-
attr_reader :rdata
|
85
|
-
|
66
|
+
|
86
67
|
# Create a new instance of Net::DNS::RR class, or an instance of
|
87
68
|
# any of the subclass of the appropriate type.
|
88
|
-
#
|
69
|
+
#
|
89
70
|
# Argument can be a string or an hash. With a sting, we can pass
|
90
71
|
# a RR resource record in the canonical format:
|
91
72
|
#
|
@@ -95,12 +76,12 @@ module Net # :nodoc:
|
|
95
76
|
# txt = Net::DNS::RR.new('baz.example.com 3600 HS TXT "text record"')
|
96
77
|
#
|
97
78
|
# Incidentally, +a+, +mx+, +cname+ and +txt+ objects will be instances of
|
98
|
-
# respectively Net::DNS::RR::A, Net::DNS::RR::MX, Net::DNS::RR::CNAME and
|
79
|
+
# respectively Net::DNS::RR::A, Net::DNS::RR::MX, Net::DNS::RR::CNAME and
|
99
80
|
# Net::DNS::RR::TXT classes.
|
100
81
|
#
|
101
|
-
# The name and RR data are required; all other informations are optional.
|
82
|
+
# The name and RR data are required; all other informations are optional.
|
102
83
|
# If omitted, the +TTL+ defaults to 10800, +type+ default to +A+ and the RR class
|
103
|
-
# defaults to +IN+. Omitting the optional fields is useful for creating the
|
84
|
+
# defaults to +IN+. Omitting the optional fields is useful for creating the
|
104
85
|
# empty RDATA sections required for certain dynamic update operations.
|
105
86
|
# All names must be fully qualified. The trailing dot (.) is optional.
|
106
87
|
#
|
@@ -119,12 +100,12 @@ module Net # :nodoc:
|
|
119
100
|
# :rdata => "10.1.2.3"
|
120
101
|
# )
|
121
102
|
#
|
122
|
-
# Name and data are required; all the others fields are optionals like
|
123
|
-
# we've seen before. The data field can be specified either with the
|
103
|
+
# Name and data are required; all the others fields are optionals like
|
104
|
+
# we've seen before. The data field can be specified either with the
|
124
105
|
# right name of the resource (+:address+ in the example above) or with
|
125
106
|
# the generic key +:rdata+. Consult documentation to find the exact name
|
126
107
|
# for the resource in each subclass.
|
127
|
-
#
|
108
|
+
#
|
128
109
|
def initialize(arg)
|
129
110
|
instance = case arg
|
130
111
|
when String
|
@@ -151,107 +132,122 @@ module Net # :nodoc:
|
|
151
132
|
#
|
152
133
|
# This method is used when parsing a binary packet by the Packet
|
153
134
|
# class.
|
154
|
-
#
|
135
|
+
#
|
155
136
|
def RR.parse(data)
|
156
137
|
o = allocate
|
157
|
-
obj,offset = o.send(:new_from_binary, data, 0)
|
158
|
-
|
138
|
+
obj, offset = o.send(:new_from_binary, data, 0)
|
139
|
+
obj
|
159
140
|
end
|
160
|
-
|
161
|
-
# Same as RR.parse, but takes an entire packet binary data to
|
141
|
+
|
142
|
+
# Same as RR.parse, but takes an entire packet binary data to
|
162
143
|
# perform name expansion. Default when analizing a packet
|
163
144
|
# just received from a network stream.
|
164
145
|
#
|
165
|
-
# Return an instance of appropriate class and the offset
|
146
|
+
# Return an instance of appropriate class and the offset
|
166
147
|
# pointing at the end of the data parsed.
|
167
148
|
#
|
168
|
-
def RR.parse_packet(data,offset)
|
149
|
+
def RR.parse_packet(data, offset)
|
169
150
|
o = allocate
|
170
|
-
o.send(:new_from_binary,data,offset)
|
151
|
+
o.send(:new_from_binary, data, offset)
|
152
|
+
end
|
153
|
+
|
154
|
+
def name
|
155
|
+
@name
|
156
|
+
end
|
157
|
+
|
158
|
+
def ttl
|
159
|
+
@ttl
|
160
|
+
end
|
161
|
+
|
162
|
+
# Type accessor
|
163
|
+
def type
|
164
|
+
@type.to_s
|
165
|
+
end
|
166
|
+
|
167
|
+
# Class accessor
|
168
|
+
def cls
|
169
|
+
@cls.to_s
|
170
|
+
end
|
171
|
+
|
172
|
+
|
173
|
+
def value
|
174
|
+
get_inspect
|
171
175
|
end
|
172
176
|
|
173
|
-
#
|
174
|
-
#
|
177
|
+
# Data belonging to that appropriate class,
|
178
|
+
# not to be used (use real accessors instead)
|
179
|
+
def rdata
|
180
|
+
@rdata
|
181
|
+
end
|
182
|
+
|
183
|
+
# Return the RR object in binary data format, suitable
|
184
|
+
# for using in network streams.
|
185
|
+
#
|
186
|
+
# raw_data = rr.data
|
187
|
+
# puts "RR is #{raw_data.size} bytes long"
|
188
|
+
#
|
189
|
+
def data
|
190
|
+
str = pack_name(@name)
|
191
|
+
str + [@type.to_i, @cls.to_i, ttl, @rdlength].pack("n2 N n") + get_data
|
192
|
+
end
|
193
|
+
|
194
|
+
# Return the RR object in binary data format, suitable
|
195
|
+
# for using in network streams, with names compressed.
|
175
196
|
# Must pass as arguments the offset inside the packet
|
176
197
|
# and an hash of compressed names.
|
177
198
|
#
|
178
|
-
# This method is to be used in other classes and is
|
199
|
+
# This method is to be used in other classes and is
|
179
200
|
# not intended for user space programs.
|
180
201
|
#
|
181
202
|
# TO FIX in one of the future releases
|
182
203
|
#
|
183
204
|
def comp_data(offset,compnames)
|
184
|
-
|
185
|
-
str,
|
186
|
-
str += [type,cls,@ttl,@rdlength].pack("n2 N n")
|
205
|
+
str, offset, names = dn_comp(@name, offset, compnames)
|
206
|
+
str += [@type.to_i, @cls.to_i, ttl, @rdlength].pack("n2 N n")
|
187
207
|
offset += Net::DNS::RRFIXEDSZ
|
188
|
-
|
189
|
-
end
|
190
|
-
|
191
|
-
# Return the RR object in binary data format, suitable
|
192
|
-
# for using in network streams.
|
193
|
-
#
|
194
|
-
# raw_data = rr.data
|
195
|
-
# puts "RR is #{raw_data.size} bytes long"
|
196
|
-
#
|
197
|
-
def data
|
198
|
-
type,cls = @type.to_i, @cls.to_i
|
199
|
-
str = pack_name(@name)
|
200
|
-
return str + [type,cls,@ttl,@rdlength].pack("n2 N n") + get_data
|
208
|
+
[str, offset, names]
|
201
209
|
end
|
202
|
-
|
203
|
-
|
210
|
+
|
211
|
+
|
212
|
+
# Returns a human readable representation of this record.
|
213
|
+
# The value is always a String.
|
204
214
|
#
|
205
215
|
# mx = Net::DNS::RR.new("example.com. 7200 MX 10 mailhost.example.com.")
|
206
216
|
# #=> example.com. 7200 IN MX 10 mailhost.example.com.
|
207
217
|
#
|
208
218
|
def inspect
|
209
|
-
|
210
|
-
# Returns the preformatted string
|
211
|
-
if @name.size < 24
|
212
|
-
[@name, @ttl.to_s, @cls.to_s, @type.to_s, data].pack("A24 A8 A8 A8 A*")
|
213
|
-
else
|
214
|
-
to_a.join(" ")
|
215
|
-
end
|
219
|
+
to_s
|
216
220
|
end
|
217
221
|
|
218
|
-
# Returns
|
222
|
+
# Returns a String representation of this record.
|
219
223
|
#
|
220
224
|
# mx = Net::DNS::RR.new("example.com. 7200 MX 10 mailhost.example.com.")
|
221
225
|
# mx.to_s
|
222
226
|
# #=> "example.com. 7200 IN MX 10 mailhost.example.com."
|
223
227
|
#
|
224
228
|
def to_s
|
225
|
-
|
229
|
+
items = to_a.map { |e| e.to_s }
|
230
|
+
if @name.size < 24
|
231
|
+
items.pack("A24 A8 A8 A8 A*")
|
232
|
+
else
|
233
|
+
items.join(" ")
|
234
|
+
end.to_s
|
226
235
|
end
|
227
236
|
|
228
|
-
# Returns an
|
237
|
+
# Returns an Array with all the attributes for this record.
|
229
238
|
#
|
230
239
|
# mx = Net::DNS::RR.new("example.com. 7200 MX 10 mailhost.example.com.")
|
231
240
|
# mx.to_a
|
232
|
-
# #=> ["example.com.",7200,"IN","MX","10 mailhost.example.com."]
|
241
|
+
# #=> ["example.com.", 7200, "IN", "MX", "10 mailhost.example.com."]
|
233
242
|
#
|
234
243
|
def to_a
|
235
|
-
[
|
236
|
-
end
|
237
|
-
|
238
|
-
# Type accessor
|
239
|
-
def type
|
240
|
-
@type.to_s
|
244
|
+
[name, ttl, cls.to_s, type.to_s, value]
|
241
245
|
end
|
242
|
-
|
243
|
-
|
244
|
-
def cls
|
245
|
-
@cls.to_s
|
246
|
-
end
|
247
|
-
|
246
|
+
|
247
|
+
|
248
248
|
private
|
249
249
|
|
250
|
-
#---
|
251
|
-
# New RR with argument in string form
|
252
|
-
#---
|
253
250
|
def new_from_string(rrstring)
|
254
|
-
|
255
251
|
unless rrstring =~ RR_REGEXP
|
256
252
|
raise ArgumentError,
|
257
253
|
"Format error for RR string (maybe CLASS and TYPE not valid?)"
|
@@ -277,7 +273,7 @@ module Net # :nodoc:
|
|
277
273
|
@rdata = $5 ? $5.strip : ""
|
278
274
|
|
279
275
|
if self.class == Net::DNS::RR
|
280
|
-
|
276
|
+
Net::DNS::RR.const_get(@type.to_s).new(rrstring)
|
281
277
|
else
|
282
278
|
subclass_new_from_string(@rdata)
|
283
279
|
self.class
|
@@ -287,7 +283,7 @@ module Net # :nodoc:
|
|
287
283
|
def new_from_hash(args)
|
288
284
|
# Name field is mandatory
|
289
285
|
unless args.has_key? :name
|
290
|
-
raise ArgumentError, "
|
286
|
+
raise ArgumentError, ":name field is mandatory"
|
291
287
|
end
|
292
288
|
|
293
289
|
@name = args[:name].downcase
|
@@ -299,9 +295,9 @@ module Net # :nodoc:
|
|
299
295
|
@rdlength = args[:rdlength] || @rdata.size
|
300
296
|
|
301
297
|
if self.class == Net::DNS::RR
|
302
|
-
|
298
|
+
Net::DNS::RR.const_get(@type.to_s).new(args)
|
303
299
|
else
|
304
|
-
hash = args - [:name
|
300
|
+
hash = args - [:name, :ttl, :type, :cls]
|
305
301
|
if hash.has_key? :rdata
|
306
302
|
subclass_new_from_string(hash[:rdata])
|
307
303
|
else
|
@@ -309,7 +305,7 @@ module Net # :nodoc:
|
|
309
305
|
end
|
310
306
|
self.class
|
311
307
|
end
|
312
|
-
end
|
308
|
+
end
|
313
309
|
|
314
310
|
def new_from_binary(data,offset)
|
315
311
|
if self.class == Net::DNS::RR
|
@@ -325,7 +321,7 @@ module Net # :nodoc:
|
|
325
321
|
offset = subclass_new_from_binary(data,offset)
|
326
322
|
build_pack
|
327
323
|
set_type
|
328
|
-
|
324
|
+
[self, offset]
|
329
325
|
end
|
330
326
|
end
|
331
327
|
|
@@ -336,7 +332,7 @@ module Net # :nodoc:
|
|
336
332
|
end
|
337
333
|
def subclass_new_from_hash(hash)
|
338
334
|
end
|
339
|
-
def subclass_new_from_binary(data,offset)
|
335
|
+
def subclass_new_from_binary(data, offset)
|
340
336
|
end
|
341
337
|
def build_pack
|
342
338
|
end
|
@@ -354,18 +350,17 @@ module Net # :nodoc:
|
|
354
350
|
end
|
355
351
|
|
356
352
|
|
357
|
-
# NEW new method :)
|
358
353
|
def self.new(*args)
|
359
|
-
o
|
354
|
+
o = allocate
|
360
355
|
obj = o.send(:initialize,*args)
|
361
356
|
if self == Net::DNS::RR
|
362
|
-
|
357
|
+
obj
|
363
358
|
else
|
364
|
-
|
359
|
+
o
|
365
360
|
end
|
366
361
|
end
|
367
|
-
|
362
|
+
|
368
363
|
end
|
369
|
-
|
364
|
+
|
370
365
|
end
|
371
|
-
end
|
366
|
+
end
|
data/lib/net/dns/rr/a.rb
CHANGED
@@ -1,115 +1,124 @@
|
|
1
|
-
|
1
|
+
module Net
|
2
|
+
module DNS
|
3
|
+
class RR
|
2
4
|
|
3
|
-
|
4
|
-
module Net # :nodoc:
|
5
|
-
module DNS
|
6
|
-
|
7
|
-
class RR
|
8
|
-
|
9
|
-
# =Name
|
10
|
-
#
|
11
|
-
# Net::DNS::RR::A DNS A resource record
|
12
5
|
#
|
13
|
-
# =
|
6
|
+
# = IPv4 Address Record (A)
|
14
7
|
#
|
15
|
-
#
|
8
|
+
# Class for DNS IPv4 Address (A) resource records.
|
16
9
|
#
|
17
|
-
#
|
10
|
+
# The resource data is an IPv4 (i.e. 32 bit long) address,
|
11
|
+
# hold in the instance variable +address+.
|
18
12
|
#
|
19
|
-
# Net::DNS::RR::A
|
20
|
-
# most common in a DNS query. Its resource data is an IPv4 (i.e. 32 bit
|
21
|
-
# long) address, hold in the instance variable +address+.
|
22
|
-
# a = Net::DNS::RR::A.new("localhost.movie.edu. 360 IN A 127.0.0.1")
|
13
|
+
# a = Net::DNS::RR::A.new("localhost.movie.edu. 360 IN A 127.0.0.1")
|
23
14
|
#
|
24
|
-
#
|
25
|
-
#
|
26
|
-
#
|
27
|
-
#
|
28
|
-
#
|
15
|
+
# a = Net::DNS::RR::A.new(:name => "localhost.movie.edu.",
|
16
|
+
# :ttl => 360,
|
17
|
+
# :cls => Net::DNS::IN,
|
18
|
+
# :type => Net::DNS::A,
|
19
|
+
# :address => "127.0.0.1" )
|
29
20
|
#
|
30
|
-
# When computing binary data to
|
21
|
+
# When computing binary data to transmit the RR, the RDATA section is an
|
31
22
|
# Internet address expressed as four decimal numbers separated by dots
|
32
|
-
# without any
|
23
|
+
# without any embedded space (e.g. "10.2.0.52" or "192.0.5.6").
|
33
24
|
#
|
34
25
|
class A < RR
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
#
|
39
|
-
|
26
|
+
|
27
|
+
# Gets the current IPv4 address for this record.
|
28
|
+
#
|
29
|
+
# Returns an instance of IPAddr.
|
30
|
+
def address
|
31
|
+
@address
|
32
|
+
end
|
33
|
+
|
34
|
+
# Assigns a new IPv4 address to this record, which can be in the
|
35
|
+
# form of a <tt>String</tt> or an <tt>IPAddr</tt> object.
|
36
|
+
#
|
37
|
+
# Examples
|
40
38
|
#
|
41
39
|
# a.address = "192.168.0.1"
|
42
40
|
# a.address = IPAddr.new("10.0.0.1")
|
43
41
|
#
|
44
|
-
|
45
|
-
|
42
|
+
# Returns the new allocated instance of IPAddr.
|
43
|
+
def address=(string_or_ipaddr)
|
44
|
+
@address = check_address(string_or_ipaddr)
|
46
45
|
build_pack
|
46
|
+
@address
|
47
|
+
end
|
48
|
+
|
49
|
+
# Gets the standardized value for this record,
|
50
|
+
# represented by the value of <tt>address</tt>.
|
51
|
+
#
|
52
|
+
# Returns a String.
|
53
|
+
def value
|
54
|
+
address.to_s
|
47
55
|
end
|
48
|
-
|
56
|
+
|
57
|
+
|
49
58
|
private
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
address = IPAddr.new tempAddr
|
60
|
-
when IPAddr
|
61
|
-
address = addr
|
62
|
-
else
|
63
|
-
raise ArgumentError, "Unknown address type `#{addr}'"
|
59
|
+
|
60
|
+
def subclass_new_from_hash(options)
|
61
|
+
if options.has_key?(:address)
|
62
|
+
@address = check_address(options[:address])
|
63
|
+
elsif options.has_key?(:rdata)
|
64
|
+
@address = check_address(options[:rdata])
|
65
|
+
else
|
66
|
+
raise ArgumentError, ":address or :rdata field is mandatory"
|
67
|
+
end
|
64
68
|
end
|
65
|
-
raise ArgumentError, "Must specify an IPv4 address" unless address.ipv4?
|
66
|
-
address
|
67
|
-
rescue ::ArgumentError
|
68
|
-
raise ArgumentError, "Invalid address `#{addr}'"
|
69
|
-
end
|
70
|
-
|
71
|
-
def build_pack
|
72
|
-
@address_pack = @address.hton
|
73
|
-
@rdlength = @address_pack.size
|
74
|
-
end
|
75
|
-
|
76
|
-
def get_data
|
77
|
-
@address_pack
|
78
|
-
end
|
79
69
|
|
80
|
-
|
81
|
-
|
82
|
-
end
|
83
|
-
|
84
|
-
def subclass_new_from_hash(args)
|
85
|
-
if args.has_key? :address
|
86
|
-
@address = check_address args[:address]
|
87
|
-
elsif args.has_key? :rdata
|
88
|
-
@address = check_address args[:rdata]
|
89
|
-
else
|
90
|
-
# Address field is mandatory
|
91
|
-
raise ArgumentError, ":address field is mandatory but missing"
|
70
|
+
def subclass_new_from_string(str)
|
71
|
+
@address = check_address(str)
|
92
72
|
end
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
@address = IPAddr.new "#{a}.#{b}.#{c}.#{d}"
|
102
|
-
return offset + 4
|
103
|
-
end
|
104
|
-
|
105
|
-
private
|
106
|
-
|
73
|
+
|
74
|
+
def subclass_new_from_binary(data, offset)
|
75
|
+
a, b, c, d = data.unpack("@#{offset} CCCC")
|
76
|
+
@address = IPAddr.new("#{a}.#{b}.#{c}.#{d}")
|
77
|
+
offset + 4
|
78
|
+
end
|
79
|
+
|
80
|
+
|
107
81
|
def set_type
|
108
82
|
@type = Net::DNS::RR::Types.new("A")
|
109
83
|
end
|
110
|
-
|
84
|
+
|
85
|
+
def get_inspect
|
86
|
+
value
|
87
|
+
end
|
88
|
+
|
89
|
+
|
90
|
+
def check_address(input)
|
91
|
+
address = case input
|
92
|
+
when IPAddr
|
93
|
+
input
|
94
|
+
when Integer # Address in numeric form
|
95
|
+
tmp = [(input >> 24), (input >> 16) & 0xFF, (input >> 8) & 0xFF, input & 0xFF]
|
96
|
+
tmp = tmp.collect { |x| x.to_s }.join(".")
|
97
|
+
IPAddr.new(tmp)
|
98
|
+
when String
|
99
|
+
IPAddr.new(input)
|
100
|
+
else
|
101
|
+
raise ArgumentError, "Invalid IP address `#{input}'"
|
102
|
+
end
|
103
|
+
|
104
|
+
if !address.ipv4?
|
105
|
+
raise(ArgumentError, "Must specify an IPv4 address")
|
106
|
+
end
|
107
|
+
|
108
|
+
address
|
109
|
+
end
|
110
|
+
|
111
|
+
def build_pack
|
112
|
+
@address_pack = @address.hton
|
113
|
+
@rdlength = @address_pack.size
|
114
|
+
end
|
115
|
+
|
116
|
+
def get_data
|
117
|
+
@address_pack
|
118
|
+
end
|
119
|
+
|
111
120
|
end
|
112
|
-
|
121
|
+
|
113
122
|
end
|
114
123
|
end
|
115
|
-
end
|
124
|
+
end
|