Class: PacketGen::Header::DNS::RR
- Inherits:
-
Question
- Object
- Types::Fields
- Base
- 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
Attributes inherited from Base
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
#has_type?, #human_type, #type?
Methods inherited from Base
#added_to_packet, bind, bind_header, calculate_and_set_length, #header_id, inherited, #ip_header, known_headers, #ll_header, #method_name, #parse?, #protocol_name, protocol_name
Methods inherited from Types::Fields
#[], #[]=, #bits_on, #body=, define_bit_fields_on, define_field, define_field_after, define_field_before, delete_field, fields, #fields, #force_binary, inherited, #inspect, #is_optional?, #is_present?, #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 |
# 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
52 53 54 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 |
# File 'lib/packetgen/header/dns/rr.rb', line 52 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
95 96 97 98 99 100 101 102 103 |
# File 'lib/packetgen/header/dns/rr.rb', line 95 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
106 107 108 |
# File 'lib/packetgen/header/dns/rr.rb', line 106 def to_human "#{human_type} #{human_rrclass} #{name} TTL #{ttl} #{human_rdata}" end |