em-resolv-replace 1.1.1 → 1.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/History.rdoc ADDED
@@ -0,0 +1,15 @@
1
+ = 1.1.2
2
+
3
+ Gracefully handle whitespace in /etc/resolv.conf (troy)
4
+
5
+ = 1.1.1
6
+
7
+ Handle lookups for numeric IPs gracefully. (UVSoft)
8
+
9
+ = 1.1.0
10
+
11
+ Add support for local /etc/hosts file.
12
+
13
+ = 1.0.0
14
+
15
+ Initial release with Phat.
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2009 Mike Perham
1
+ Copyright (c) 2011 Mike Perham
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/Rakefile CHANGED
@@ -1,23 +1,6 @@
1
1
  require 'rubygems'
2
2
  require 'rake'
3
3
 
4
- begin
5
- require 'jeweler'
6
- Jeweler::Tasks.new do |gem|
7
- gem.name = "em-resolv-replace"
8
- gem.summary = %Q{EventMachine-aware DNS lookup for Ruby}
9
- gem.email = "mperham@gmail.com"
10
- gem.homepage = "http://github.com/mperham/em-resolv-replace"
11
- gem.authors = ["Mike Perham"]
12
- gem.add_development_dependency "shoulda", ">= 2.10.3"
13
- gem.add_development_dependency "mocha", ">= 0.9.8"
14
- # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
15
- end
16
- Jeweler::GemcutterTasks.new
17
- rescue LoadError
18
- puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
19
- end
20
-
21
4
  require 'rake/testtask'
22
5
  Rake::TestTask.new(:test) do |test|
23
6
  test.libs << 'lib' << 'test'
@@ -38,11 +21,9 @@ rescue LoadError
38
21
  end
39
22
  end
40
23
 
41
- task :test => :check_dependencies
42
-
43
24
  task :default => :test
44
25
 
45
- require 'rake/rdoctask'
26
+ require 'rdoc/task'
46
27
  Rake::RDocTask.new do |rdoc|
47
28
  version = File.exist?('VERSION') ? File.read('VERSION') : ""
48
29
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.1.1
1
+ 1.1.2
@@ -8,14 +8,27 @@ module EventMachine
8
8
  ##
9
9
 
10
10
  def self.resolve(hostname)
11
+ type = Resolv::DNS::Resource::IN::A
11
12
  if ::Resolv::AddressRegex =~ hostname
12
13
  # hostname contains an IP address, nothing to resolve
13
- Request.new(nil, hostname)
14
+ Request.new(nil, hostname, type)
14
15
  else
15
- Request.new(socket, hostname)
16
+ Request.new(socket, hostname, type)
16
17
  end
17
18
  end
18
19
 
20
+ def self.reverse(address)
21
+ case address
22
+ when Resolv::IPv4::Regex
23
+ ptr = Resolv::IPv4.create(address).to_name
24
+ when Resolv::IPv6::Regex
25
+ ptr = Resolv::IPv6.create(address).to_name
26
+ else
27
+ raise ArgumentError, "invalid address: #{address}"
28
+ end
29
+ Request.new(socket, ptr, Resolv::DNS::Resource::IN::PTR)
30
+ end
31
+
19
32
  def self.socket
20
33
  if defined?(@socket) && @socket.connected?
21
34
  @socket
@@ -30,7 +43,7 @@ module EventMachine
30
43
  def self.nameserver
31
44
  unless defined?(@nameserver)
32
45
  IO::readlines('/etc/resolv.conf').each do |line|
33
- if line =~ /^nameserver (.+)$/
46
+ if line =~ /^nameserver\s+(.+)$/
34
47
  @nameserver = $1.split(/\s+/).first
35
48
  end
36
49
  end
@@ -105,9 +118,10 @@ module EventMachine
105
118
  include Deferrable
106
119
  attr_accessor :retry_interval
107
120
  attr_accessor :max_tries
108
- def initialize(socket, hostname)
121
+ def initialize(socket, value, type)
109
122
  @socket = socket
110
- @hostname = hostname
123
+ @value = value
124
+ @type = type
111
125
  @tries = 0
112
126
  @last_send = Time.at(0)
113
127
  @retry_interval = 3
@@ -115,9 +129,9 @@ module EventMachine
115
129
  EM.next_tick { tick }
116
130
  end
117
131
  def tick
118
- # @hostname contains an IP address
132
+ # @value already contains the response
119
133
  if @socket.nil?
120
- succeed [ @hostname ]
134
+ succeed [ @value ]
121
135
  return
122
136
  end
123
137
 
@@ -132,17 +146,19 @@ module EventMachine
132
146
  end
133
147
  # Called by DnsSocket#receive_data
134
148
  def receive_answer(msg)
135
- addrs = []
149
+ result = []
136
150
  msg.each_answer do |name,ttl,data|
137
- if data.kind_of?(Resolv::DNS::Resource::IN::A) ||
138
- data.kind_of?(Resolv::DNS::Resource::IN::AAAA)
139
- addrs << data.address.to_s
151
+ case data
152
+ when Resolv::DNS::Resource::IN::A, Resolv::DNS::Resource::IN::AAAA
153
+ result << data.address.to_s
154
+ when Resolv::DNS::Resource::IN::PTR
155
+ result << data.name.to_s
140
156
  end
141
157
  end
142
- if addrs.empty?
158
+ if result.empty?
143
159
  fail "rcode=#{msg.rcode}"
144
160
  else
145
- succeed addrs
161
+ succeed result
146
162
  end
147
163
  end
148
164
  private
@@ -165,7 +181,7 @@ module EventMachine
165
181
  msg = Resolv::DNS::Message.new
166
182
  msg.id = id
167
183
  msg.rd = 1
168
- msg.add_question @hostname, Resolv::DNS::Resource::IN::A
184
+ msg.add_question @value, @type
169
185
  msg
170
186
  end
171
187
  end
@@ -20,18 +20,38 @@ class Resolv
20
20
  EM.reactor_running? ? em_getaddresses(host) : orig_getaddresses(host)
21
21
  end
22
22
 
23
+ alias :orig_getname :getname
24
+
25
+ def getname(address)
26
+ EM.reactor_running? ? em_getnames(address)[0] : orig_getname(address)
27
+ end
28
+
29
+ alias :orig_getnames :getnames
30
+
31
+ def getnames(address)
32
+ EM.reactor_running? ? em_getnames(address) : orig_getnames(address)
33
+ end
34
+
23
35
  private
24
36
 
25
37
  def em_getaddresses(host)
38
+ em_request(host, :each_address, :resolve)
39
+ end
40
+
41
+ def em_getnames(address)
42
+ em_request(address, :each_name, :reverse)
43
+ end
44
+
45
+ def em_request(value, hosts_method, resolv_method)
26
46
  # Lookup in /etc/hosts
27
- x = []
47
+ result = []
28
48
  @hosts ||= Resolv::Hosts.new
29
- @hosts.each_address(host) {|addr| x << addr.to_s }
30
- return x unless x.empty?
49
+ @hosts.send(hosts_method, value) { |x| result << x.to_s }
50
+ return result unless result.empty?
31
51
 
32
52
  # Nothing, hit DNS
33
53
  fiber = Fiber.current
34
- df = EM::DnsResolver.resolve(host)
54
+ df = EM::DnsResolver.send(resolv_method, value)
35
55
  df.callback do |a|
36
56
  fiber.resume(a)
37
57
  end
@@ -64,4 +64,20 @@ class TestEmResolvReplace < Test::Unit::TestCase
64
64
  end
65
65
  end
66
66
 
67
+ should "reverse hostname without eventmachine" do
68
+ Resolv.any_instance.expects(:em_getname).times(0)
69
+
70
+ assert_equal 'localhost', Resolv.getname('127.0.0.1')
71
+ end
72
+
73
+ should "reverse hostname with eventmachine" do
74
+ Resolv.any_instance.expects(:orig_getname).times(0)
75
+
76
+ EM.run do
77
+ Fiber.new do
78
+ assert_equal 'localhost', Resolv.getname('127.0.0.1')
79
+ EM.stop
80
+ end.resume
81
+ end
82
+ end
67
83
  end
metadata CHANGED
@@ -1,62 +1,50 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: em-resolv-replace
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 1
7
- - 1
8
- - 1
9
- version: 1.1.1
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.2
5
+ prerelease:
10
6
  platform: ruby
11
- authors:
7
+ authors:
12
8
  - Mike Perham
13
9
  autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
-
17
- date: 2010-04-08 00:00:00 -05:00
18
- default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
12
+ date: 2011-12-11 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
21
15
  name: shoulda
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- requirements:
25
- - - ">="
26
- - !ruby/object:Gem::Version
27
- segments:
28
- - 2
29
- - 10
30
- - 3
31
- version: 2.10.3
16
+ requirement: &70315159083700 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
32
22
  type: :development
33
- version_requirements: *id001
34
- - !ruby/object:Gem::Dependency
35
- name: mocha
36
23
  prerelease: false
37
- requirement: &id002 !ruby/object:Gem::Requirement
38
- requirements:
39
- - - ">="
40
- - !ruby/object:Gem::Version
41
- segments:
42
- - 0
43
- - 9
44
- - 8
45
- version: 0.9.8
24
+ version_requirements: *70315159083700
25
+ - !ruby/object:Gem::Dependency
26
+ name: mocha
27
+ requirement: &70315159083140 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
46
33
  type: :development
47
- version_requirements: *id002
34
+ prerelease: false
35
+ version_requirements: *70315159083140
48
36
  description:
49
37
  email: mperham@gmail.com
50
38
  executables: []
51
-
52
39
  extensions: []
53
-
54
- extra_rdoc_files:
40
+ extra_rdoc_files:
55
41
  - LICENSE
42
+ - History.rdoc
56
43
  - README.rdoc
57
- files:
44
+ files:
58
45
  - .document
59
46
  - .gitignore
47
+ - History.rdoc
60
48
  - LICENSE
61
49
  - README.rdoc
62
50
  - Rakefile
@@ -65,36 +53,31 @@ files:
65
53
  - lib/em-resolv-replace.rb
66
54
  - test/helper.rb
67
55
  - test/test_em-resolv-replace.rb
68
- has_rdoc: true
69
56
  homepage: http://github.com/mperham/em-resolv-replace
70
57
  licenses: []
71
-
72
58
  post_install_message:
73
- rdoc_options:
59
+ rdoc_options:
74
60
  - --charset=UTF-8
75
- require_paths:
61
+ require_paths:
76
62
  - lib
77
- required_ruby_version: !ruby/object:Gem::Requirement
78
- requirements:
79
- - - ">="
80
- - !ruby/object:Gem::Version
81
- segments:
82
- - 0
83
- version: "0"
84
- required_rubygems_version: !ruby/object:Gem::Requirement
85
- requirements:
86
- - - ">="
87
- - !ruby/object:Gem::Version
88
- segments:
89
- - 0
90
- version: "0"
63
+ required_ruby_version: !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ required_rubygems_version: !ruby/object:Gem::Requirement
70
+ none: false
71
+ requirements:
72
+ - - ! '>='
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
91
75
  requirements: []
92
-
93
76
  rubyforge_project:
94
- rubygems_version: 1.3.6
77
+ rubygems_version: 1.8.10
95
78
  signing_key:
96
79
  specification_version: 3
97
80
  summary: EventMachine-aware DNS lookup for Ruby
98
- test_files:
81
+ test_files:
99
82
  - test/helper.rb
100
83
  - test/test_em-resolv-replace.rb