Class: Net::DNS::RR

Inherits:
Object
  • Object
show all
Includes:
Names
Defined in:
lib/net/dns/rr.rb,
lib/net/dns/rr/a.rb,
lib/net/dns/rr/mr.rb,
lib/net/dns/rr/mx.rb,
lib/net/dns/rr/ns.rb,
lib/net/dns/rr/ptr.rb,
lib/net/dns/rr/soa.rb,
lib/net/dns/rr/srv.rb,
lib/net/dns/rr/txt.rb,
lib/net/dns/rr/aaaa.rb,
lib/net/dns/rr/null.rb,
lib/net/dns/rr/cname.rb,
lib/net/dns/rr/hinfo.rb,
lib/net/dns/rr/types.rb,
lib/net/dns/rr/classes.rb

Overview

Net::DNS::RR - DNS Resource Record class

The Net::DNS::RR is the base class for DNS Resource Record (RR) objects. A RR is a pack of data that represents resources for a DNS zone. The form in which this data is shows can be drawed as follow:

"name  ttl  class  type  data"

The name is the name of the resource, like an canonical name for an A record (internet ip address). The ttl is the time to live, expressed in seconds. type and class are respectively the type of resource (A for ip addresses, NS for nameservers, and so on) and the class, which is almost always IN, the Internet class. At the end, data is the value associated to the name for that particular type of resource record. An example:

# A record for IP address
"www.example.com  86400  IN  A  172.16.100.1"

# NS record for name server
"www.example.com  86400  IN  NS  ns.example.com"

A new RR object can be created in 2 ways: passing a string such the ones above, or specifying each field as the pair of an hash. See the Net::DNS::RR.new method for details.

Direct Known Subclasses

A, AAAA, CNAME, HINFO, MR, MX, NS, NULL, PTR, SOA, SRV, TXT

Defined Under Namespace

Classes: A, AAAA, CNAME, Classes, DataError, Error, HINFO, MR, MX, NS, NULL, PTR, SOA, SRV, TXT, Types

Constant Summary collapse

RR_REGEXP =

Regexp matching an RR string

Regexp.new("^\\s*(\\S+)\\s*(\\d+)?\\s+(" +
Net::DNS::RR::Classes.regexp +
"|CLASS\\d+)?\\s*(" +
Net::DNS::RR::Types.regexp +
"|TYPE\\d+)?\\s*(.*)$", Regexp::IGNORECASE)
RRFIXEDSZ =

Dimension of the sum of class, type, TTL and rdlength fields in a RR portion of the packet, in bytes

10

Constants included from Names

Names::INT16SZ

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Names

#dn_comp, #dn_expand, #names_array, #pack_name, #valid?

Constructor Details

#initialize(arg) ⇒ RR

Create a new instance of Net::DNS::RR class, or an instance of any of the subclass of the appropriate type.

Argument can be a string or an hash. With a sting, we can pass a RR resource record in the canonical format:

a     = Net::DNS::RR.new("foo.example.com. 86400 A 10.1.2.3")
mx    = Net::DNS::RR.new("example.com. 7200 MX 10 mailhost.example.com.")
cname = Net::DNS::RR.new("www.example.com 300 IN CNAME www1.example.com")
txt   = Net::DNS::RR.new('baz.example.com 3600 HS TXT "text record"')

Incidentally, a, mx, cname and txt objects will be instances of respectively Net::DNS::RR::A, Net::DNS::RR::MX, Net::DNS::RR::CNAME and Net::DNS::RR::TXT classes.

The name and RR data are required; all other informations are optional. If omitted, the TTL defaults to 10800, type default to A and the RR class defaults to IN. Omitting the optional fields is useful for creating the empty RDATA sections required for certain dynamic update operations. All names must be fully qualified. The trailing dot (.) is optional.

The preferred method is however passing an hash with keys and values:

rr = Net::DNS::RR.new(
              :name    => "foo.example.com",
              :ttl     => 86400,
              :cls     => "IN",
              :type    => "A",
              :address => "10.1.2.3"
      )

rr = Net::DNS::RR.new(
              :name => "foo.example.com",
              :rdata => "10.1.2.3"
      )

Name and data are required; all the others fields are optionals like we’ve seen before. The data field can be specified either with the right name of the resource (:address in the example above) or with the generic key :rdata. Consult documentation to find the exact name for the resource in each subclass.



105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/net/dns/rr.rb', line 105

def initialize(arg)
  instance = case arg
  when String
    new_from_string(arg)
  when Hash
    new_from_hash(arg)
  else
    raise ArgumentError, "Invalid argument, must be a RR string or an hash of values"
  end

  if @type.to_s == "ANY"
    @cls = Net::DNS::RR::Classes.new("IN")
  end

  build_pack
  set_type

  instance
end

Instance Attribute Details

#nameObject (readonly)

Returns the value of attribute name.



150
151
152
# File 'lib/net/dns/rr.rb', line 150

def name
  @name
end

#rdataObject (readonly)

Data belonging to that appropriate class, not to be used (use real accessors instead)



170
171
172
# File 'lib/net/dns/rr.rb', line 170

def rdata
  @rdata
end

#ttlObject (readonly)

Returns the value of attribute ttl.



152
153
154
# File 'lib/net/dns/rr.rb', line 152

def ttl
  @ttl
end

Class Method Details

.parse(data) ⇒ Object

Return a new RR object of the correct type (like Net::DNS::RR::A if the type is A) from a binary string, usually obtained from network stream.

This method is used when parsing a binary packet by the Packet class.



132
133
134
135
136
# File 'lib/net/dns/rr.rb', line 132

def self.parse(data)
  o = allocate
  obj, offset = o.send(:new_from_binary, data, 0)
  obj
end

.parse_packet(data, offset) ⇒ Object

Same as RR.parse, but takes an entire packet binary data to perform name expansion. Default when analizing a packet just received from a network stream.

Return an instance of appropriate class and the offset pointing at the end of the data parsed.



145
146
147
148
# File 'lib/net/dns/rr.rb', line 145

def self.parse_packet(data, offset)
  o = allocate
  o.send(:new_from_binary, data, offset)
end

Instance Method Details

#clsObject

Class accessor



160
161
162
# File 'lib/net/dns/rr.rb', line 160

def cls
  @cls.to_s
end

#comp_data(offset, compnames) ⇒ Object

Return the RR object in binary data format, suitable for using in network streams, with names compressed. Must pass as arguments the offset inside the packet and an hash of compressed names.

This method is to be used in other classes and is not intended for user space programs.

TO FIX in one of the future releases



193
194
195
196
197
198
# File 'lib/net/dns/rr.rb', line 193

def comp_data(offset, compnames)
  str, offset, names = dn_comp(@name, offset, compnames)
  str    += [@type.to_i, @cls.to_i, ttl, @rdlength].pack("n2 N n")
  offset += Net::DNS::RRFIXEDSZ
  [str, offset, names]
end

#dataObject

Return the RR object in binary data format, suitable for using in network streams.

raw_data = rr.data
puts "RR is #{raw_data.size} bytes long"


178
179
180
181
# File 'lib/net/dns/rr.rb', line 178

def data
  str = pack_name(@name)
  str + [@type.to_i, @cls.to_i, ttl, @rdlength].pack("n2 N n") + get_data
end

#inspectObject

Returns a human readable representation of this record. The value is always a String.

mx = Net::DNS::RR.new("example.com. 7200 MX 10 mailhost.example.com.")
#=> example.com.            7200    IN      MX      10 mailhost.example.com.


206
207
208
# File 'lib/net/dns/rr.rb', line 206

def inspect
  to_s
end

#to_aObject

Returns an Array with all the attributes for this record.

mx = Net::DNS::RR.new("example.com. 7200 MX 10 mailhost.example.com.")
mx.to_a
#=> ["example.com.", 7200, "IN", "MX", "10 mailhost.example.com."]


231
232
233
# File 'lib/net/dns/rr.rb', line 231

def to_a
  [name, ttl, cls.to_s, type.to_s, value]
end

#to_sObject

Returns a String representation of this record.

mx = Net::DNS::RR.new("example.com. 7200 MX 10 mailhost.example.com.")
mx.to_s
#=> "example.com.            7200    IN      MX      10 mailhost.example.com."


216
217
218
219
220
221
222
223
# File 'lib/net/dns/rr.rb', line 216

def to_s
  items = to_a.map(&:to_s)
  if @name.size < 24
    items.pack("A24 A8 A8 A8 A*")
  else
    items.join("   ")
  end.to_s
end

#typeObject

Type accessor



155
156
157
# File 'lib/net/dns/rr.rb', line 155

def type
  @type.to_s
end

#valueObject



164
165
166
# File 'lib/net/dns/rr.rb', line 164

def value
  get_inspect
end