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