net-dns2 0.8.2 → 0.8.3
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 +13 -5
- data/.travis.yml +2 -10
- data/CHANGELOG.md +22 -0
- data/README.md +19 -16
- data/Rakefile +8 -63
- data/lib/net/dns.rb +1 -0
- data/lib/net/dns/header.rb +7 -3
- data/lib/net/dns/names.rb +16 -8
- data/lib/net/dns/packet.rb +15 -7
- data/lib/net/dns/resolver.rb +49 -50
- data/lib/net/dns/rr.rb +1 -1
- data/lib/net/dns/rr/a.rb +1 -3
- data/lib/net/dns/rr/soa.rb +25 -18
- data/lib/net/dns/rr/txt.rb +12 -2
- data/lib/net/dns/rr/types.rb +1 -0
- data/net-dns.gemspec +25 -6
- metadata +26 -44
- data/test/header_test.rb +0 -167
- data/test/names_test.rb +0 -21
- data/test/packet_test.rb +0 -49
- data/test/question_test.rb +0 -83
- data/test/resolver_test.rb +0 -117
- data/test/rr/a_test.rb +0 -113
- data/test/rr/aaaa_test.rb +0 -109
- data/test/rr/classes_test.rb +0 -85
- data/test/rr/cname_test.rb +0 -97
- data/test/rr/hinfo_test.rb +0 -117
- data/test/rr/mr_test.rb +0 -105
- data/test/rr/mx_test.rb +0 -112
- data/test/rr/ns_test.rb +0 -86
- data/test/rr/types_test.rb +0 -69
- data/test/rr_test.rb +0 -131
- data/test/test_helper.rb +0 -4
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ZGJiMWM3NGY5YzgxMmM0OTk4NmQxYmM4NTA1ODg3YjMyN2QyZTYxMA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
MDRkYjY2YzBhZWRiNzM1OWM0ODY1MzgwNmI1Mjk1ZjZiODE1YWQ2Mw==
|
5
7
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
ZGFhZmIxZjQxODMxM2U5Y2MxNWIzM2QzYjYwNzkwOTU1NmVkN2RkYTVjYTNj
|
10
|
+
ZmNlNjQ1YzA1YTA3OTliZjMyNzFkOTM1MGM5ZWFiOGRlMTc3Y2IwYzdjNmM5
|
11
|
+
YmJkMDkzNTQ3NjZiNDY5NWIyYTljMjEzZGE3OGExNmUwMmU0NGY=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
NDU5NTA1NzBmNTZiZmZhZGYxZjEwOGZkMDJkZTNiNWY1OTEzNDMwZmJlMmI5
|
14
|
+
ZWQzYWZlMTBlZWY5YzhkYWZhNmQ1OTgzMjMzN2U1ZjRkN2EyMDk5ZTBmNGZj
|
15
|
+
Y2RkNWM5NzJlNGViNDRjNWRiYzBjYzAyN2E0NTEwMTI4OTVmODc=
|
data/.travis.yml
CHANGED
@@ -1,20 +1,12 @@
|
|
1
1
|
language: ruby
|
2
2
|
|
3
3
|
rvm:
|
4
|
-
- 1.8.7
|
5
4
|
- 1.9.2
|
6
5
|
- 1.9.3
|
7
6
|
- 2.0.0
|
8
|
-
|
9
|
-
|
10
|
-
- rbx-18mode
|
11
|
-
# - ruby-head
|
12
|
-
# - jruby-head
|
7
|
+
- 2.1.0
|
8
|
+
- ruby-head
|
13
9
|
|
14
10
|
notifications:
|
15
11
|
recipients:
|
16
12
|
- mordocai@mordocai.net
|
17
|
-
|
18
|
-
matrix:
|
19
|
-
allow_failures:
|
20
|
-
- rvm: 2.0.0
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,27 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## Release 0.8.3
|
4
|
+
- FIXED: Packet size cannot be set issue #1
|
5
|
+
- FIXED: Now raise exception if raw sockets are requested and we are not
|
6
|
+
running as root issue #23
|
7
|
+
- FIXED: Rake can build gem, travis file updated to test up to
|
8
|
+
ruby-head issue #30
|
9
|
+
- FIXED: Merged in pending bluemonk pull requests issue #29, remaining
|
10
|
+
fixes are from these
|
11
|
+
- FIXED: Cannot get TXT record issue #13
|
12
|
+
https://github.com/bluemonk/net-dns/pull/42
|
13
|
+
- FIXED: Various fixes by neoraider
|
14
|
+
https://github.com/bluemonk/net-dns/pull/36
|
15
|
+
- FIXED: query_tcp fix by nbaum
|
16
|
+
https://github.com/bluemonk/net-dns/pull/63
|
17
|
+
- FIXED: Text fixes by chrislundquist
|
18
|
+
https://github.com/bluemonk/net-dns/pull/52
|
19
|
+
https://github.com/bluemonk/net-dns/pull/51
|
20
|
+
- CHANGED: Support SPF records by winebarrel
|
21
|
+
https://github.com/bluemonk/net-dns/pull/57
|
22
|
+
- CHANGED: Simplified nameserver settings
|
23
|
+
https://github.com/bluemonk/net-dns/pull/60
|
24
|
+
|
3
25
|
## Release 0.8.2
|
4
26
|
- FIXED: Exception when using new raw support issue #2
|
5
27
|
- FIXED: Gemspec file has wrong emails
|
data/README.md
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
# Net::DNS
|
2
2
|
[](https://travis-ci.org/mordocai/net-dns)
|
3
3
|
|
4
|
-
|
4
|
+
https://rubygems.org/gems/net-dns2
|
5
|
+
|
6
|
+
Net::DNS is a DNS library written in pure Ruby. It started as a port of Perl Net::DNS module, but it evolved in time into a full Ruby library.
|
5
7
|
|
6
8
|
|
7
9
|
## Features
|
@@ -9,6 +11,7 @@ Net::DNS is a DNS library written in pure Ruby. It started as a port of Perl Net
|
|
9
11
|
- Complete OO interface
|
10
12
|
- Clean and intuitive API
|
11
13
|
- Modular and flexible
|
14
|
+
- Source address spoofing (via source_address= on Net::DNS::Resolver)
|
12
15
|
|
13
16
|
|
14
17
|
## Requirements
|
@@ -20,21 +23,21 @@ Net::DNS is a DNS library written in pure Ruby. It started as a port of Perl Net
|
|
20
23
|
|
21
24
|
The best way to install this library is via [RubyGems](https://rubygems.org/).
|
22
25
|
|
23
|
-
$ gem install net-
|
26
|
+
$ gem install net-dns2
|
24
27
|
|
25
28
|
You might need administrator privileges on your system to install the gem.
|
26
29
|
|
27
30
|
|
28
31
|
## API Documentation
|
29
32
|
|
30
|
-
Visit the page http://rdoc.info/gems/net-
|
33
|
+
Visit the page http://rdoc.info/gems/net-dns2
|
31
34
|
|
32
35
|
|
33
36
|
## Trivial resolver
|
34
37
|
|
35
38
|
The simplest way to use the library is to invoke the Resolver() method:
|
36
39
|
|
37
|
-
require 'rubygems'
|
40
|
+
require 'rubygems'
|
38
41
|
require 'net/dns'
|
39
42
|
p Resolver("www.google.com")
|
40
43
|
|
@@ -47,21 +50,21 @@ The output is compatible with BIND zone files and it's the same you would get wi
|
|
47
50
|
;; qr = 1 opCode: QUERY aa = 0 tc = 0 rd = 1
|
48
51
|
;; ra = 1 ad = 0 cd = 0 rcode = NoError
|
49
52
|
;; qdCount = 1 anCount = 3 nsCount = 4 arCount = 4
|
50
|
-
|
53
|
+
|
51
54
|
;; QUESTION SECTION (1 record):
|
52
55
|
;; google.com. IN A
|
53
|
-
|
56
|
+
|
54
57
|
;; ANSWER SECTION (3 records):
|
55
58
|
google.com. 212 IN A 74.125.45.100
|
56
59
|
google.com. 212 IN A 74.125.67.100
|
57
60
|
google.com. 212 IN A 209.85.171.100
|
58
|
-
|
61
|
+
|
59
62
|
;; AUTHORITY SECTION (4 records):
|
60
63
|
google.com. 345512 IN NS ns1.google.com.
|
61
64
|
google.com. 345512 IN NS ns4.google.com.
|
62
65
|
google.com. 345512 IN NS ns2.google.com.
|
63
66
|
google.com. 345512 IN NS ns3.google.com.
|
64
|
-
|
67
|
+
|
65
68
|
;; ADDITIONAL SECTION (4 records):
|
66
69
|
ns1.google.com. 170275 IN A 216.239.32.10
|
67
70
|
ns2.google.com. 170275 IN A 216.239.34.10
|
@@ -81,7 +84,7 @@ Same for Net::DNS::Resolver.start():
|
|
81
84
|
As optional parameters, +TYPE+ and +CLASS+ can be specified.
|
82
85
|
|
83
86
|
p Net::DNS::Resolver.start("google.com", Net::DNS::MX)
|
84
|
-
|
87
|
+
|
85
88
|
;; Answer received from localhost:53 (316 bytes)
|
86
89
|
;;
|
87
90
|
;; HEADER SECTION
|
@@ -89,10 +92,10 @@ As optional parameters, +TYPE+ and +CLASS+ can be specified.
|
|
89
92
|
;; qr = 1 opCode: QUERY aa = 0 tc = 0 rd = 1
|
90
93
|
;; ra = 1 ad = 0 cd = 0 rcode = NoError
|
91
94
|
;; qdCount = 1 anCount = 4 nsCount = 4 arCount = 8
|
92
|
-
|
95
|
+
|
93
96
|
;; QUESTION SECTION (1 record):
|
94
97
|
;; google.com. IN MX
|
95
|
-
|
98
|
+
|
96
99
|
;; ANSWER SECTION (4 records):
|
97
100
|
google.com. 10800 IN MX 10 smtp2.google.com.
|
98
101
|
google.com. 10800 IN MX 10 smtp3.google.com.
|
@@ -115,16 +118,16 @@ A DNS packet is divided into 5 sections:
|
|
115
118
|
You can access each section by calling the attribute with the same name on a Packet object:
|
116
119
|
|
117
120
|
packet = Net::DNS::Resolver.start("google.com")
|
118
|
-
|
121
|
+
|
119
122
|
header = packet.header
|
120
123
|
answer = packet.answer
|
121
|
-
|
124
|
+
|
122
125
|
puts "The packet is #{packet.data.size} bytes"
|
123
126
|
puts "It contains #{header.anCount} answer entries"
|
124
|
-
|
127
|
+
|
125
128
|
answer.any? {|ans| p ans}
|
126
|
-
|
127
|
-
The output is
|
129
|
+
|
130
|
+
The output is
|
128
131
|
|
129
132
|
The packet is 378 bytes
|
130
133
|
It contains 3 answer entries
|
data/Rakefile
CHANGED
@@ -1,80 +1,25 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'bundler'
|
3
|
+
require 'rspec'
|
3
4
|
|
4
5
|
$:.unshift(File.dirname(__FILE__) + '/lib')
|
5
6
|
require 'net/dns'
|
6
7
|
|
7
8
|
|
8
|
-
|
9
|
-
PKG_NAME = ENV['PKG_NAME'] || 'net-dns'
|
10
|
-
PKG_VERSION = ENV['PKG_VERSION'] || Net::DNS::VERSION
|
11
|
-
|
12
|
-
|
13
|
-
# Run test by default.
|
14
|
-
task :default => [:test, :spec]
|
15
|
-
|
16
|
-
|
17
|
-
spec = Gem::Specification.new do |s|
|
18
|
-
s.name = PKG_NAME
|
19
|
-
s.version = PKG_VERSION
|
20
|
-
s.summary = "Pure Ruby DNS library."
|
21
|
-
s.description = "Net::DNS is a pure Ruby DNS library, with a clean OO interface and an extensible API."
|
22
|
-
|
23
|
-
s.required_ruby_version = ">= 1.8.7"
|
24
|
-
|
25
|
-
s.authors = ["Marco Ceresa", "Simone Carletti"]
|
26
|
-
s.email = ["ceresa@gmail.com", "weppos@weppos.net"]
|
27
|
-
s.homepage = "http://github.com/bluemonk/net-dns"
|
28
|
-
s.rubyforge_project = "net-dns"
|
29
|
-
|
30
|
-
s.add_development_dependency "rake"
|
31
|
-
s.add_development_dependency "rspec"
|
32
|
-
s.add_development_dependency "yard"
|
33
|
-
|
34
|
-
s.files = `git ls-files`.split("\n")
|
35
|
-
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
36
|
-
s.require_paths = %w( lib )
|
37
|
-
end
|
38
|
-
|
39
|
-
|
40
|
-
require 'rubygems/package_task'
|
41
|
-
|
42
|
-
Gem::PackageTask.new(spec) do |pkg|
|
43
|
-
pkg.gem_spec = spec
|
44
|
-
end
|
45
|
-
|
46
|
-
desc "Build the gemspec file #{spec.name}.gemspec"
|
47
|
-
task :gemspec do
|
48
|
-
file = File.dirname(__FILE__) + "/#{spec.name}.gemspec"
|
49
|
-
File.open(file, "w") {|f| f << spec.to_ruby }
|
50
|
-
end
|
51
|
-
|
52
|
-
|
53
|
-
require 'rake/testtask'
|
54
|
-
|
55
|
-
# Run all the tests in the /test folder
|
56
|
-
Rake::TestTask.new do |t|
|
57
|
-
t.libs << "test"
|
58
|
-
t.test_files = FileList["test/**/*_test.rb"]
|
59
|
-
t.verbose = true
|
60
|
-
end
|
61
|
-
|
9
|
+
task :default => [:spec, :gem]
|
62
10
|
|
11
|
+
require 'rake'
|
63
12
|
require 'rspec/core/rake_task'
|
64
|
-
begin
|
65
|
-
require 'fuubar'
|
66
|
-
rescue LoadError
|
67
|
-
end
|
68
13
|
|
69
|
-
RSpec::Core::RakeTask.new do |t|
|
70
|
-
t.
|
71
|
-
t.rspec_opts
|
72
|
-
t.rspec_opts << ['--format', 'Fuubar'] if defined?(Fuubar)
|
14
|
+
RSpec::Core::RakeTask.new(:spec) do |t|
|
15
|
+
t.pattern = FileList['spec/**/*_spec.rb']
|
16
|
+
t.rspec_opts = ["-r ./spec/spec_helper.rb"]
|
73
17
|
end
|
74
18
|
|
19
|
+
require 'rubygems/package_task'
|
20
|
+
Gem::PackageTask.new(Gem::Specification.load("net-dns.gemspec")).define
|
75
21
|
|
76
22
|
require 'yard'
|
77
|
-
|
78
23
|
YARD::Rake::YardocTask.new(:yardoc) do |y|
|
79
24
|
y.options = ["--output-dir", "yardoc"]
|
80
25
|
end
|
data/lib/net/dns.rb
CHANGED
data/lib/net/dns/header.rb
CHANGED
@@ -152,14 +152,17 @@ module Net
|
|
152
152
|
end
|
153
153
|
|
154
154
|
|
155
|
+
# Listing: http://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-5
|
155
156
|
# Constant for +opCode+ query
|
156
157
|
QUERY = 0
|
157
158
|
# Constant for +opCode+ iquery
|
158
159
|
IQUERY = 1
|
159
160
|
# Constant for +opCode+ status
|
160
161
|
STATUS = 2
|
162
|
+
# Constant for +opCode+ notify
|
163
|
+
NOTIFY = 4
|
161
164
|
# Array with given strings
|
162
|
-
OPARR = %w[QUERY IQUERY STATUS]
|
165
|
+
OPARR = %w[QUERY IQUERY STATUS UNASSIGNED NOTIFY]
|
163
166
|
|
164
167
|
# Reader for +id+ attribute
|
165
168
|
attr_reader :id
|
@@ -391,6 +394,7 @@ module Net
|
|
391
394
|
# * QUERY is the standard DNS query
|
392
395
|
# * IQUERY is the inverse query
|
393
396
|
# * STATUS is used to query the nameserver for its status
|
397
|
+
# * NOTIFY is to notify a slave that it should check for an updated SOA on the master
|
394
398
|
#
|
395
399
|
# Example:
|
396
400
|
#
|
@@ -399,10 +403,10 @@ module Net
|
|
399
403
|
# header.opCode = Header::STATUS
|
400
404
|
#
|
401
405
|
def opCode=(val)
|
402
|
-
if
|
406
|
+
if [0, 1, 2, 4].include? val
|
403
407
|
@opCode = val
|
404
408
|
else
|
405
|
-
raise WrongOpcodeError, "Wrong opCode value (#{val}), must be QUERY, IQUERY or
|
409
|
+
raise WrongOpcodeError, "Wrong opCode value (#{val}), must be QUERY, IQUERY, STATUS, or NOTIFY"
|
406
410
|
end
|
407
411
|
end
|
408
412
|
|
data/lib/net/dns/names.rb
CHANGED
@@ -15,7 +15,7 @@ module Net # :nodoc:
|
|
15
15
|
INT16SZ = 2
|
16
16
|
|
17
17
|
# Expand a compressed name in a DNS Packet object. Please
|
18
|
-
# see
|
18
|
+
# see RFC1035 for an explanation of how the compression
|
19
19
|
# in DNS packets works, how may it be useful and how should
|
20
20
|
# be handled.
|
21
21
|
#
|
@@ -27,7 +27,7 @@ module Net # :nodoc:
|
|
27
27
|
name = ""
|
28
28
|
packetlen = packet.size
|
29
29
|
while true
|
30
|
-
raise ExpandError, "Offset is greater than packet
|
30
|
+
raise ExpandError, "Offset is greater than packet length!" if packetlen < (offset+1)
|
31
31
|
len = packet.unpack("@#{offset} C")[0]
|
32
32
|
|
33
33
|
if len == 0
|
@@ -54,7 +54,7 @@ module Net # :nodoc:
|
|
54
54
|
end
|
55
55
|
|
56
56
|
def pack_name(name)
|
57
|
-
if name.size > 255
|
57
|
+
if name.size > 255
|
58
58
|
raise ArgumentError, "Name may not exceed 255 chars"
|
59
59
|
end
|
60
60
|
arr = name.split(".")
|
@@ -106,13 +106,21 @@ module Net # :nodoc:
|
|
106
106
|
end
|
107
107
|
|
108
108
|
def valid?(name)
|
109
|
-
if name
|
110
|
-
|
111
|
-
|
112
|
-
|
109
|
+
return false if name.length < 1 or name.length > 255
|
110
|
+
|
111
|
+
return true if name == '.' # the root domain is the only valid domain that begins with a dot
|
112
|
+
|
113
|
+
parts = name.split('.', -1)
|
114
|
+
parts.delete_at(parts.length-1) if parts.last.empty? # the domain may end with a dot
|
115
|
+
|
116
|
+
parts.each do |part|
|
117
|
+
if not part =~ /^[a-z0-9]([-a-z0-9]*[a-z0-9])?$/i or part.length < 1 or part.length > 63
|
118
|
+
return false
|
119
|
+
end
|
113
120
|
end
|
114
|
-
end
|
115
121
|
|
122
|
+
return true
|
123
|
+
end
|
116
124
|
end
|
117
125
|
end
|
118
126
|
end
|
data/lib/net/dns/packet.rb
CHANGED
@@ -97,18 +97,26 @@ module Net
|
|
97
97
|
|
98
98
|
# Creates a new instance of <tt>Net::DNS::Packet</tt> class. Arguments are the
|
99
99
|
# canonical name of the resource, an optional type field and an optional
|
100
|
-
# class field.
|
101
|
-
# to +A+ and +IN
|
100
|
+
# class field. If the arguments are omitted, no question is added to the new packet;
|
101
|
+
# type and class default to +A+ and +IN+ if a name is given.
|
102
102
|
#
|
103
|
+
# packet = Net::DNS::Packet.new
|
103
104
|
# packet = Net::DNS::Packet.new("www.example.com")
|
104
105
|
# packet = Net::DNS::Packet.new("example.com", Net::DNS::MX)
|
105
106
|
# packet = Net::DNS::Packet.new("example.com", Net::DNS::TXT, Net::DNS::CH)
|
106
107
|
#
|
107
108
|
# This class no longer instantiate object from binary data coming from
|
108
109
|
# network streams. Please use <tt>Net::DNS::Packet.parse</tt> instead.
|
109
|
-
def initialize(name, type = Net::DNS::A, cls = Net::DNS::IN)
|
110
|
-
|
111
|
-
@question = [
|
110
|
+
def initialize(name = nil, type = Net::DNS::A, cls = Net::DNS::IN)
|
111
|
+
default_qdcount = 0
|
112
|
+
@question = []
|
113
|
+
|
114
|
+
if not name.nil?
|
115
|
+
default_qdcount = 1
|
116
|
+
@question = [Net::DNS::Question.new(name, type, cls)]
|
117
|
+
end
|
118
|
+
|
119
|
+
@header = Net::DNS::Header.new(:qdCount => default_qdcount)
|
112
120
|
@answer = []
|
113
121
|
@authority = []
|
114
122
|
@additional = []
|
@@ -119,7 +127,7 @@ module Net
|
|
119
127
|
|
120
128
|
# Checks if the packet is a QUERY packet
|
121
129
|
def query?
|
122
|
-
@header.
|
130
|
+
@header.query?
|
123
131
|
end
|
124
132
|
|
125
133
|
# Returns the packet object in binary data, suitable
|
@@ -542,7 +550,7 @@ module Net
|
|
542
550
|
@additional << rrobj
|
543
551
|
@logger.debug rrobj.inspect
|
544
552
|
rescue NameError => e
|
545
|
-
warn "Net::DNS
|
553
|
+
warn "Net::DNS unsupported record type: #{e.message}"
|
546
554
|
end
|
547
555
|
end
|
548
556
|
|
data/lib/net/dns/resolver.rb
CHANGED
@@ -345,38 +345,8 @@ module Net
|
|
345
345
|
# The default is 127.0.0.1 (localhost)
|
346
346
|
#
|
347
347
|
def nameservers=(arg)
|
348
|
-
|
349
|
-
|
350
|
-
begin
|
351
|
-
@config[:nameservers] = [IPAddr.new(arg)]
|
352
|
-
@logger.info "Nameservers list changed to value #{@config[:nameservers].inspect}"
|
353
|
-
rescue ArgumentError # arg is in the name form, not IP
|
354
|
-
nameservers_from_name(arg)
|
355
|
-
end
|
356
|
-
when IPAddr
|
357
|
-
@config[:nameservers] = [arg]
|
358
|
-
@logger.info "Nameservers list changed to value #{@config[:nameservers].inspect}"
|
359
|
-
when Array
|
360
|
-
@config[:nameservers] = []
|
361
|
-
arg.each do |x|
|
362
|
-
@config[:nameservers] << case x
|
363
|
-
when String
|
364
|
-
begin
|
365
|
-
IPAddr.new(x)
|
366
|
-
rescue ArgumentError
|
367
|
-
nameservers_from_name(arg)
|
368
|
-
return
|
369
|
-
end
|
370
|
-
when IPAddr
|
371
|
-
x
|
372
|
-
else
|
373
|
-
raise ArgumentError, "Wrong argument format"
|
374
|
-
end
|
375
|
-
end
|
376
|
-
@logger.info "Nameservers list changed to value #{@config[:nameservers].inspect}"
|
377
|
-
else
|
378
|
-
raise ArgumentError, "Wrong argument format, neither String, Array nor IPAddr"
|
379
|
-
end
|
348
|
+
@config[:nameservers] = convert_nameservers_arg_to_ips(arg)
|
349
|
+
@logger.info "Nameservers list changed to value #{@config[:nameservers].inspect}"
|
380
350
|
end
|
381
351
|
alias_method("nameserver=","nameservers=")
|
382
352
|
|
@@ -395,6 +365,15 @@ module Net
|
|
395
365
|
@config[:packet_size]
|
396
366
|
end
|
397
367
|
|
368
|
+
def packet_size=(arg)
|
369
|
+
if arg.respond_to? :to_i
|
370
|
+
@config[:packet_size] = arg.to_i
|
371
|
+
@logger.info "Packet size changed to value #{@config[:packet_size].inspect}"
|
372
|
+
else
|
373
|
+
@logger.error "Packet size not set, #{arg.class} does not respond to to_i"
|
374
|
+
end
|
375
|
+
end
|
376
|
+
|
398
377
|
# Get the port number to which the resolver sends queries.
|
399
378
|
#
|
400
379
|
# puts "Sending queries to port #{res.port}"
|
@@ -508,8 +487,12 @@ module Net
|
|
508
487
|
@logger.warn "Port already in use"
|
509
488
|
retry
|
510
489
|
when 99 # Address is not valid: raw socket
|
511
|
-
|
512
|
-
|
490
|
+
if Process.uid == 0
|
491
|
+
@raw = true
|
492
|
+
@logger.warn "Using raw sockets"
|
493
|
+
else
|
494
|
+
raise RuntimeError, "Raw sockets requested but not running as root."
|
495
|
+
end
|
513
496
|
else
|
514
497
|
raise SystemCallError, e
|
515
498
|
end
|
@@ -1080,7 +1063,7 @@ module Net
|
|
1080
1063
|
if self.class.platform_windows?
|
1081
1064
|
require 'win32/resolv'
|
1082
1065
|
arr = Win32::Resolv.get_resolv_info
|
1083
|
-
self.domain = arr[0].to_s
|
1066
|
+
self.domain = arr[0].first.to_s
|
1084
1067
|
self.nameservers = arr[1]
|
1085
1068
|
else
|
1086
1069
|
nameservers = []
|
@@ -1123,6 +1106,24 @@ module Net
|
|
1123
1106
|
end
|
1124
1107
|
end
|
1125
1108
|
|
1109
|
+
def convert_nameservers_arg_to_ips(arg)
|
1110
|
+
if arg.kind_of? IPAddr
|
1111
|
+
[arg]
|
1112
|
+
elsif arg.respond_to? :map
|
1113
|
+
arg.map{|x| convert_nameservers_arg_to_ips(x) }.flatten
|
1114
|
+
elsif arg.respond_to? :to_a
|
1115
|
+
arg.to_a.map{|x| convert_nameservers_arg_to_ips(x) }.flatten
|
1116
|
+
elsif arg.respond_to? :to_s
|
1117
|
+
begin
|
1118
|
+
[IPAddr.new(arg.to_s)]
|
1119
|
+
rescue ArgumentError # arg is in the name form, not IP
|
1120
|
+
nameservers_from_name(arg)
|
1121
|
+
end
|
1122
|
+
else
|
1123
|
+
raise ArgumentError, "Wrong nameservers argument format, cannot convert to array of IPAddrs"
|
1124
|
+
end
|
1125
|
+
end
|
1126
|
+
|
1126
1127
|
def nameservers_from_name(arg)
|
1127
1128
|
arr = []
|
1128
1129
|
arg.split(" ").each do |name|
|
@@ -1130,26 +1131,21 @@ module Net
|
|
1130
1131
|
arr << ip
|
1131
1132
|
end
|
1132
1133
|
end
|
1133
|
-
|
1134
|
+
arr
|
1134
1135
|
end
|
1135
1136
|
|
1136
1137
|
def make_query_packet(string, type, cls)
|
1137
|
-
|
1138
|
-
|
1139
|
-
name = string.reverse
|
1138
|
+
begin
|
1139
|
+
name = IPAddr.new(string.chomp(".")).reverse
|
1140
1140
|
type = Net::DNS::PTR
|
1141
|
-
|
1142
|
-
when /\d/ # Contains a number, try to see if it's an IP or IPv6 address
|
1143
|
-
begin
|
1144
|
-
name = IPAddr.new(string.chomp(".")).reverse
|
1145
|
-
type = Net::DNS::PTR
|
1146
|
-
rescue ArgumentError
|
1147
|
-
name = string if valid? string
|
1148
|
-
end
|
1149
|
-
else
|
1141
|
+
rescue ArgumentError
|
1150
1142
|
name = string if valid? string
|
1151
1143
|
end
|
1152
1144
|
|
1145
|
+
if name.nil?
|
1146
|
+
raise ArgumentError, "Bad query string"
|
1147
|
+
end
|
1148
|
+
|
1153
1149
|
# Create the packet
|
1154
1150
|
packet = Net::DNS::Packet.new(name, type, cls)
|
1155
1151
|
|
@@ -1208,13 +1204,16 @@ module Net
|
|
1208
1204
|
socket.close
|
1209
1205
|
end
|
1210
1206
|
end
|
1207
|
+
ans
|
1211
1208
|
end
|
1212
1209
|
|
1213
1210
|
def query_udp(packet, packet_data)
|
1214
1211
|
socket4 = UDPSocket.new
|
1215
1212
|
socket4.bind(@config[:source_address].to_s,@config[:source_port])
|
1216
|
-
|
1217
|
-
|
1213
|
+
if @config[:nameservers].any? { |ns| ns.ipv6? }
|
1214
|
+
socket6 = UDPSocket.new(Socket::AF_INET6)
|
1215
|
+
socket6.bind(@config[:source_address_inet6].to_s,@config[:source_port])
|
1216
|
+
end
|
1218
1217
|
|
1219
1218
|
ans = nil
|
1220
1219
|
response = ""
|