class Puffy::Resolver

DNS resolution class.

Public Instance Methods

resolv(hostname, address_family = nil) click to toggle source

Resolve hostname and return an Array of IPAddr.

@example

Resolver.instance.resolv('localhost')
#=> [#<IPAddr:[::1]>, #<IPAddr:127.0.0.1>]
Resolver.instance.resolv('localhost', :inet)
#=> [#<IPAddr:127.0.0.1>]
Resolver.instance.resolv('localhost', :inet6)
#=> [#<IPAddr:[::1]>]

@param hostname [String] The hostname to resolve @param address_family [Symbol] if set, limit search to address_family, :inet or :inet6 @return [Array<IPAddr>]

# File lib/puffy/resolver.rb, line 24
def resolv(hostname, address_family = nil)
  if hostname.is_a?(IPAddr)
    resolv_ipaddress(hostname, address_family)
  else
    resolv_hostname(hostname, address_family)
  end
end

Private Instance Methods

filter_af(address, address_family) click to toggle source
# File lib/puffy/resolver.rb, line 38
def filter_af(address, address_family)
  return [] if address_family && !match_af?(address, address_family)

  [address]
end
match_af?(address, address_family) click to toggle source
# File lib/puffy/resolver.rb, line 44
def match_af?(address, address_family)
  (address.ipv6? && address_family == :inet6) ||
    (address.ipv4? && address_family == :inet)
end
resolv_hostname(hostname, address_family) click to toggle source
# File lib/puffy/resolver.rb, line 49
def resolv_hostname(hostname, address_family)
  result = []
  result += resolv_hostname_ipv6(hostname) if address_family.nil? || address_family == :inet6
  result += resolv_hostname_ipv4(hostname) if address_family.nil? || address_family == :inet
  raise "\"#{hostname}\" does not resolve to any valid IP#{@af_str[address_family]} address." if result.empty?

  result
end
resolv_hostname_ipv4(hostname) click to toggle source
# File lib/puffy/resolver.rb, line 62
def resolv_hostname_ipv4(hostname)
  resolv_hostname_record(hostname, Resolv::DNS::Resource::IN::A)
end
resolv_hostname_ipv6(hostname) click to toggle source
# File lib/puffy/resolver.rb, line 58
def resolv_hostname_ipv6(hostname)
  resolv_hostname_record(hostname, Resolv::DNS::Resource::IN::AAAA)
end
resolv_hostname_record(hostname, record) click to toggle source
# File lib/puffy/resolver.rb, line 66
def resolv_hostname_record(hostname, record)
  @dns.getresources(hostname, record).collect { |r| IPAddr.new(r.address.to_s) }.sort
end
resolv_ipaddress(address, address_family) click to toggle source
# File lib/puffy/resolver.rb, line 34
def resolv_ipaddress(address, address_family)
  filter_af(address, address_family)
end