Class: PacketGen::Header::DNS::RR

Inherits:
Question show all
Defined in:
lib/packetgen/header/dns/rr.rb

Overview

DNS Ressource Record

Since:

  • 1.3.0

Direct Known Subclasses

OPT

Constant Summary

Constants inherited from Question

Question::CLASSES, Question::TYPES

Instance Attribute Summary collapse

Attributes inherited from Question

#name, #rrclass, #type

Instance Method Summary collapse

Methods inherited from Question

#human_type, #type?

Methods inherited from Types::Fields

#[], #[]=, #bits_on, define_bit_fields_on, define_field, define_field_after, define_field_before, #fields, fields, inherited, #inspect, #offset_of, #optional?, #optional_fields, #present?, #read, remove_bit_fields_on, remove_field, #sz, #to_h, #to_s, update_field

Constructor Details

#initialize(dns, options = {}) ⇒ RR

Returns a new instance of RR.

Parameters:

  • dns (DNS)
  • options (Hash) (defaults to: {})

Options Hash (options):

  • :name (String)

    domain as a dotted string

  • :type (Integer, String)

    see Question::TYPES. Default to ‘A’

  • :rrclass (Integer, String)

    see Question::CLASSES. Default to ‘IN’

  • :ttl (Integer)
  • :rdlength (Integer)

    if not provided, automatically set from :rdata length

  • :rdata (String)

Since:

  • 1.3.0



36
37
38
39
40
41
# 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

Instance Attribute Details

#rdataTypes::String

Returns:



24
25
# File 'lib/packetgen/header/dns/rr.rb', line 24

define_field :rdata, Types::String,
builder: ->(rr, t) { t.new(length_from: rr[:rdlength]) }

#rdlengthInteger

16-bit #rdata length

Returns:

  • (Integer)


21
# File 'lib/packetgen/header/dns/rr.rb', line 21

define_field :rdlength, Types::Int16

#ttlInteger

32-bit time to live

Returns:

  • (Integer)


17
# File 'lib/packetgen/header/dns/rr.rb', line 17

define_field :ttl, Types::Int32

Instance Method Details

#human_rdataString

Get human readable rdata

Returns:

  • (String)

Since:

  • 1.3.0



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# 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_rrclassString

Get human readable class

Returns:

  • (String)

Since:

  • 1.3.0



98
99
100
101
102
103
104
105
106
# 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 > 0
    str
  else
    self.class::CLASSES.key(self.rrclass) || '0x%04x' % self.rrclass
  end
end

#to_humanString

Returns:

  • (String)

Since:

  • 1.3.0



109
110
111
# File 'lib/packetgen/header/dns/rr.rb', line 109

def to_human
  "#{human_type} #{human_rrclass} #{name} TTL #{ttl} #{human_rdata}"
end