class PacketGen::Header::DNS::RR

DNS Ressource Record @author Sylvain Daubert

Public Class Methods

new(dns, options={}) click to toggle source

@param [DNS] dns @param [Hash] options @option options [String] :name domain as a dotted string @option options [Integer,String] :type see {TYPES}. Default to +'A'+ @option options [Integer,String] :rrclass see {CLASSES}. Default to +'IN'+ @option options [Integer] :ttl @option options [Integer] :rdlength if not provided, automatically set

from +:rdata+ length

@option options [String] :rdata

Calls superclass method PacketGen::Header::DNS::Question::new
# File lib/packetgen/header/dns/rr.rb, line 36
def initialize(dns, options={})
  super
  return unless options[:rdata] && options[:rdlength].nil?

  self.rdata = options[:rdata]
end

Public Instance Methods

human_rdata() click to toggle source

Get human readable rdata @return [String]

# File lib/packetgen/header/dns/rr.rb, line 55
def human_rdata
  str = self[:rdata].inspect

  # Need to mask: mDNS uses leftmost bit as a flag (CACHE FLUSH)
  if self.rrclass & 0x7fff == CLASSES['IN']
    case type
    when TYPES['A'], TYPES['AAAA']
      str = IPAddr.new_ntoh(self[:rdata]).to_s
    end
  end

  name = Name.new
  name.dns = self[:name].dns
  case type
  when TYPES['NS'], TYPES['PTR'], TYPES['CNAME']
    str = name.read(self[:rdata]).to_human
  when TYPES['SOA']
    mname = name.read(self[:rdata]).dup
    rname = name.read(self[:rdata][mname.sz..-1])
    serial = Types::Int32.new.read(self[:rdata][mname.sz + rname.sz, 4])
    refresh = Types::Int32.new.read(self[:rdata][mname.sz + rname.sz + 4, 4])
    retryi = Types::Int32.new.read(self[:rdata][mname.sz + rname.sz + 8, 4])
    expire = Types::Int32.new.read(self[:rdata][mname.sz + rname.sz + 12, 4])
    minimum = Types::Int32.new.read(self[:rdata][mname.sz + rname.sz + 16, 4])
    str = "#{mname.to_human} #{rname.to_human} #{serial.to_i} #{refresh.to_i} " \
          "#{retryi.to_i} #{expire.to_i} #{minimum.to_i}"
  when TYPES['MX']
    pref = Types::Int16.new.read(self[:rdata][0, 2])
    exchange = name.read(self[:rdata][2..-1]).to_human
    str = '%u %s' % [pref.to_i, exchange]
  when TYPES['SRV']
    priority = Types::Int16.new.read(self[:rdata][0, 2])
    weight = Types::Int16.new.read(self[:rdata][2, 2])
    port = Types::Int16.new.read(self[:rdata][4, 2])
    target = name.read(self[:rdata][6, self[:rdata].size]).to_human
    str = "#{priority.to_i} #{weight.to_i} #{port.to_i} #{target}"
  end

  str
end
human_rrclass() click to toggle source

Get human readable class @return [String]

# File lib/packetgen/header/dns/rr.rb, line 98
def human_rrclass
  if self[:name].dns.is_a? MDNS
    str = self.class::CLASSES.key(self.rrclass & 0x7fff) || '0x%04x' % (self.rrclass & 0x7fff)
    str += ' CACHE-FLUSH' if (self.rrclass & 0x8000).positive?
    str
  else
    self.class::CLASSES.key(self.rrclass) || '0x%04x' % self.rrclass
  end
end
rdata=(data) click to toggle source

Set rdata and rdlength from data @param [String] data @return [void]

# File lib/packetgen/header/dns/rr.rb, line 48
def rdata=(data)
  self[:rdlength].read data.size
  self[:rdata].read data
end
to_human() click to toggle source

@return [String]

# File lib/packetgen/header/dns/rr.rb, line 109
def to_human
  "#{human_type} #{human_rrclass} #{name} TTL #{ttl} #{human_rdata}"
end