class FTW::DNS::DNS

A FTW::DNS resolver that uses Socket.gethostbyname() to resolve addresses.

Public Instance Methods

resolve(hostname) click to toggle source

Resolve a hostname.

It will return an array of all known addresses for the host.

# File lib/ftw/dns/dns.rb, line 12
def resolve(hostname)
  official, aliases, family, *addresses = Socket.gethostbyname(hostname)
  # We ignore family, here. Ruby will return v6 *and* v4 addresses in
  # the same gethostbyname() call. It is confusing.
  #
  # Let's just rely entirely on the length of the address string.
  return addresses.collect do |address|
    if address.length == 16
      unpack_v6(address)
    else
      unpack_v4(address)
    end
  end
end

Private Instance Methods

unpack_v4(address) click to toggle source

Unserialize a 4-byte ipv4 address into a human-readable a.b.c.d string

# File lib/ftw/dns/dns.rb, line 28
def unpack_v4(address)
  return address.unpack("C4").join(".")
end
unpack_v6(address) click to toggle source

Unserialize a 16-byte ipv6 address into a human-readable a:b:c:…:d string

# File lib/ftw/dns/dns.rb, line 33
def unpack_v6(address)
  if address.length == 16
    # Unpack 16 bit chunks, convert to hex, join with ":"
    address.unpack("n8").collect { |p| p.to_s(16) } \
      .join(":").sub(/(?:^|:)0:(?:0:)+/, "::")
  else 
    # assume ipv4
    # Per the following sites, "::127.0.0.1" is valid and correct
    # http://en.wikipedia.org/wiki/IPv6#IPv4-mapped_IPv6_addresses
    # http://www.tcpipguide.com/free/t_IPv6IPv4AddressEmbedding.htm
    "::" + unpack_v4(address)
  end
end