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 55
def self.each_address(name, &block)
  DefaultResolver.each_address(name, &block)
end

Iterates over all hostnames for address.

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

Looks up all IP address for name.

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

Looks up the hostname of address.

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

Looks up all hostnames for address.

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

Creates a new Resolv using resolvers.

If resolvers is not given, a hash, or nil, uses a Hosts resolver and and a DNS resolver. If resolvers is a hash, uses the hash as configuration for the DNS resolver.

# File lib/resolv.rb, line 87
def initialize(resolvers=(arg_not_set = true; nil), use_ipv6: (keyword_not_set = true; nil))
  if !keyword_not_set && !arg_not_set
    warn "Support for separate use_ipv6 keyword is deprecated, as it is ignored if an argument is provided. Do not provide a positional argument if using the use_ipv6 keyword argument.", uplevel: 1
  end

  @resolvers = case resolvers
  when Hash, nil
    [Hosts.new, DNS.new(DNS::Config.default_config_hash.merge(resolvers || {}))]
  else
    resolvers
  end
end

Public Instance Methods

Iterates over all IP addresses for name.

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

Looks up the hostname of address.

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