class Dnsruby::RR::GPOS

Class for Geographic Position (GPOS) resource records.

RFC 1712 (www.ietf.org/rfc/rfc1712.txt)

Constants

ClassValue
REQUIRED_KEYS
TypeValue

Attributes

altitude[RW]
latitude[RW]
longitude[RW]

Public Class Methods

build_rdata(longitude, latitude, altitude) click to toggle source
# File lib/dnsruby/resource/GPOS.rb, line 106
def self.build_rdata(longitude, latitude, altitude)
  binary_string = ''.force_encoding('ASCII-8BIT')

  binary_string << longitude.length.chr
  binary_string << longitude
  binary_string << latitude.length.chr
  binary_string << latitude
  binary_string << altitude.length.chr
  binary_string << altitude
  binary_string
end
decode_rdata(message) click to toggle source
# File lib/dnsruby/resource/GPOS.rb, line 118
def self.decode_rdata(message)
  rdata_s = message.get_bytes.clone

  index = 0

  long_len = rdata_s[index].ord;         index += 1
  longitude = rdata_s[index, long_len];  index += long_len

  lat_len = rdata_s[index].ord;          index += 1
  latitude = rdata_s[index, lat_len];    index += lat_len

  alt_len = rdata_s[index].ord;          index += 1
  altitude = rdata_s[index, alt_len];    index += alt_len

  validate_latitude(latitude)
  validate_longitude(longitude)

  new([longitude, latitude, altitude].join(' '))  # e.g. "10.0 20.0 30.0"
end
new_from_data(*gpos_params_data) click to toggle source

Create an instance from an ordered parameter list, e.g.: EXAMPLE_GPOS_DATA = begin

rdata = RR::GPOS.build_rdata(EXAMPLE_LONGITUDE, EXAMPLE_LATITUDE, EXAMPLE_ALTITUDE)
[EXAMPLE_HOSTNAME, Types::GPOS, Classes::IN, EXAMPLE_TTL, rdata.length, rdata, 0]

end self.from_data(*EXAMPLE_GPOS_DATA)

# File lib/dnsruby/resource/GPOS.rb, line 58
def self.new_from_data(*gpos_params_data)
  RR.new_from_data(*gpos_params_data)
end
new_from_hash(gpos_params_hash) click to toggle source

Create an instance from a hash of parameters, e.g.:

{
   name:       'techhumans.com',
   type:       Types::GPOS,
   ttl:        1234,
   longitude:  '10.0',
   latitude:   '20.0',
   altitude:   '30.0',
}

Since the type is assumed to be GPOS, it will be assigned automatially, and any other value will be overwritten. Therefore, having it present in the hash is not necessary.

# File lib/dnsruby/resource/GPOS.rb, line 39
def self.new_from_hash(gpos_params_hash)
  gpos_params_hash[:type] = Types::GPOS
  RR.new_from_hash(gpos_params_hash)
end
new_from_string(gpos_params_string) click to toggle source

Create an instance from a string containing parameters, e.g.: 'a.dnsruby.com. 10800 IN GPOS 10.0 20.0 30.0'

# File lib/dnsruby/resource/GPOS.rb, line 47
def self.new_from_string(gpos_params_string)
  RR.new_from_string(gpos_params_string)
end
valid_float?(object) click to toggle source
# File lib/dnsruby/resource/GPOS.rb, line 150
def self.valid_float?(object)
  begin
    Float(object)
    true
  rescue
    false
  end
end
validate_float_in_range(label, object, bound) click to toggle source
# File lib/dnsruby/resource/GPOS.rb, line 159
def self.validate_float_in_range(label, object, bound)
  number = Float(object)
  valid_range = (-Float(bound)..Float(bound))
  unless valid_range.include?(number)
    raise "Value of #{label} (#{number}) was not in the range #{valid_range}."
  end
end
validate_floats(init_data) click to toggle source
# File lib/dnsruby/resource/GPOS.rb, line 175
def self.validate_floats(init_data)
  bad_float_keys = REQUIRED_KEYS.reject { |key| valid_float?(init_data[key]) }
  unless bad_float_keys.empty?
    message = "The following key value pair(s) do not have valid floats or float strings:\n"
    bad_float_keys.each do |key|
      message << "%:-12.12s => %s\n" % [init_data[key]]
    end
    raise message
  end

  validate_longitude(init_data[:longitude])
  validate_latitude(init_data[:latitude])
end
validate_latitude(value) click to toggle source
# File lib/dnsruby/resource/GPOS.rb, line 171
def self.validate_latitude(value)
  validate_float_in_range('latitude',  value, 90)
end
validate_longitude(value) click to toggle source
# File lib/dnsruby/resource/GPOS.rb, line 167
def self.validate_longitude(value)
  validate_float_in_range('longitude', value, 180)
end

Public Instance Methods

build_rdata() click to toggle source
# File lib/dnsruby/resource/GPOS.rb, line 102
def build_rdata
  self.class.build_rdata(longitude, latitude, altitude)
end
encode_rdata(msg, _canonical) click to toggle source
# File lib/dnsruby/resource/GPOS.rb, line 98
def encode_rdata(msg, _canonical)
  msg.put_bytes(build_rdata)
end
from_data(array) click to toggle source
# File lib/dnsruby/resource/GPOS.rb, line 63
def from_data(array)
  unless array.size == 3
    raise "Array size for creating GPOS record must be 3 (long, lat, alt). Array was:\n#{array.inspect}"
  end

  from_hash({
                longitude: array[0],
                latitude:  array[1],
                altitude:  array[2]
            })
end
from_hash(init_data) click to toggle source
# File lib/dnsruby/resource/GPOS.rb, line 75
def from_hash(init_data)
  self.class.validate_floats(init_data)
  @longitude = init_data[:longitude].to_s
  @latitude  = init_data[:latitude].to_s
  @altitude  = init_data[:altitude].to_s
  self.rdata = build_rdata
  self
end
from_string(string) click to toggle source
# File lib/dnsruby/resource/GPOS.rb, line 84
def from_string(string)
  # Convert commas to spaces, then split by spaces:
  from_data(string.gsub(',', ' ').split(' '))
end
owner() click to toggle source

'name' is used in the RR superclass, but 'owner' is the term referred to in the RFC, so we'll make owner an alias for name.

# File lib/dnsruby/resource/GPOS.rb, line 140
def owner
  name
end
owner=(owner_string) click to toggle source

'name' is used in the RR superclass, but 'owner' is the term referred to in the RFC, so we'll make owner an alias for name.

# File lib/dnsruby/resource/GPOS.rb, line 146
def owner=(owner_string)
  self.name = owner_string
end
rdata_to_string() click to toggle source

From the RFC:

GPOS has the following format:

<owner> <ttl> <class> GPOS <longitude> <latitude> <altitude>

We handle the rdata, the RR superclass does the rest.

# File lib/dnsruby/resource/GPOS.rb, line 94
def rdata_to_string
  [longitude, latitude, altitude].join(' ')
end