rubydns 0.5.0 → 0.5.1

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.
data/test/test_daemon.rb CHANGED
@@ -9,11 +9,13 @@ require 'rexec'
9
9
  require 'rexec/daemon'
10
10
 
11
11
  class BasicTestServer < RExec::Daemon::Base
12
+ SERVER_PORTS = [[:udp, '127.0.0.1', 5350], [:tcp, '127.0.0.1', 5350]]
13
+
12
14
  @@base_directory = File.dirname(__FILE__)
13
15
 
14
16
  def self.run
15
17
  # Start the RubyDNS server
16
- RubyDNS::run_server(:listen => [[:udp, "0.0.0.0", 5300], [:tcp, "0.0.0.0", 5300]]) do
18
+ RubyDNS::run_server(:listen => SERVER_PORTS) do
17
19
  match("test.local", IN::A) do |transaction|
18
20
  transaction.respond!("192.168.1.1")
19
21
  end
@@ -45,7 +47,7 @@ class DaemonTest < Test::Unit::TestCase
45
47
  assert_equal :running, RExec::Daemon::ProcessFile.status(BasicTestServer)
46
48
 
47
49
  EventMachine.run do
48
- resolver = resolver = RubyDNS::Resolver.new([[:udp, "127.0.0.1", 5300], [:tcp, "127.0.0.1", 5300]])
50
+ resolver = resolver = RubyDNS::Resolver.new(BasicTestServer::SERVER_PORTS)
49
51
 
50
52
  resolver.query("test.local") do |response|
51
53
  answer = response.answer.first
@@ -62,7 +64,7 @@ class DaemonTest < Test::Unit::TestCase
62
64
  assert_equal :running, RExec::Daemon::ProcessFile.status(BasicTestServer)
63
65
 
64
66
  EventMachine.run do
65
- resolver = resolver = RubyDNS::Resolver.new([[:udp, "127.0.0.1", 5300], [:tcp, "127.0.0.1", 5300]])
67
+ resolver = resolver = RubyDNS::Resolver.new(BasicTestServer::SERVER_PORTS)
66
68
 
67
69
  resolver.query("foobar") do |response|
68
70
  answer = response.answer.first
@@ -9,13 +9,15 @@ require 'rexec'
9
9
  require 'rexec/daemon'
10
10
 
11
11
  class TestPassthroughServer < RExec::Daemon::Base
12
+ SERVER_PORTS = [[:udp, '127.0.0.1', 5340], [:tcp, '127.0.0.1', 5340]]
13
+
12
14
  @@base_directory = File.dirname(__FILE__)
13
15
 
14
16
  def self.run
15
17
  resolver = RubyDNS::Resolver.new([[:udp, "8.8.8.8", 53], [:tcp, "8.8.8.8", 53]])
16
18
 
17
19
  # Start the RubyDNS server
18
- RubyDNS::run_server(:listen => [[:udp, "0.0.0.0", 5300], [:tcp, "0.0.0.0", 5300]]) do
20
+ RubyDNS::run_server(:listen => SERVER_PORTS) do
19
21
  match(/.*\.com/, IN::A) do |match, transaction|
20
22
  transaction.passthrough!(resolver)
21
23
  end
@@ -43,7 +45,7 @@ class PassthroughTest < Test::Unit::TestCase
43
45
  assert_equal :running, RExec::Daemon::ProcessFile.status(TestPassthroughServer)
44
46
 
45
47
  EventMachine.run do
46
- resolver = RubyDNS::Resolver.new([[:udp, "127.0.0.1", 5300], [:tcp, "127.0.0.1", 5300]])
48
+ resolver = RubyDNS::Resolver.new(TestPassthroughServer::SERVER_PORTS)
47
49
 
48
50
  resolver.query("google.com") do |response|
49
51
  answer = response.answer.first
@@ -0,0 +1,53 @@
1
+
2
+ require 'helper'
3
+ require 'pathname'
4
+
5
+ require 'rubydns'
6
+ require 'rubydns/resolver'
7
+ require 'rubydns/extensions/string'
8
+
9
+ class RulesTest < Test::Unit::TestCase
10
+ IN = Resolv::DNS::Resource::IN
11
+
12
+ def setup
13
+ @server = RubyDNS::Server.new
14
+ @true_callback = Proc.new { true }
15
+ end
16
+
17
+ def teardown
18
+ end
19
+
20
+ def test_string_pattern
21
+ rule = RubyDNS::Server::Rule.new(["foobar", IN::A], @true_callback)
22
+
23
+ assert rule.call(@server, "foobar", IN::A)
24
+ assert !rule.call(@server, "barfoo", IN::A)
25
+ assert !rule.call(@server, "foobar", IN::TXT)
26
+ end
27
+
28
+ def test_regexp_pattern
29
+ rule = RubyDNS::Server::Rule.new([/foo/, IN::A], @true_callback)
30
+
31
+ assert rule.call(@server, "foobar", IN::A)
32
+ assert !rule.call(@server, "barbaz", IN::A)
33
+ assert !rule.call(@server, "foobar", IN::TXT)
34
+ end
35
+
36
+ def test_callback_pattern
37
+ calls = 0
38
+
39
+ callback = Proc.new do |name, resource_class|
40
+ # A counter used to check the number of times this block was invoked.
41
+ calls += 1
42
+
43
+ name.size == 6
44
+ end
45
+
46
+ rule = RubyDNS::Server::Rule.new([callback], @true_callback)
47
+
48
+ assert rule.call(@server, "foobar", IN::A)
49
+ assert !rule.call(@server, "foobarbaz", IN::A)
50
+
51
+ assert_equal 2, calls
52
+ end
53
+ end
@@ -0,0 +1,77 @@
1
+
2
+ require 'helper'
3
+ require 'pathname'
4
+
5
+ require 'rubydns'
6
+ require 'rubydns/resolver'
7
+ require 'rubydns/extensions/string'
8
+
9
+ class SlowServer < RExec::Daemon::Base
10
+ SERVER_PORTS = [[:udp, '127.0.0.1', 5330], [:tcp, '127.0.0.1', 5330]]
11
+
12
+ @@base_directory = File.dirname(__FILE__)
13
+
14
+ Name = Resolv::DNS::Name
15
+ IN = Resolv::DNS::Resource::IN
16
+
17
+ def self.run
18
+ RubyDNS::run_server(:listen => SERVER_PORTS) do
19
+ match(/\.*.com/, IN::A) do |match, transaction|
20
+ transaction.defer!
21
+
22
+ # No domain exists, after 5 seconds:
23
+ EventMachine::Timer.new(2) do
24
+ transaction.failure!(:NXDomain)
25
+ end
26
+ end
27
+
28
+ otherwise do |transaction|
29
+ transaction.failure!(:NXDomain)
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ class SlowServerTest < Test::Unit::TestCase
36
+ def setup
37
+ SlowServer.start
38
+ end
39
+
40
+ def teardown
41
+ SlowServer.stop
42
+ end
43
+
44
+ def test_slow_request
45
+ start_time = Time.now
46
+ end_time = nil
47
+
48
+ resolver = RubyDNS::Resolver.new(SlowServer::SERVER_PORTS, :timeout => 10)
49
+
50
+ EventMachine::run do
51
+ resolver.query("apple.com", IN::A) do |response|
52
+ end_time = Time.now
53
+
54
+ EventMachine::stop
55
+ end
56
+ end
57
+
58
+ assert (end_time - start_time) > 2.0
59
+ end
60
+
61
+ def test_normal_request
62
+ start_time = Time.now
63
+ end_time = nil
64
+
65
+ resolver = RubyDNS::Resolver.new(SlowServer::SERVER_PORTS, :timeout => 10)
66
+
67
+ EventMachine::run do
68
+ resolver.query("oriontransfer.org", IN::A) do |response|
69
+ end_time = Time.now
70
+
71
+ EventMachine::stop
72
+ end
73
+ end
74
+
75
+ assert (end_time - start_time) < 2.0
76
+ end
77
+ end
@@ -7,6 +7,8 @@ require 'rubydns/resolver'
7
7
  require 'rubydns/extensions/string'
8
8
 
9
9
  class TruncatedServer < RExec::Daemon::Base
10
+ SERVER_PORTS = [[:udp, '127.0.0.1', 5320], [:tcp, '127.0.0.1', 5320]]
11
+
10
12
  @@base_directory = File.dirname(__FILE__)
11
13
 
12
14
  Name = Resolv::DNS::Name
@@ -14,7 +16,7 @@ class TruncatedServer < RExec::Daemon::Base
14
16
 
15
17
  def self.run
16
18
  # Start the RubyDNS server
17
- RubyDNS::run_server(:listen => [[:udp, '0.0.0.0', 5320], [:tcp, '0.0.0.0', 5320]]) do
19
+ RubyDNS::run_server(:listen => SERVER_PORTS) do
18
20
  match("truncation", IN::TXT) do |transaction|
19
21
  text = "Hello World! " * 100
20
22
  transaction.respond!(*text.chunked)
@@ -38,7 +40,7 @@ class TruncationTest < Test::Unit::TestCase
38
40
  end
39
41
 
40
42
  def test_tcp_failover
41
- resolver = RubyDNS::Resolver.new([[:udp, '127.0.0.1', 5320], [:tcp, '127.0.0.1', 5320]])
43
+ resolver = RubyDNS::Resolver.new(TruncatedServer::SERVER_PORTS)
42
44
 
43
45
  EventMachine::run do
44
46
  resolver.query("truncation", IN::TXT) do |response|
metadata CHANGED
@@ -1,48 +1,48 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubydns
3
3
  version: !ruby/object:Gem::Version
4
+ version: 0.5.1
4
5
  prerelease:
5
- version: 0.5.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Samuel Williams
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-20 00:00:00.000000000 Z
12
+ date: 2012-10-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- prerelease: false
16
- version_requirements: !ruby/object:Gem::Requirement
15
+ name: rexec
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
20
20
  - !ruby/object:Gem::Version
21
21
  version: 1.5.1
22
- requirement: !ruby/object:Gem::Requirement
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
23
25
  none: false
24
26
  requirements:
25
27
  - - ~>
26
28
  - !ruby/object:Gem::Version
27
29
  version: 1.5.1
28
- type: :runtime
29
- name: rexec
30
30
  - !ruby/object:Gem::Dependency
31
- prerelease: false
32
- version_requirements: !ruby/object:Gem::Requirement
31
+ name: eventmachine
32
+ requirement: !ruby/object:Gem::Requirement
33
33
  none: false
34
34
  requirements:
35
35
  - - ~>
36
36
  - !ruby/object:Gem::Version
37
37
  version: 1.0.0
38
- requirement: !ruby/object:Gem::Requirement
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
39
41
  none: false
40
42
  requirements:
41
43
  - - ~>
42
44
  - !ruby/object:Gem::Version
43
45
  version: 1.0.0
44
- type: :runtime
45
- name: eventmachine
46
46
  description:
47
47
  email: samuel@oriontransfer.org
48
48
  executables:
@@ -53,8 +53,13 @@ extra_rdoc_files: []
53
53
  files:
54
54
  - bin/rd-dns-check
55
55
  - bin/rd-resolve-test
56
- - lib/rubydns.rb
57
56
  - lib/rubydns/chunked.rb
57
+ - lib/rubydns/extensions/hexdump.rb
58
+ - lib/rubydns/extensions/resolv.rb
59
+ - lib/rubydns/extensions/string-1.8.rb
60
+ - lib/rubydns/extensions/string-1.9.2.rb
61
+ - lib/rubydns/extensions/string-1.9.3.rb
62
+ - lib/rubydns/extensions/string.rb
58
63
  - lib/rubydns/handler.rb
59
64
  - lib/rubydns/message.rb
60
65
  - lib/rubydns/resolver.rb
@@ -62,31 +67,34 @@ files:
62
67
  - lib/rubydns/system.rb
63
68
  - lib/rubydns/transaction.rb
64
69
  - lib/rubydns/version.rb
65
- - lib/rubydns/extensions/hexdump.rb
66
- - lib/rubydns/extensions/resolv-1.8.rb
67
- - lib/rubydns/extensions/resolv-1.9.rb
68
- - lib/rubydns/extensions/string-1.8.rb
69
- - lib/rubydns/extensions/string-1.9.2.rb
70
- - lib/rubydns/extensions/string-1.9.3.rb
71
- - lib/rubydns/extensions/string.rb
72
- - test/daemon1.rb
73
- - test/daemon2.rb
74
- - test/example1.rb
75
- - test/fortune-dns.rb
70
+ - lib/rubydns.rb
71
+ - test/examples/GeoLiteCountry.dat
72
+ - test/examples/dropping-dns.rb
73
+ - test/examples/fortune-dns.rb
74
+ - test/examples/geoip-dns.rb
75
+ - test/examples/log/DroppingDaemon.log
76
+ - test/examples/log/FortuneDNS.log
77
+ - test/examples/log/GeoIPDNSDaemon.log
78
+ - test/examples/log/TestDaemon.log
79
+ - test/examples/run/DroppingDaemon.pid
80
+ - test/examples/run/GeoIPDNSDaemon.pid
81
+ - test/examples/soa-dns.rb
82
+ - test/examples/test-dns-1.rb
83
+ - test/examples/test-dns-2.rb
76
84
  - test/helper.rb
77
85
  - test/hosts.txt
78
- - test/soa_example1.rb
86
+ - test/log/BasicTestServer.log
87
+ - test/log/SlowServer.log
88
+ - test/log/TestPassthroughServer.log
89
+ - test/log/TruncatedServer.log
79
90
  - test/test_daemon.rb
80
91
  - test/test_domains.txt
81
92
  - test/test_passthrough.rb
82
93
  - test/test_resolver.rb
94
+ - test/test_rules.rb
95
+ - test/test_slow_server.rb
83
96
  - test/test_system.rb
84
97
  - test/test_truncation.rb
85
- - test/log/BasicTestServer.log
86
- - test/log/FortuneDNS.log
87
- - test/log/TestPassthroughServer.log
88
- - test/log/TruncatedServer.log
89
- - test/TruncatedServer/log/daemon.log
90
98
  - rakefile.rb
91
99
  - Gemfile
92
100
  - README.md
@@ -101,10 +109,10 @@ required_ruby_version: !ruby/object:Gem::Requirement
101
109
  requirements:
102
110
  - - ! '>='
103
111
  - !ruby/object:Gem::Version
104
- hash: 2002549777813010636
105
112
  version: '0'
106
113
  segments:
107
114
  - 0
115
+ hash: 1826136753171810618
108
116
  required_rubygems_version: !ruby/object:Gem::Requirement
109
117
  none: false
110
118
  requirements:
@@ -1,111 +0,0 @@
1
- # Copyright (c) 2009, 2011 Samuel G. D. Williams. <http://www.oriontransfer.co.nz>
2
- #
3
- # Permission is hereby granted, free of charge, to any person obtaining a copy
4
- # of this software and associated documentation files (the "Software"), to deal
5
- # in the Software without restriction, including without limitation the rights
6
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
- # copies of the Software, and to permit persons to whom the Software is
8
- # furnished to do so, subject to the following conditions:
9
- #
10
- # The above copyright notice and this permission notice shall be included in
11
- # all copies or substantial portions of the Software.
12
- #
13
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
- # THE SOFTWARE.
20
-
21
- require 'resolv'
22
-
23
- class Resolv
24
- class DNS
25
- # This issue was not fixed in 1.9.3 but the proposed patch works as expected:
26
- # https://bugs.ruby-lang.org/issues/4788
27
- def fetch_resource(name, typeclass)
28
- lazy_initialize
29
- requester = make_udp_requester
30
- senders = {}
31
- begin
32
- @config.resolv(name) {|candidate, tout, nameserver, port|
33
- msg = Message.new
34
- msg.rd = 1
35
- msg.add_question(candidate, typeclass)
36
- unless sender = senders[[candidate, nameserver, port]]
37
- sender = senders[[candidate, nameserver, port]] =
38
- requester.sender(msg, candidate, nameserver, port)
39
- end
40
- reply, reply_name = requester.request(sender, tout)
41
- case reply.rcode
42
- when RCode::NoError
43
- if reply.tc == 1 and not Requester::TCP === requester
44
- requester.close
45
- # Retry via TCP:
46
- requester = make_tcp_requester(nameserver, port)
47
- senders = {}
48
- # This will use TCP for all remaining candidates (assuming the
49
- # current candidate does not already respond successfully via
50
- # TCP). This makes sense because we already know the full
51
- # response will not fit in an untruncated UDP packet.
52
- redo
53
- else
54
- yield(reply, reply_name)
55
- end
56
- return
57
- when RCode::NXDomain
58
- raise Config::NXDomain.new(reply_name.to_s)
59
- else
60
- raise Config::OtherResolvError.new(reply_name.to_s)
61
- end
62
- }
63
- ensure
64
- requester.close
65
- end
66
- end
67
-
68
- def each_resource(name, typeclass, &proc)
69
- fetch_resource(name, typeclass) do |reply, reply_name|
70
- extract_resources(reply, reply_name, typeclass, &proc)
71
- end
72
- end
73
-
74
- # Queries the given DNS server and returns its response in its entirety.
75
- # This allows such responses to be passed upstream with little or no
76
- # modification/reinterpretation.
77
- def query(name, typeclass)
78
- fetch_resource(name, typeclass) do |reply, reply_name|
79
- return reply, reply_name
80
- end
81
- end
82
-
83
- class Message
84
- # Merge the given message with this message. A number of heuristics are
85
- # applied in order to ensure that the result makes sense. For example,
86
- # If the current message is not recursive but is being merged with a
87
- # message that was recursive, this bit is maintained. If either message
88
- # is authoritive, then the result is also authoritive.
89
- #
90
- # Modifies the current message in place.
91
- def merge! (other)
92
- # Authoritive Answer
93
- @aa = @aa && other.aa
94
-
95
- @question += other.question
96
- @answer += other.answer
97
- @authority += other.authority
98
- @additional += other.additional
99
-
100
- # Recursion Available
101
- @ra = @ra || other.ra
102
-
103
- # Result Code (Error Code)
104
- @rcode = other.rcode unless other.rcode == 0
105
-
106
- # Recursion Desired
107
- @rd = @rd || other.rd
108
- end
109
- end
110
- end
111
- end