em-resolv-replace 1.1.1 → 1.1.2

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/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