class Resolv

Resolv is a thread-aware DNS resolver library written in Ruby. Resolv can handle multiple DNS requests concurrently without blocking the entire Ruby interpreter.

See also resolv-replace.rb to replace the libc resolver with Resolv.

Resolv can look up various DNS resources using the DNS module directly.

Examples:

p Resolv.getaddress "www.ruby-lang.org"
p Resolv.getname "210.251.121.214"

Resolv::DNS.open do |dns|
  ress = dns.getresources "www.ruby-lang.org", Resolv::DNS::Resource::IN::A
  p ress.map(&:address)
  ress = dns.getresources "ruby-lang.org", Resolv::DNS::Resource::IN::MX
  p ress.map { |r| [r.exchange.to_s, r.preference] }
end

Bugs

  • NIS is not supported.

  • /etc/nsswitch.conf is not supported.

Constants

AddressRegex

Address Regexp to use for matching IP addresses.

DefaultResolver

Default resolver to use for Resolv class methods.

Public Class Methods

Iterates over all IP addresses for name.

# File lib/resolv.rb, line 57
def self.each_address(name, &block)
  DefaultResolver.each_address(name, &block)
end

Iterates over all hostnames for address.

# File lib/resolv.rb, line 78
def self.each_name(address, &proc)
  DefaultResolver.each_name(address, &proc)
end

Looks up the first IP address for name.

# File lib/resolv.rb, line 43
def self.getaddress(name)
  DefaultResolver.getaddress(name)
end

Looks up all IP address for name.

# File lib/resolv.rb, line 50
def self.getaddresses(name)
  DefaultResolver.getaddresses(name)
end

Looks up the hostname of address.

# File lib/resolv.rb, line 64
def self.getname(address)
  DefaultResolver.getname(address)
end

Looks up all hostnames for address.

# File lib/resolv.rb, line 71
def self.getnames(address)
  DefaultResolver.getnames(address)
end

Creates a new Resolv using resolvers.

# File lib/resolv.rb, line 85
def initialize(resolvers=[Hosts.new, DNS.new])
  @resolvers = resolvers
end

Public Instance Methods

Iterates over all IP addresses for name.

# File lib/resolv.rb, line 109
def each_address(name)
  if AddressRegex =~ name
    yield name
    return
  end
  yielded = false
  @resolvers.each {|r|
    r.each_address(name) {|address|
      yield address.to_s
      yielded = true
    }
    return if yielded
  }
end

Iterates over all hostnames for address.

# File lib/resolv.rb, line 144
def each_name(address)
  yielded = false
  @resolvers.each {|r|
    r.each_name(address) {|name|
      yield name.to_s
      yielded = true
    }
    return if yielded
  }
end

Looks up the first IP address for name.

# File lib/resolv.rb, line 92
def getaddress(name)
  each_address(name) {|address| return address}
  raise ResolvError.new("no address for #{name}")
end

Looks up all IP address for name.

# File lib/resolv.rb, line 100
def getaddresses(name)
  ret = []
  each_address(name) {|address| ret << address}
  return ret
end

Looks up the hostname of address.

# File lib/resolv.rb, line 127
def getname(address)
  each_name(address) {|name| return name}
  raise ResolvError.new("no name for #{address}")
end

Looks up all hostnames for address.

# File lib/resolv.rb, line 135
def getnames(address)
  ret = []
  each_name(address) {|name| ret << name}
  return ret
end