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.

VERSION

Public Class Methods

Iterates over all IP addresses for name.

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

Iterates over all hostnames for address.

# File lib/resolv.rb, line 80
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 45
def self.getaddress(name)
  DefaultResolver.getaddress(name)
end

Looks up all IP address for name.

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

Looks up the hostname of address.

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

Looks up all hostnames for address.

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

Creates a new Resolv using resolvers.

# File lib/resolv.rb, line 87
def initialize(resolvers=nil, use_ipv6: nil)
  @resolvers = resolvers || [Hosts.new, DNS.new(DNS::Config.default_config_hash.merge(use_ipv6: use_ipv6))]
end

Public Instance Methods

Iterates over all IP addresses for name.

# File lib/resolv.rb, line 111
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 146
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 94
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 102
def getaddresses(name)
  ret = []
  each_address(name) {|address| ret << address}
  return ret
end

Looks up the hostname of address.

# File lib/resolv.rb, line 129
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 137
def getnames(address)
  ret = []
  each_name(address) {|name| ret << name}
  return ret
end