net-dns 0.9.0 → 0.20.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +29 -16
- data/README.md +1 -1
- data/lib/net/dns/header.rb +48 -64
- data/lib/net/dns/names.rb +8 -10
- data/lib/net/dns/packet.rb +46 -53
- data/lib/net/dns/question.rb +5 -3
- data/lib/net/dns/resolver/socks.rb +5 -7
- data/lib/net/dns/resolver/timeouts.rb +3 -5
- data/lib/net/dns/resolver.rb +54 -69
- data/lib/net/dns/rr/a.rb +3 -4
- data/lib/net/dns/rr/aaaa.rb +3 -5
- data/lib/net/dns/rr/classes.rb +6 -8
- data/lib/net/dns/rr/cname.rb +3 -5
- data/lib/net/dns/rr/hinfo.rb +9 -13
- data/lib/net/dns/rr/mr.rb +3 -5
- data/lib/net/dns/rr/mx.rb +5 -7
- data/lib/net/dns/rr/ns.rb +3 -5
- data/lib/net/dns/rr/null.rb +3 -5
- data/lib/net/dns/rr/ptr.rb +3 -5
- data/lib/net/dns/rr/soa.rb +11 -7
- data/lib/net/dns/rr/srv.rb +5 -2
- data/lib/net/dns/rr/txt.rb +4 -6
- data/lib/net/dns/rr/types.rb +90 -79
- data/lib/net/dns/rr.rb +2 -2
- data/lib/net/dns/version.rb +1 -1
- data/lib/net/dns.rb +3 -1
- metadata +11 -104
- data/.gitignore +0 -8
- data/.rubocop.yml +0 -3
- data/.rubocop_defaults.yml +0 -364
- data/.rubocop_todo.yml +0 -207
- data/Gemfile +0 -8
- data/Rakefile +0 -38
- data/bin/console +0 -14
- data/lib/net/dns/core_ext.rb +0 -45
- data/net-dns.gemspec +0 -23
- data/spec/fixtures/resolv.conf +0 -4
- data/spec/spec_helper.rb +0 -14
- data/spec/unit/resolver/dns_timeout_spec.rb +0 -36
- data/spec/unit/resolver/tcp_timeout_spec.rb +0 -46
- data/spec/unit/resolver/udp_timeout_spec.rb +0 -46
- data/test/test_helper.rb +0 -13
- data/test/unit/header_test.rb +0 -164
- data/test/unit/names_test.rb +0 -21
- data/test/unit/packet_test.rb +0 -47
- data/test/unit/question_test.rb +0 -81
- data/test/unit/resolver_test.rb +0 -114
- data/test/unit/rr/a_test.rb +0 -106
- data/test/unit/rr/aaaa_test.rb +0 -102
- data/test/unit/rr/classes_test.rb +0 -83
- data/test/unit/rr/cname_test.rb +0 -90
- data/test/unit/rr/hinfo_test.rb +0 -111
- data/test/unit/rr/mr_test.rb +0 -99
- data/test/unit/rr/mx_test.rb +0 -106
- data/test/unit/rr/ns_test.rb +0 -80
- data/test/unit/rr/types_test.rb +0 -71
- data/test/unit/rr_test.rb +0 -127
data/lib/net/dns/resolver.rb
CHANGED
@@ -16,7 +16,7 @@ require 'net/dns/resolver/timeouts'
|
|
16
16
|
# Resolver("www.google.com") { |packet| puts packet.size + " bytes" }
|
17
17
|
# # => 484 bytes
|
18
18
|
#
|
19
|
-
def Resolver(name, type = Net::DNS::A, cls = Net::DNS::IN
|
19
|
+
def Resolver(name, type = Net::DNS::A, cls = Net::DNS::IN)
|
20
20
|
resolver = Net::DNS::Resolver.start(name, type, cls)
|
21
21
|
if block_given?
|
22
22
|
yield resolver
|
@@ -231,9 +231,9 @@ module Net
|
|
231
231
|
# Net::DNS::Resolver Perl module.
|
232
232
|
#
|
233
233
|
def initialize(config = {})
|
234
|
-
|
234
|
+
config.is_a?(Hash) or
|
235
|
+
raise(ArgumentError, "Expected `config' to be a Hash")
|
235
236
|
|
236
|
-
# config.downcase_keys!
|
237
237
|
@config = Defaults.merge config
|
238
238
|
@raw = false
|
239
239
|
|
@@ -402,12 +402,11 @@ module Net
|
|
402
402
|
# The default is port 53.
|
403
403
|
#
|
404
404
|
def port=(num)
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
end
|
405
|
+
(0..65_535).cover?(num) or
|
406
|
+
raise(ArgumentError, "Wrong port number #{num}")
|
407
|
+
|
408
|
+
@config[:port] = num
|
409
|
+
@logger.info "Port number changed to #{num}"
|
411
410
|
end
|
412
411
|
|
413
412
|
# Get the value of the source port number.
|
@@ -431,15 +430,12 @@ module Net
|
|
431
430
|
# underlaying layers.
|
432
431
|
#
|
433
432
|
def source_port=(num)
|
434
|
-
|
435
|
-
|
436
|
-
|
433
|
+
root? or
|
434
|
+
raise(ResolverPermissionError, "Are you root?")
|
435
|
+
(0..65_535).cover?(num) or
|
436
|
+
raise(ArgumentError, "Wrong port number #{num}")
|
437
437
|
|
438
|
-
|
439
|
-
@config[:source_port] = num
|
440
|
-
else
|
441
|
-
raise ArgumentError, "Wrong port number #{num}"
|
442
|
-
end
|
438
|
+
@config[:source_port] = num
|
443
439
|
end
|
444
440
|
alias srcport= source_port=
|
445
441
|
|
@@ -482,13 +478,12 @@ module Net
|
|
482
478
|
# The default is 0.0.0.0, meaning any local address (chosen on routing needs).
|
483
479
|
#
|
484
480
|
def source_address=(addr)
|
485
|
-
|
486
|
-
|
487
|
-
end
|
481
|
+
addr.respond_to?(:to_s) or
|
482
|
+
raise(ArgumentError, "Wrong address argument #{addr}")
|
488
483
|
|
489
484
|
begin
|
490
485
|
port = rand(1024..65_023)
|
491
|
-
@logger.
|
486
|
+
@logger.info "Try to determine state of source address #{addr} with port #{port}"
|
492
487
|
a = TCPServer.new(addr.to_s, port)
|
493
488
|
rescue SystemCallError => e
|
494
489
|
case e.errno
|
@@ -527,12 +522,11 @@ module Net
|
|
527
522
|
|
528
523
|
# Set the retrasmission interval in seconds. Default 5 seconds.
|
529
524
|
def retry_interval=(num)
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
end
|
525
|
+
num.positive? or
|
526
|
+
raise(ArgumentError, "Interval must be positive")
|
527
|
+
|
528
|
+
@config[:retry_interval] = num
|
529
|
+
@logger.info "Retransmission interval changed to #{num} seconds"
|
536
530
|
end
|
537
531
|
alias retrans= retry_interval=
|
538
532
|
|
@@ -547,12 +541,11 @@ module Net
|
|
547
541
|
# Set the number of times the resolver will try a query.
|
548
542
|
# Default 4 times.
|
549
543
|
def retry_number=(num)
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
end
|
544
|
+
(num.is_a?(Integer) && (num > 0)) or
|
545
|
+
raise(ArgumentError, "Retry value must be a positive integer")
|
546
|
+
|
547
|
+
@config[:retry_number] = num
|
548
|
+
@logger.info "Retrasmissions number changed to #{num}"
|
556
549
|
end
|
557
550
|
alias_method('retry=', 'retry_number=')
|
558
551
|
|
@@ -778,7 +771,6 @@ module Net
|
|
778
771
|
# the old one, which will then be impossibile to recover.
|
779
772
|
#
|
780
773
|
def log_file=(log)
|
781
|
-
@logger.close
|
782
774
|
@config[:log_file] = log
|
783
775
|
@logger = Logger.new(@config[:log_file])
|
784
776
|
@logger.level = $DEBUG ? Logger::DEBUG : Logger::WARN
|
@@ -802,12 +794,10 @@ module Net
|
|
802
794
|
# Note that this will destroy the precedent logger.
|
803
795
|
#
|
804
796
|
def logger=(logger)
|
805
|
-
|
806
|
-
|
807
|
-
|
808
|
-
|
809
|
-
raise ArgumentError, "Argument must be an instance of Logger class"
|
810
|
-
end
|
797
|
+
logger.is_a?(Logger) or
|
798
|
+
raise(ArgumentError, "Argument must be an instance of Logger class")
|
799
|
+
|
800
|
+
@logger = logger
|
811
801
|
end
|
812
802
|
|
813
803
|
# Set the log level for the built-in logging facility.
|
@@ -948,9 +938,8 @@ module Net
|
|
948
938
|
# were any records in the answer section.
|
949
939
|
#
|
950
940
|
def query(argument, type = Net::DNS::A, cls = Net::DNS::IN)
|
951
|
-
|
952
|
-
|
953
|
-
end
|
941
|
+
!@config[:nameservers].empty? or
|
942
|
+
raise(Resolver::Error, "No nameservers specified!")
|
954
943
|
|
955
944
|
method = :query_udp
|
956
945
|
packet = if argument.is_a? Net::DNS::Packet
|
@@ -987,10 +976,10 @@ module Net
|
|
987
976
|
|
988
977
|
if type == Net::DNS::AXFR
|
989
978
|
if @raw
|
990
|
-
@logger.
|
979
|
+
@logger.info "AXFR query, switching to TCP over RAW socket"
|
991
980
|
method = :send_raw_tcp
|
992
981
|
else
|
993
|
-
@logger.
|
982
|
+
@logger.info "AXFR query, switching to TCP"
|
994
983
|
method = :query_tcp
|
995
984
|
end
|
996
985
|
end
|
@@ -1085,14 +1074,14 @@ module Net
|
|
1085
1074
|
if ENV['LOCALDOMAIN']
|
1086
1075
|
self.domain = ENV['LOCALDOMAIN']
|
1087
1076
|
end
|
1088
|
-
|
1089
|
-
|
1090
|
-
|
1091
|
-
|
1092
|
-
|
1093
|
-
|
1094
|
-
|
1095
|
-
|
1077
|
+
return unless ENV['RES_OPTIONS']
|
1078
|
+
|
1079
|
+
ENV['RES_OPTIONS'].split(" ").each do |opt|
|
1080
|
+
name, val = opt.split(":")
|
1081
|
+
begin
|
1082
|
+
eval("self.#{name} = #{val}")
|
1083
|
+
rescue NoMethodError
|
1084
|
+
raise ArgumentError, "Invalid ENV option #{name}"
|
1096
1085
|
end
|
1097
1086
|
end
|
1098
1087
|
end
|
@@ -1136,12 +1125,11 @@ module Net
|
|
1136
1125
|
packet
|
1137
1126
|
end
|
1138
1127
|
|
1139
|
-
def query_tcp(
|
1128
|
+
def query_tcp(_packet, packet_data)
|
1140
1129
|
ans = nil
|
1141
1130
|
length = [packet_data.size].pack("n")
|
1142
1131
|
|
1143
1132
|
@config[:nameservers].each do |ns|
|
1144
|
-
begin
|
1145
1133
|
buffer = ""
|
1146
1134
|
socket = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
|
1147
1135
|
socket.bind(Socket.pack_sockaddr_in(@config[:source_port], @config[:source_address].to_s))
|
@@ -1153,12 +1141,12 @@ module Net
|
|
1153
1141
|
@logger.info "Contacting nameserver #{ns} port #{@config[:port]}"
|
1154
1142
|
socket.write(length + packet_data)
|
1155
1143
|
ans = socket.recv(Net::DNS::INT16SZ)
|
1156
|
-
len = ans.
|
1144
|
+
len = ans.unpack1("n")
|
1157
1145
|
|
1158
1146
|
@logger.info "Receiving #{len} bytes..."
|
1159
1147
|
|
1160
1148
|
if len == 0
|
1161
|
-
@logger.warn "Receiving 0
|
1149
|
+
@logger.warn "Receiving 0 length packet from nameserver #{ns}, trying next."
|
1162
1150
|
next
|
1163
1151
|
end
|
1164
1152
|
|
@@ -1174,16 +1162,16 @@ module Net
|
|
1174
1162
|
end
|
1175
1163
|
end
|
1176
1164
|
return [buffer, ["", @config[:port], ns.to_s, ns.to_s]]
|
1177
|
-
|
1165
|
+
rescue Timeout::Error
|
1178
1166
|
@logger.warn "Nameserver #{ns} not responding within TCP timeout, trying next one"
|
1179
1167
|
next
|
1180
|
-
|
1168
|
+
ensure
|
1181
1169
|
socket.close
|
1182
|
-
end
|
1183
1170
|
end
|
1171
|
+
ans
|
1184
1172
|
end
|
1185
1173
|
|
1186
|
-
def query_udp(
|
1174
|
+
def query_udp(_packet, packet_data)
|
1187
1175
|
socket4 = UDPSocket.new
|
1188
1176
|
socket4.bind(@config[:source_address].to_s, @config[:source_port])
|
1189
1177
|
socket6 = UDPSocket.new(Socket::AF_INET6)
|
@@ -1192,7 +1180,6 @@ module Net
|
|
1192
1180
|
ans = nil
|
1193
1181
|
response = ""
|
1194
1182
|
@config[:nameservers].each do |ns|
|
1195
|
-
begin
|
1196
1183
|
@config[:udp_timeout].timeout do
|
1197
1184
|
@logger.info "Contacting nameserver #{ns} port #{@config[:port]}"
|
1198
1185
|
ans = if ns.ipv6?
|
@@ -1204,21 +1191,19 @@ module Net
|
|
1204
1191
|
end
|
1205
1192
|
end
|
1206
1193
|
break if ans
|
1207
|
-
|
1194
|
+
rescue Timeout::Error
|
1208
1195
|
@logger.warn "Nameserver #{ns} not responding within UDP timeout, trying next one"
|
1209
1196
|
next
|
1210
|
-
end
|
1211
1197
|
end
|
1212
1198
|
ans
|
1213
1199
|
end
|
1214
1200
|
|
1215
1201
|
# FIXME: a ? method should never raise.
|
1216
1202
|
def valid?(name)
|
1217
|
-
|
1218
|
-
|
1219
|
-
|
1220
|
-
|
1221
|
-
end
|
1203
|
+
name !~ /[^-\w\.\*]/ or
|
1204
|
+
raise(ArgumentError, "Invalid domain name #{name}")
|
1205
|
+
|
1206
|
+
true
|
1222
1207
|
end
|
1223
1208
|
end
|
1224
1209
|
end
|
data/lib/net/dns/rr/a.rb
CHANGED
@@ -84,10 +84,9 @@ module Net
|
|
84
84
|
address = case input
|
85
85
|
when IPAddr
|
86
86
|
input
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
IPAddr.new(tmp)
|
87
|
+
# Address in numeric form
|
88
|
+
when Integer
|
89
|
+
IPAddr.new(input, Socket::AF_INET)
|
91
90
|
when String
|
92
91
|
IPAddr.new(input)
|
93
92
|
else
|
data/lib/net/dns/rr/aaaa.rb
CHANGED
@@ -38,11 +38,9 @@ module Net
|
|
38
38
|
private
|
39
39
|
|
40
40
|
def subclass_new_from_hash(options)
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
raise ArgumentError, ":address field is mandatory"
|
45
|
-
end
|
41
|
+
raise ArgumentError, ":address field is mandatory" unless options.key?(:address)
|
42
|
+
|
43
|
+
@address = check_address(options[:address])
|
46
44
|
end
|
47
45
|
|
48
46
|
def subclass_new_from_string(str)
|
data/lib/net/dns/rr/classes.rb
CHANGED
@@ -34,9 +34,9 @@ module Net
|
|
34
34
|
initialize_from_num(@@default)
|
35
35
|
end
|
36
36
|
|
37
|
-
|
38
|
-
|
39
|
-
|
37
|
+
return unless @str.nil? || @num.nil?
|
38
|
+
|
39
|
+
raise ArgumentError, "Unable to create a `Classes' from `#{cls}'"
|
40
40
|
end
|
41
41
|
|
42
42
|
# Returns the class in number format
|
@@ -67,11 +67,9 @@ module Net
|
|
67
67
|
# Be able to control the default class to assign when
|
68
68
|
# cls argument is +nil+. Default to +IN+
|
69
69
|
def self.default=(str)
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
raise ArgumentError, "Unknown class `#{str}'"
|
74
|
-
end
|
70
|
+
raise ArgumentError, "Unknown class `#{str}'" unless CLASSES[str]
|
71
|
+
|
72
|
+
@@default = CLASSES[str]
|
75
73
|
end
|
76
74
|
|
77
75
|
# Returns whether <tt>cls</tt> is a valid RR class.
|
data/lib/net/dns/rr/cname.rb
CHANGED
@@ -27,11 +27,9 @@ module Net # :nodoc:
|
|
27
27
|
private
|
28
28
|
|
29
29
|
def subclass_new_from_hash(options)
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
raise ArgumentError, ":cname field is mandatory"
|
34
|
-
end
|
30
|
+
raise ArgumentError, ":cname field is mandatory" unless options.key?(:cname)
|
31
|
+
|
32
|
+
@cname = check_name(options[:cname])
|
35
33
|
end
|
36
34
|
|
37
35
|
def subclass_new_from_string(str)
|
data/lib/net/dns/rr/hinfo.rb
CHANGED
@@ -40,12 +40,10 @@ module Net # :nodoc:
|
|
40
40
|
private
|
41
41
|
|
42
42
|
def subclass_new_from_hash(options)
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
raise ArgumentError, ":cpu and :os fields are mandatory"
|
48
|
-
end
|
43
|
+
raise ArgumentError, ":cpu and :os fields are mandatory" unless options.key?(:cpu) && options.key?(:os)
|
44
|
+
|
45
|
+
@cpu = options[:cpu]
|
46
|
+
@os = options[:os]
|
49
47
|
end
|
50
48
|
|
51
49
|
def subclass_new_from_string(str)
|
@@ -53,12 +51,12 @@ module Net # :nodoc:
|
|
53
51
|
end
|
54
52
|
|
55
53
|
def subclass_new_from_binary(data, offset)
|
56
|
-
len = data.
|
54
|
+
len = data.unpack1("@#{offset} C")
|
57
55
|
offset += 1
|
58
56
|
@cpu = data[offset..(offset + len)]
|
59
57
|
offset += len
|
60
58
|
|
61
|
-
len = data.
|
59
|
+
len = data.unpack1("@#{offset} C")
|
62
60
|
offset += 1
|
63
61
|
@os = data[offset..(offset + len)]
|
64
62
|
offset += len
|
@@ -73,11 +71,9 @@ module Net # :nodoc:
|
|
73
71
|
end
|
74
72
|
|
75
73
|
def check_hinfo(input)
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
raise ArgumentError, "Invalid HINFO Section `#{input}'"
|
80
|
-
end
|
74
|
+
raise ArgumentError, "Invalid HINFO Section `#{input}'" unless input.to_s.strip =~ /^(?:["']?(.*?)["']?)\s+(?:["']?(.*?)["']?)$/
|
75
|
+
|
76
|
+
[Regexp.last_match(1), Regexp.last_match(2)]
|
81
77
|
end
|
82
78
|
|
83
79
|
def build_pack
|
data/lib/net/dns/rr/mr.rb
CHANGED
@@ -23,11 +23,9 @@ module Net # :nodoc:
|
|
23
23
|
private
|
24
24
|
|
25
25
|
def subclass_new_from_hash(options)
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
raise ArgumentError, ":newname field is mandatory"
|
30
|
-
end
|
26
|
+
raise ArgumentError, ":newname field is mandatory" unless options.key?(:newname)
|
27
|
+
|
28
|
+
@newname = check_name(options[:newname])
|
31
29
|
end
|
32
30
|
|
33
31
|
def subclass_new_from_string(str)
|
data/lib/net/dns/rr/mx.rb
CHANGED
@@ -32,12 +32,10 @@ module Net # :nodoc:
|
|
32
32
|
private
|
33
33
|
|
34
34
|
def subclass_new_from_hash(options)
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
raise ArgumentError, ":preference and :exchange fields are mandatory"
|
40
|
-
end
|
35
|
+
raise ArgumentError, ":preference and :exchange fields are mandatory" unless options.key?(:preference) && options.key?(:exchange)
|
36
|
+
|
37
|
+
@preference = options[:preference].to_i
|
38
|
+
@exchange = options[:exchange]
|
41
39
|
end
|
42
40
|
|
43
41
|
def subclass_new_from_string(str)
|
@@ -45,7 +43,7 @@ module Net # :nodoc:
|
|
45
43
|
end
|
46
44
|
|
47
45
|
def subclass_new_from_binary(data, offset)
|
48
|
-
@preference = data.
|
46
|
+
@preference = data.unpack1("@#{offset} n")
|
49
47
|
offset += 2
|
50
48
|
@exchange, offset = dn_expand(data, offset)
|
51
49
|
offset
|
data/lib/net/dns/rr/ns.rb
CHANGED
@@ -23,11 +23,9 @@ module Net # :nodoc:
|
|
23
23
|
private
|
24
24
|
|
25
25
|
def subclass_new_from_hash(options)
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
raise ArgumentError, ":nsdname field is mandatory"
|
30
|
-
end
|
26
|
+
raise ArgumentError, ":nsdname field is mandatory" unless options.key?(:nsdname)
|
27
|
+
|
28
|
+
@nsdname = check_name(options[:nsdname])
|
31
29
|
end
|
32
30
|
|
33
31
|
def subclass_new_from_string(str)
|
data/lib/net/dns/rr/null.rb
CHANGED
@@ -23,11 +23,9 @@ module Net # :nodoc:
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def subclass_new_from_hash(args)
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
raise ArgumentError, ":null field is mandatory but missing"
|
30
|
-
end
|
26
|
+
raise ArgumentError, ":null field is mandatory but missing" unless args.key? :null
|
27
|
+
|
28
|
+
@null = args[:null]
|
31
29
|
end
|
32
30
|
|
33
31
|
def subclass_new_from_string(str)
|
data/lib/net/dns/rr/ptr.rb
CHANGED
@@ -40,11 +40,9 @@ module Net
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def subclass_new_from_hash(args)
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
raise ArgumentError, ":ptrdname or :ptr field is mandatory"
|
47
|
-
end
|
43
|
+
raise ArgumentError, ":ptrdname or :ptr field is mandatory" unless args.key?(:ptrdname) || args.key?(:ptr)
|
44
|
+
|
45
|
+
@ptrdname = args[:ptrdname]
|
48
46
|
end
|
49
47
|
|
50
48
|
def subclass_new_from_string(str)
|
data/lib/net/dns/rr/soa.rb
CHANGED
@@ -5,7 +5,13 @@ module Net # :nodoc:
|
|
5
5
|
# RR type SOA
|
6
6
|
#------------------------------------------------------------
|
7
7
|
class SOA < RR
|
8
|
-
attr_reader :mname
|
8
|
+
attr_reader :mname
|
9
|
+
attr_reader :rname
|
10
|
+
attr_reader :serial
|
11
|
+
attr_reader :refresh
|
12
|
+
attr_reader :retry
|
13
|
+
attr_reader :expire
|
14
|
+
attr_reader :minimum
|
9
15
|
|
10
16
|
private
|
11
17
|
|
@@ -41,11 +47,9 @@ module Net # :nodoc:
|
|
41
47
|
end
|
42
48
|
|
43
49
|
def number?(num)
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
raise ArgumentError, "Wrong format field: #{num} not a number or less than zero"
|
48
|
-
end
|
50
|
+
raise ArgumentError, "Wrong format field: #{num} not a number or less than zero" unless num.is_a?(Integer) && (num > 0)
|
51
|
+
|
52
|
+
true
|
49
53
|
end
|
50
54
|
|
51
55
|
def subclass_new_from_string(str)
|
@@ -61,7 +65,7 @@ module Net # :nodoc:
|
|
61
65
|
@mname, offset = dn_expand(data, offset)
|
62
66
|
@rname, offset = dn_expand(data, offset)
|
63
67
|
@serial, @refresh, @retry, @expire, @minimum = data.unpack("@#{offset} N5")
|
64
|
-
offset + 5 * Net::DNS::INT32SZ
|
68
|
+
offset + (5 * Net::DNS::INT32SZ)
|
65
69
|
end
|
66
70
|
|
67
71
|
private
|
data/lib/net/dns/rr/srv.rb
CHANGED
@@ -5,7 +5,10 @@ module Net # :nodoc:
|
|
5
5
|
# RR type SRV
|
6
6
|
#------------------------------------------------------------
|
7
7
|
class SRV < RR
|
8
|
-
attr_reader :priority
|
8
|
+
attr_reader :priority
|
9
|
+
attr_reader :weight
|
10
|
+
attr_reader :port
|
11
|
+
attr_reader :host
|
9
12
|
|
10
13
|
private
|
11
14
|
|
@@ -20,7 +23,7 @@ module Net # :nodoc:
|
|
20
23
|
|
21
24
|
@host = []
|
22
25
|
while offset < off_end
|
23
|
-
len = data.
|
26
|
+
len = data.unpack1("@#{offset} C")
|
24
27
|
offset += 1
|
25
28
|
str = data[offset..offset + len - 1]
|
26
29
|
offset += len
|
data/lib/net/dns/rr/txt.rb
CHANGED
@@ -23,11 +23,9 @@ module Net # :nodoc:
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def subclass_new_from_hash(args)
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
raise ArgumentError, ":txt field is mandatory but missing"
|
30
|
-
end
|
26
|
+
raise ArgumentError, ":txt field is mandatory but missing" unless args.key? :txt
|
27
|
+
|
28
|
+
@txt = args[:txt].strip
|
31
29
|
end
|
32
30
|
|
33
31
|
def subclass_new_from_string(str)
|
@@ -38,7 +36,7 @@ module Net # :nodoc:
|
|
38
36
|
off_end = offset + @rdlength
|
39
37
|
@txt = ""
|
40
38
|
while offset < off_end
|
41
|
-
len = data.
|
39
|
+
len = data.unpack1("@#{offset} C")
|
42
40
|
offset += 1
|
43
41
|
str = data[offset..offset + len - 1]
|
44
42
|
offset += len
|