Class: PacketGen::Header::DNS::RR
- Inherits:
-
Question
- Object
- Types::Fields
- Question
- PacketGen::Header::DNS::RR
- Defined in:
- lib/packetgen/header/dns/rr.rb
Overview
DNS Ressource Record
Direct Known Subclasses
Constant Summary
Constants inherited from Question
Question::CLASSES, Question::TYPES
Instance Attribute Summary collapse
- #rdata ⇒ Types::String
-
#rdlength ⇒ Integer
16-bit #rdata length.
-
#ttl ⇒ Integer
32-bit time to live.
Attributes inherited from Question
Instance Method Summary collapse
-
#human_rdata ⇒ String
Get human readable rdata.
-
#human_rrclass ⇒ String
Get human readable class.
-
#initialize(dns, options = {}) ⇒ RR
constructor
A new instance of RR.
- #to_human ⇒ String
Methods inherited from Question
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.
36 37 38 39 40 41 |
# File 'lib/packetgen/header/dns/rr.rb', line 36 def initialize(dns, ={}) super return unless [:rdata] && [:rdlength].nil? self.rdata = [:rdata] end |
Instance Attribute Details
#rdata ⇒ Types::String
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]) } |
#rdlength ⇒ Integer
16-bit #rdata length
21 |
# File 'lib/packetgen/header/dns/rr.rb', line 21 define_field :rdlength, Types::Int16 |
#ttl ⇒ Integer
32-bit time to live
17 |
# File 'lib/packetgen/header/dns/rr.rb', line 17 define_field :ttl, Types::Int32 |
Instance Method Details
#human_rdata ⇒ String
Get human readable rdata
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_rrclass ⇒ String
Get human readable class
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_human ⇒ String
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 |