redns 0.1.0 → 0.1.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/VERSION +1 -1
- data/lib/redns/connection.rb +53 -5
- data/lib/redns/message.rb +8 -1
- data/lib/redns/support.rb +4 -0
- data/redns.gemspec +1 -1
- data/test/test_redns_connection.rb +51 -3
- data/test/test_redns_message.rb +1 -1
- metadata +2 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.1
|
data/lib/redns/connection.rb
CHANGED
@@ -3,6 +3,12 @@ require 'socket'
|
|
3
3
|
class ReDNS::Connection < EventMachine::Connection
|
4
4
|
# == Constants ============================================================
|
5
5
|
|
6
|
+
DEFAULT_TIMEOUT = 5
|
7
|
+
|
8
|
+
# == Properties ===========================================================
|
9
|
+
|
10
|
+
attr_accessor :timeout
|
11
|
+
|
6
12
|
# == Extensions ===========================================================
|
7
13
|
|
8
14
|
include EventMachine::Deferrable
|
@@ -10,11 +16,15 @@ class ReDNS::Connection < EventMachine::Connection
|
|
10
16
|
# == Class Methods ========================================================
|
11
17
|
|
12
18
|
def self.instance
|
13
|
-
EventMachine.open_datagram_socket(
|
19
|
+
connection = EventMachine.open_datagram_socket(
|
14
20
|
ReDNS::Support.bind_all_addr,
|
15
21
|
0,
|
16
22
|
self
|
17
23
|
)
|
24
|
+
|
25
|
+
yield(connection) if (block_given?)
|
26
|
+
|
27
|
+
connection
|
18
28
|
end
|
19
29
|
|
20
30
|
# == Instance Methods =====================================================
|
@@ -26,6 +36,23 @@ class ReDNS::Connection < EventMachine::Connection
|
|
26
36
|
|
27
37
|
# Callback tracking is done by matching response IDs in a lookup table
|
28
38
|
@callback = { }
|
39
|
+
|
40
|
+
EventMachine.add_periodic_timer(1) do
|
41
|
+
check_for_timeouts!
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def random_nameserver
|
46
|
+
nameservers[rand(nameservers.length)]
|
47
|
+
end
|
48
|
+
|
49
|
+
def nameservers
|
50
|
+
@nameservers ||= ReDNS::Support.default_nameservers
|
51
|
+
end
|
52
|
+
|
53
|
+
def nameservers=(*list)
|
54
|
+
@nameservers = list.flatten.compact
|
55
|
+
@nameservers = nil if (list.empty?)
|
29
56
|
end
|
30
57
|
|
31
58
|
def port
|
@@ -35,8 +62,8 @@ class ReDNS::Connection < EventMachine::Connection
|
|
35
62
|
def receive_data(data)
|
36
63
|
message = ReDNS::Message.new(ReDNS::Buffer.new(data))
|
37
64
|
|
38
|
-
if (callback = @callback
|
39
|
-
callback.
|
65
|
+
if (callback = @callback.delete(message.id))
|
66
|
+
callback[:callback].call(message.answers.collect { |a| a.rdata.to_s })
|
40
67
|
end
|
41
68
|
end
|
42
69
|
|
@@ -47,12 +74,15 @@ class ReDNS::Connection < EventMachine::Connection
|
|
47
74
|
|
48
75
|
result = send_datagram(
|
49
76
|
message.serialize.to_s,
|
50
|
-
|
77
|
+
random_nameserver,
|
51
78
|
ReDNS::Support.dns_port
|
52
79
|
)
|
53
80
|
|
54
81
|
if (result > 0)
|
55
|
-
@callback[@sequence] =
|
82
|
+
@callback[@sequence] = {
|
83
|
+
:callback => callback,
|
84
|
+
:at => Time.now
|
85
|
+
}
|
56
86
|
else
|
57
87
|
callback.call(nil)
|
58
88
|
end
|
@@ -62,4 +92,22 @@ class ReDNS::Connection < EventMachine::Connection
|
|
62
92
|
|
63
93
|
def unbind
|
64
94
|
end
|
95
|
+
|
96
|
+
def check_for_timeouts!
|
97
|
+
timeout_at = Time.now - (@timeout || DEFAULT_TIMEOUT)
|
98
|
+
|
99
|
+
@callback.keys.each do |k|
|
100
|
+
params = @callback[k]
|
101
|
+
|
102
|
+
if (params and params[:at] < timeout_at)
|
103
|
+
params[:callback].call(nil)
|
104
|
+
@callback.delete(k)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def timeout=(value)
|
110
|
+
@timeout = value.to_i
|
111
|
+
@timeout = DEFAULT_TIMEOUT if (@timeout == 0)
|
112
|
+
end
|
65
113
|
end
|
data/lib/redns/message.rb
CHANGED
@@ -29,7 +29,14 @@ class ReDNS::Message < ReDNS::Fragment
|
|
29
29
|
# == Class Methods ========================================================
|
30
30
|
|
31
31
|
def self.question(name, qtype = nil)
|
32
|
-
|
32
|
+
if (!qtype)
|
33
|
+
if (ReDNS::Support.is_ip?(name))
|
34
|
+
name = ReDNS::Support.addr_to_arpa(name)
|
35
|
+
qtype = :ptr
|
36
|
+
else
|
37
|
+
qtype = :a
|
38
|
+
end
|
39
|
+
end
|
33
40
|
|
34
41
|
message = new(
|
35
42
|
:questions => [
|
data/lib/redns/support.rb
CHANGED
data/redns.gemspec
CHANGED
@@ -18,22 +18,70 @@ class TestReDNSConnection < Test::Unit::TestCase
|
|
18
18
|
|
19
19
|
def test_simple_resolve
|
20
20
|
address = nil
|
21
|
+
reverse = nil
|
22
|
+
nameservers = nil
|
21
23
|
|
22
24
|
EventMachine.run do
|
23
25
|
dns = ReDNS::Connection.instance
|
24
26
|
|
27
|
+
assert dns.nameservers.length > 0
|
28
|
+
|
25
29
|
dns.resolve('example.com') do |result|
|
26
30
|
address = result
|
27
31
|
|
28
|
-
EventMachine.stop_event_loop
|
32
|
+
EventMachine.stop_event_loop if (address and reverse and nameservers)
|
33
|
+
end
|
34
|
+
|
35
|
+
dns.resolve('192.0.32.10') do |result|
|
36
|
+
reverse = result
|
37
|
+
|
38
|
+
EventMachine.stop_event_loop if (address and reverse and nameservers)
|
39
|
+
end
|
40
|
+
|
41
|
+
dns.resolve('example.com', :ns) do |result|
|
42
|
+
nameservers = result
|
43
|
+
|
44
|
+
EventMachine.stop_event_loop if (address and reverse and nameservers)
|
29
45
|
end
|
30
46
|
|
31
|
-
EventMachine.add_timer(
|
47
|
+
EventMachine.add_timer(4) do
|
32
48
|
EventMachine.stop_event_loop
|
33
49
|
end
|
34
50
|
end
|
35
51
|
|
36
|
-
assert address, "Address was not defined, connection may have timed out"
|
37
52
|
assert_equal %w[ 192.0.32.10 ], address
|
53
|
+
assert_equal %w[ www.example.com. ], reverse
|
54
|
+
assert_equal %w[ a.iana-servers.net. b.iana-servers.net. ], nameservers.sort
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_simple_timeout
|
58
|
+
address = :fail
|
59
|
+
|
60
|
+
EventMachine.run do
|
61
|
+
dns = ReDNS::Connection.instance do |c|
|
62
|
+
c.nameservers = %w[ 127.0.0.127 ]
|
63
|
+
c.timeout = 2
|
64
|
+
end
|
65
|
+
|
66
|
+
dns.resolve('example.com') do |result|
|
67
|
+
address = result
|
68
|
+
|
69
|
+
EventMachine.stop_event_loop
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
assert_equal nil, address
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_default_timeout
|
77
|
+
EventMachine.run do
|
78
|
+
dns = ReDNS::Connection.instance do |c|
|
79
|
+
c.timeout = nil
|
80
|
+
end
|
81
|
+
|
82
|
+
assert_equal ReDNS::Connection::DEFAULT_TIMEOUT, dns.timeout
|
83
|
+
|
84
|
+
EventMachine.stop_event_loop
|
85
|
+
end
|
38
86
|
end
|
39
87
|
end
|
data/test/test_redns_message.rb
CHANGED
@@ -144,7 +144,7 @@ class TestReDNSMessage < Test::Unit::TestCase
|
|
144
144
|
|
145
145
|
assert_equal 1, question.questions.length
|
146
146
|
|
147
|
-
assert_equal '
|
147
|
+
assert_equal '1.0.0.127.in-addr.arpa.', question.questions[0].name.to_s
|
148
148
|
assert_equal :ptr, question.questions[0].qtype
|
149
149
|
end
|
150
150
|
|