net-dns 0.9.0 → 0.20.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 +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
|