module Net
module DNS
class RR
#
# = IPv6 Address Record (AAAA)
#
# Class for DNS IPv6 Address (AAAA) resource records.
#
class AAAA < RR
# Gets the current IPv6 address for this record.
#
# Returns an instance of IPAddr.
attr_reader :address
# Assigns a new IPv6 address to this record, which can be in the
# form of a String or an IPAddr object.
#
# Examples
#
# a.address = "192.168.0.1"
# a.address = IPAddr.new("10.0.0.1")
#
# Returns the new allocated instance of IPAddr.
def address=(string_or_ipaddr)
@address = check_address(string_or_ipaddr)
build_pack
@address
end
# Gets the standardized value for this record,
# represented by the value of address.
#
# Returns a String.
def value
address.to_s
end
private
def subclass_new_from_hash(options)
raise ArgumentError, ":address field is mandatory" unless options.key?(:address)
@address = check_address(options[:address])
end
def subclass_new_from_string(str)
@address = check_address(str)
end
def subclass_new_from_binary(data, offset)
tokens = data.unpack("@#{offset} n8")
@address = IPAddr.new(format("%x:%x:%x:%x:%x:%x:%x:%x", *tokens))
offset + 16
end
def set_type
@type = Net::DNS::RR::Types.new("AAAA")
end
def get_inspect
value
end
def check_address(input)
address = case input
when IPAddr
input
when String
IPAddr.new(input)
else
raise ArgumentError, "Invalid IP address `#{input}'"
end
unless address.ipv6?
raise(ArgumentError, "Must specify an IPv6 address")
end
address
end
def build_pack
@address_pack = @address.hton
@rdlength = @address_pack.size
end
def get_data
@address_pack
end
end
end
end
end