net-dns2 0.8.2 → 0.8.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
[![Build Status](https://travis-ci.org/mordocai/net-dns.svg?branch=master)](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 = ""
|