net-dns 0.8.0 → 0.9.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.
- checksums.yaml +6 -14
- data/.gitignore +1 -1
- data/.rspec +1 -0
- data/.rubocop.yml +3 -0
- data/.rubocop_defaults.yml +364 -0
- data/.rubocop_todo.yml +207 -0
- data/.travis.yml +9 -16
- data/CHANGELOG.md +12 -1
- data/Gemfile +6 -2
- data/LICENSE.txt +56 -0
- data/README.md +94 -77
- data/Rakefile +23 -56
- data/bin/console +14 -0
- data/demo/check_soa.rb +27 -38
- data/demo/threads.rb +3 -7
- data/lib/net/dns.rb +4 -11
- data/lib/net/dns/core_ext.rb +8 -15
- data/lib/net/dns/header.rb +58 -66
- data/lib/net/dns/names.rb +25 -23
- data/lib/net/dns/packet.rb +136 -139
- data/lib/net/dns/question.rb +36 -39
- data/lib/net/dns/resolver.rb +103 -113
- data/lib/net/dns/resolver/socks.rb +45 -51
- data/lib/net/dns/resolver/timeouts.rb +17 -26
- data/lib/net/dns/rr.rb +107 -117
- data/lib/net/dns/rr/a.rb +46 -55
- data/lib/net/dns/rr/aaaa.rb +40 -49
- data/lib/net/dns/rr/classes.rb +26 -29
- data/lib/net/dns/rr/cname.rb +33 -41
- data/lib/net/dns/rr/hinfo.rb +44 -56
- data/lib/net/dns/rr/mr.rb +33 -42
- data/lib/net/dns/rr/mx.rb +37 -47
- data/lib/net/dns/rr/ns.rb +33 -41
- data/lib/net/dns/rr/null.rb +8 -11
- data/lib/net/dns/rr/ptr.rb +14 -20
- data/lib/net/dns/rr/soa.rb +27 -30
- data/lib/net/dns/rr/srv.rb +13 -17
- data/lib/net/dns/rr/txt.rb +8 -11
- data/lib/net/dns/rr/types.rb +97 -99
- data/lib/net/dns/version.rb +5 -13
- data/net-dns.gemspec +17 -29
- data/{fixtures → spec/fixtures}/resolv.conf +0 -0
- data/spec/spec_helper.rb +14 -0
- data/spec/unit/resolver/dns_timeout_spec.rb +36 -0
- data/spec/unit/resolver/tcp_timeout_spec.rb +46 -0
- data/spec/unit/resolver/udp_timeout_spec.rb +46 -0
- data/test/test_helper.rb +12 -3
- data/test/{header_test.rb → unit/header_test.rb} +43 -46
- data/test/{names_test.rb → unit/names_test.rb} +1 -1
- data/test/{packet_test.rb → unit/packet_test.rb} +3 -5
- data/test/{question_test.rb → unit/question_test.rb} +3 -5
- data/test/{resolver_test.rb → unit/resolver_test.rb} +10 -13
- data/test/{rr → unit/rr}/a_test.rb +10 -17
- data/test/{rr → unit/rr}/aaaa_test.rb +7 -14
- data/test/{rr → unit/rr}/classes_test.rb +14 -16
- data/test/{rr → unit/rr}/cname_test.rb +7 -14
- data/test/{rr → unit/rr}/hinfo_test.rb +16 -22
- data/test/{rr → unit/rr}/mr_test.rb +12 -18
- data/test/{rr → unit/rr}/mx_test.rb +18 -24
- data/test/{rr → unit/rr}/ns_test.rb +10 -16
- data/test/{rr → unit/rr}/types_test.rb +10 -8
- data/test/{rr_test.rb → unit/rr_test.rb} +33 -37
- metadata +77 -49
- data/test/resolver/timeouts_test.rb +0 -109
data/demo/threads.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
-
require 'rubygems' if
|
1
|
+
require 'rubygems' if RUBY_VERSION.to_s < "1.9.0"
|
2
2
|
require 'net/dns'
|
3
3
|
|
4
4
|
a = ["ibm.com", "sun.com", "redhat.com"]
|
5
5
|
|
6
6
|
threads = []
|
7
7
|
|
8
|
-
|
8
|
+
a.each do |dom|
|
9
9
|
threads << Thread.new(dom) do |domain|
|
10
10
|
res = Net::DNS::Resolver.new
|
11
11
|
res.query(domain, Net::DNS::NS).each_nameserver do |ns|
|
@@ -15,8 +15,4 @@ for dom in a
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
threads.each
|
19
|
-
t.join
|
20
|
-
end
|
21
|
-
|
22
|
-
|
18
|
+
threads.each(&:join)
|
data/lib/net/dns.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
require_relative 'dns/version'
|
2
|
+
require_relative 'dns/core_ext'
|
3
|
+
require_relative 'dns/resolver'
|
4
|
+
require_relative 'dns/rr'
|
4
5
|
|
5
6
|
module Net
|
6
7
|
module DNS
|
7
|
-
|
8
8
|
# Packet size in bytes
|
9
9
|
PACKETSZ = 512
|
10
10
|
|
@@ -23,9 +23,7 @@ module Net
|
|
23
23
|
# Size of a short int
|
24
24
|
INT16SZ = 2
|
25
25
|
|
26
|
-
|
27
26
|
module QueryTypes
|
28
|
-
|
29
27
|
SIGZERO = 0
|
30
28
|
A = 1
|
31
29
|
NS = 2
|
@@ -82,11 +80,9 @@ module Net
|
|
82
80
|
MAILB = 253
|
83
81
|
MAILA = 254
|
84
82
|
ANY = 255
|
85
|
-
|
86
83
|
end
|
87
84
|
|
88
85
|
module QueryClasses
|
89
|
-
|
90
86
|
# Internet class
|
91
87
|
IN = 1
|
92
88
|
|
@@ -101,12 +97,9 @@ module Net
|
|
101
97
|
|
102
98
|
# Any class
|
103
99
|
ANY = 255
|
104
|
-
|
105
100
|
end
|
106
101
|
|
107
102
|
include QueryTypes
|
108
103
|
include QueryClasses
|
109
|
-
|
110
104
|
end
|
111
|
-
|
112
105
|
end
|
data/lib/net/dns/core_ext.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
module Net # :nodoc:
|
2
2
|
module DNS
|
3
|
-
|
4
3
|
module HashKeys # :nodoc:
|
5
|
-
|
6
4
|
# Returns an hash with all the
|
7
5
|
# keys turned into downcase
|
8
6
|
#
|
@@ -11,17 +9,15 @@ module Net # :nodoc:
|
|
11
9
|
# #=> {"test"=>1,"foobar"=>2}
|
12
10
|
#
|
13
11
|
def downcase_keys!
|
14
|
-
hsh =
|
15
|
-
|
12
|
+
hsh = {}
|
13
|
+
each do |key, val|
|
16
14
|
hsh[key.downcase] = val
|
17
15
|
end
|
18
|
-
|
16
|
+
replace(hsh)
|
19
17
|
end
|
20
|
-
|
21
18
|
end
|
22
19
|
|
23
20
|
module HashOperators # :nodoc:
|
24
|
-
|
25
21
|
# Performs a sort of group difference
|
26
22
|
# operation on hashes or arrays
|
27
23
|
#
|
@@ -33,20 +29,17 @@ module Net # :nodoc:
|
|
33
29
|
#
|
34
30
|
def -(other)
|
35
31
|
case other
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
32
|
+
when Hash
|
33
|
+
delete_if { |k, v| other.key?(k) }
|
34
|
+
when Array
|
35
|
+
delete_if { |k, v| other.include?(k) }
|
40
36
|
end
|
41
37
|
end
|
42
|
-
|
43
38
|
end
|
44
|
-
|
45
39
|
end
|
46
40
|
end
|
47
41
|
|
48
|
-
|
49
42
|
class Hash # :nodoc:
|
50
43
|
include Net::DNS::HashKeys
|
51
44
|
include Net::DNS::HashOperators
|
52
|
-
end
|
45
|
+
end
|
data/lib/net/dns/header.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
module Net
|
2
2
|
module DNS
|
3
|
-
|
4
3
|
# DNS packet header class
|
5
4
|
#
|
6
5
|
# The Net::DNS::Header class represents the header portion of a
|
@@ -37,7 +36,6 @@ module Net
|
|
37
36
|
# more or less the same.
|
38
37
|
#
|
39
38
|
class Header
|
40
|
-
|
41
39
|
# A wrong +count+ parameter has been passed.
|
42
40
|
class WrongCountError < ArgumentError
|
43
41
|
end
|
@@ -54,7 +52,6 @@ module Net
|
|
54
52
|
class Error < StandardError
|
55
53
|
end
|
56
54
|
|
57
|
-
|
58
55
|
# DNS Header RCode handling class
|
59
56
|
#
|
60
57
|
# It should be used internally by Net::DNS::Header class. However, it's still
|
@@ -103,7 +100,6 @@ module Net
|
|
103
100
|
# More RCodes has to come for TSIGs and other operations.
|
104
101
|
#
|
105
102
|
class RCode
|
106
|
-
|
107
103
|
# Constant for +rcode+ Response Code No Error
|
108
104
|
NOERROR = 0
|
109
105
|
# Constant for +rcode+ Response Code Format Error
|
@@ -117,27 +113,25 @@ module Net
|
|
117
113
|
# Constant for +rcode+ Response Code Refused Error
|
118
114
|
REFUSED = 5
|
119
115
|
|
120
|
-
|
121
|
-
|
122
116
|
RCodeType = %w[NoError FormErr ServFail NXDomain NotImp
|
123
|
-
|
117
|
+
Refused YXDomain YXRRSet NXRRSet NotAuth NotZone].freeze
|
124
118
|
|
125
119
|
RCodeErrorString = ["No errors",
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
120
|
+
"The name server was unable to interpret the query",
|
121
|
+
"The name server was unable to process this query due to problem with the name server",
|
122
|
+
"Domain name referenced in the query does not exists",
|
123
|
+
"The name server does not support the requested kind of query",
|
124
|
+
"The name server refuses to perform the specified operation for policy reasons",
|
125
|
+
"",
|
126
|
+
"",
|
127
|
+
"",
|
128
|
+
"",
|
129
|
+
"",].freeze
|
136
130
|
|
137
131
|
attr_reader :code, :type, :explanation
|
138
132
|
|
139
133
|
def initialize(code)
|
140
|
-
if (0..10).
|
134
|
+
if (0..10).cover? code
|
141
135
|
@code = code
|
142
136
|
@type = RCodeType[code]
|
143
137
|
@explanation = RCodeErrorString[code]
|
@@ -151,7 +145,6 @@ module Net
|
|
151
145
|
end
|
152
146
|
end
|
153
147
|
|
154
|
-
|
155
148
|
# Constant for +opCode+ query
|
156
149
|
QUERY = 0
|
157
150
|
# Constant for +opCode+ iquery
|
@@ -159,7 +152,7 @@ module Net
|
|
159
152
|
# Constant for +opCode+ status
|
160
153
|
STATUS = 2
|
161
154
|
# Array with given strings
|
162
|
-
OPARR = %w[QUERY IQUERY STATUS]
|
155
|
+
OPARR = %w[QUERY IQUERY STATUS].freeze
|
163
156
|
|
164
157
|
# Reader for +id+ attribute
|
165
158
|
attr_reader :id
|
@@ -212,7 +205,7 @@ module Net
|
|
212
205
|
# See also each option for a detailed explanation of usage.
|
213
206
|
#
|
214
207
|
def initialize(arg = {})
|
215
|
-
if arg.
|
208
|
+
if arg.is_a? Hash
|
216
209
|
new_from_hash(arg)
|
217
210
|
else
|
218
211
|
raise ArgumentError, "Wrong argument class `#{arg.class}'"
|
@@ -232,7 +225,7 @@ module Net
|
|
232
225
|
# #=> "true" if it comes from authoritative name server
|
233
226
|
#
|
234
227
|
def self.parse(arg)
|
235
|
-
if arg.
|
228
|
+
if arg.is_a? String
|
236
229
|
o = allocate
|
237
230
|
o.send(:new_from_binary, arg)
|
238
231
|
o
|
@@ -253,24 +246,24 @@ module Net
|
|
253
246
|
# way of display output.
|
254
247
|
#
|
255
248
|
def inspect
|
256
|
-
";; id =
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
"opCode: #{opCode_str}\t"
|
262
|
-
"aa =
|
263
|
-
"tc =
|
264
|
-
"rd =
|
265
|
-
";; ra =
|
266
|
-
"ad =
|
267
|
-
"cd =
|
268
|
-
"rcode = #{@rCode.type}\n"
|
269
|
-
";; qdCount =
|
270
|
-
"anCount =
|
271
|
-
"nsCount =
|
272
|
-
"arCount =
|
273
|
-
|
249
|
+
";; id = #{@id}\n" +
|
250
|
+
if false # @opCode == "UPDATE"
|
251
|
+
# do stuff
|
252
|
+
else
|
253
|
+
";; qr = #{@qr}\t" \
|
254
|
+
"opCode: #{opCode_str}\t" \
|
255
|
+
"aa = #{@aa}\t" \
|
256
|
+
"tc = #{@tc}\t" \
|
257
|
+
"rd = #{@rd}\n" \
|
258
|
+
";; ra = #{@ra}\t" \
|
259
|
+
"ad = #{@ad}\t" \
|
260
|
+
"cd = #{@cd}\t" \
|
261
|
+
"rcode = #{@rCode.type}\n" \
|
262
|
+
";; qdCount = #{@qdCount}\t" \
|
263
|
+
"anCount = #{@anCount}\t" \
|
264
|
+
"nsCount = #{@nsCount}\t" \
|
265
|
+
"arCount = #{@arCount}\n"
|
266
|
+
end
|
274
267
|
end
|
275
268
|
|
276
269
|
# The Net::DNS::Header#format method prints out the header
|
@@ -297,7 +290,7 @@ module Net
|
|
297
290
|
def format
|
298
291
|
del = ("+-" * 16) + "+\n"
|
299
292
|
len = del.length
|
300
|
-
str = del + "|" + @id.to_s.center(len-3) + "|\n"
|
293
|
+
str = del + "|" + @id.to_s.center(len - 3) + "|\n"
|
301
294
|
str += del + "|" + @qr.to_s
|
302
295
|
str += "|" + @opCode.to_s.center(7)
|
303
296
|
str += "|" + @aa.to_s
|
@@ -307,10 +300,10 @@ module Net
|
|
307
300
|
str += "|" + @ad.to_s
|
308
301
|
str += "|" + @cd.to_s.center(3)
|
309
302
|
str += "|" + @rCode.to_s.center(7) + "|\n"
|
310
|
-
str += del + "|" + @qdCount.to_s.center(len-3) + "|\n"
|
311
|
-
str += del + "|" + @anCount.to_s.center(len-3) + "|\n"
|
312
|
-
str += del + "|" + @nsCount.to_s.center(len-3) + "|\n"
|
313
|
-
str += del + "|" + @arCount.to_s.center(len-3) + "|\n" + del
|
303
|
+
str += del + "|" + @qdCount.to_s.center(len - 3) + "|\n"
|
304
|
+
str += del + "|" + @anCount.to_s.center(len - 3) + "|\n"
|
305
|
+
str += del + "|" + @nsCount.to_s.center(len - 3) + "|\n"
|
306
|
+
str += del + "|" + @arCount.to_s.center(len - 3) + "|\n" + del
|
314
307
|
str
|
315
308
|
end
|
316
309
|
|
@@ -323,8 +316,8 @@ module Net
|
|
323
316
|
def data
|
324
317
|
arr = []
|
325
318
|
arr.push(@id)
|
326
|
-
arr.push((@qr<<7)|(@opCode<<3)|(@aa<<2)|(@tc<<1)
|
327
|
-
arr.push((@ra<<7)|(@ad<<5)|(@cd<<4)
|
319
|
+
arr.push((@qr << 7) | (@opCode << 3) | (@aa << 2) | (@tc << 1) | @rd)
|
320
|
+
arr.push((@ra << 7) | (@ad << 5) | (@cd << 4) | @rCode.code)
|
328
321
|
arr.push(@qdCount)
|
329
322
|
arr.push(@anCount)
|
330
323
|
arr.push(@nsCount)
|
@@ -336,7 +329,7 @@ module Net
|
|
336
329
|
# performing security tests.
|
337
330
|
#
|
338
331
|
def id=(val)
|
339
|
-
if (0..
|
332
|
+
if (0..65_535).cover? val
|
340
333
|
@id = val
|
341
334
|
else
|
342
335
|
raise ArgumentError, "ID `#{val}' out of range"
|
@@ -361,7 +354,7 @@ module Net
|
|
361
354
|
@qr = 1
|
362
355
|
when false
|
363
356
|
@qr = 0
|
364
|
-
when 0,1
|
357
|
+
when 0, 1
|
365
358
|
@qr = val
|
366
359
|
else
|
367
360
|
raise ArgumentError, ":qr must be true(or 1) or false(or 0)"
|
@@ -399,7 +392,7 @@ module Net
|
|
399
392
|
# header.opCode = Header::STATUS
|
400
393
|
#
|
401
394
|
def opCode=(val)
|
402
|
-
if (0..2).
|
395
|
+
if (0..2).cover? val
|
403
396
|
@opCode = val
|
404
397
|
else
|
405
398
|
raise WrongOpcodeError, "Wrong opCode value (#{val}), must be QUERY, IQUERY or STATUS"
|
@@ -433,7 +426,7 @@ module Net
|
|
433
426
|
@aa = 1
|
434
427
|
when false
|
435
428
|
@aa = 0
|
436
|
-
when 0,1
|
429
|
+
when 0, 1
|
437
430
|
@aa = val
|
438
431
|
else
|
439
432
|
raise ArgumentError, ":aa must be true(or 1) or false(or 0)"
|
@@ -471,7 +464,7 @@ module Net
|
|
471
464
|
@tc = 1
|
472
465
|
when false
|
473
466
|
@tc = 0
|
474
|
-
when 0,1
|
467
|
+
when 0, 1
|
475
468
|
@tc = val
|
476
469
|
else
|
477
470
|
raise ArgumentError, ":tc must be true(or 1) or false(or 0)"
|
@@ -536,7 +529,7 @@ module Net
|
|
536
529
|
@ra = 1
|
537
530
|
when false
|
538
531
|
@ra = 0
|
539
|
-
when 0,1
|
532
|
+
when 0, 1
|
540
533
|
@ra = val
|
541
534
|
else
|
542
535
|
raise ArgumentError, ":ra must be true(or 1) or false(or 0)"
|
@@ -560,7 +553,7 @@ module Net
|
|
560
553
|
@cd = 1
|
561
554
|
when false
|
562
555
|
@cd = 0
|
563
|
-
when 0,1
|
556
|
+
when 0, 1
|
564
557
|
@cd = val
|
565
558
|
else
|
566
559
|
raise ArgumentError, ":cd must be true(or 1) or false(or 0)"
|
@@ -588,7 +581,7 @@ module Net
|
|
588
581
|
@ad = 1
|
589
582
|
when false
|
590
583
|
@ad = 0
|
591
|
-
when 0,1
|
584
|
+
when 0, 1
|
592
585
|
@ad = val
|
593
586
|
else
|
594
587
|
raise ArgumentError, ":ad must be true(or 1) or false(or 0)"
|
@@ -604,7 +597,7 @@ module Net
|
|
604
597
|
# #=> was unable to interpret the query
|
605
598
|
#
|
606
599
|
def rCode_str
|
607
|
-
|
600
|
+
[rCode.type, rCode.explanation]
|
608
601
|
end
|
609
602
|
|
610
603
|
# Checks for errors in the DNS packet
|
@@ -627,7 +620,7 @@ module Net
|
|
627
620
|
# Sets the number of entries in a question section
|
628
621
|
#
|
629
622
|
def qdCount=(val)
|
630
|
-
if (0..
|
623
|
+
if (0..65_535).cover? val
|
631
624
|
@qdCount = val
|
632
625
|
else
|
633
626
|
raise WrongCountError, "Wrong number of count (#{val}), must be 0-65535"
|
@@ -637,7 +630,7 @@ module Net
|
|
637
630
|
# Sets the number of RRs in an answer section
|
638
631
|
#
|
639
632
|
def anCount=(val)
|
640
|
-
if (0..
|
633
|
+
if (0..65_535).cover? val
|
641
634
|
@anCount = val
|
642
635
|
else
|
643
636
|
raise WrongCountError, "Wrong number of count (#{val}), must be 0-65535"
|
@@ -647,7 +640,7 @@ module Net
|
|
647
640
|
# Sets the number of RRs in an authority section
|
648
641
|
#
|
649
642
|
def nsCount=(val)
|
650
|
-
if (0..
|
643
|
+
if (0..65_535).cover? val
|
651
644
|
@nsCount = val
|
652
645
|
else
|
653
646
|
raise WrongCountError, "Wrong number of count (#{val}), must be 0-65535"
|
@@ -657,14 +650,14 @@ module Net
|
|
657
650
|
# Sets the number of RRs in an addictional section
|
658
651
|
#
|
659
652
|
def arCount=(val)
|
660
|
-
if (0..
|
653
|
+
if (0..65_535).cover? val
|
661
654
|
@arCount = val
|
662
655
|
else
|
663
656
|
raise WrongCountError, "Wrong number of count: `#{val}' must be 0-65535"
|
664
657
|
end
|
665
658
|
end
|
666
659
|
|
667
|
-
|
660
|
+
private
|
668
661
|
|
669
662
|
def new_from_scratch
|
670
663
|
@id = genID # generate ad unique id
|
@@ -679,6 +672,7 @@ module Net
|
|
679
672
|
unless str.size == Net::DNS::HFIXEDSZ
|
680
673
|
raise ArgumentError, "Header binary data has wrong size: `#{str.size}' bytes"
|
681
674
|
end
|
675
|
+
|
682
676
|
arr = str.unpack("n C2 n4")
|
683
677
|
@id = arr[0]
|
684
678
|
@qr = (arr[1] >> 7) & 0x01
|
@@ -698,16 +692,14 @@ module Net
|
|
698
692
|
|
699
693
|
def new_from_hash(hash)
|
700
694
|
new_from_scratch
|
701
|
-
hash.each do |key,val|
|
702
|
-
eval "self.#{key
|
695
|
+
hash.each do |key, val|
|
696
|
+
eval "self.#{key} = val"
|
703
697
|
end
|
704
698
|
end
|
705
699
|
|
706
700
|
def genID
|
707
|
-
rand(
|
701
|
+
rand(65_535)
|
708
702
|
end
|
709
|
-
|
710
703
|
end
|
711
|
-
|
712
704
|
end
|
713
705
|
end
|