module Net
module DNS
class RR
#
# = IPv4 Address Record (A)
#
# Class for DNS IPv4 Address (A) resource records.
#
# The resource data is an IPv4 (i.e. 32 bit long) address,
# hold in the instance variable +address+.
#
# a = Net::DNS::RR::A.new("localhost.movie.edu. 360 IN A 127.0.0.1")
#
# a = Net::DNS::RR::A.new(:name => "localhost.movie.edu.",
# :ttl => 360,
# :cls => Net::DNS::IN,
# :type => Net::DNS::A,
# :address => "127.0.0.1" )
#
# When computing binary data to transmit the RR, the RDATA section is an
# Internet address expressed as four decimal numbers separated by dots
# without any embedded space (e.g. "10.2.0.52" or "192.0.5.6").
#
class A < RR
# Gets the current IPv4 address for this record.
#
# Returns an instance of IPAddr.
def address
@address
end
# Assigns a new IPv4 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)
if options.has_key?(:address)
@address = check_address(options[:address])
elsif options.has_key?(:rdata)
@address = check_address(options[:rdata])
else
raise ArgumentError, ":address or :rdata field is mandatory"
end
end
def subclass_new_from_string(str)
@address = check_address(str)
end
def subclass_new_from_binary(data, offset)
a, b, c, d = data.unpack("@#{offset} CCCC")
@address = IPAddr.new("#{a}.#{b}.#{c}.#{d}")
offset + 4
end
def set_type
@type = Net::DNS::RR::Types.new("A")
end
def get_inspect
value
end
def check_address(input)
address = case input
when IPAddr
input
when Integer # Address in numeric form
IPAddr.new(input, Socket::AF_INET) # We know we are IPv4
when String
IPAddr.new(input)
else
raise ArgumentError, "Invalid IP address `#{input}'"
end
if !address.ipv4?
raise(ArgumentError, "Must specify an IPv4 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