Class: Net::DNS::RR
- Inherits:
-
Object
- Object
- Net::DNS::RR
- 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.
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
Instance Attribute Summary collapse
-
#name ⇒ Object
readonly
Returns the value of attribute name.
-
#rdata ⇒ Object
readonly
Data belonging to that appropriate class, not to be used (use real accessors instead).
-
#ttl ⇒ Object
readonly
Returns the value of attribute ttl.
Class Method Summary collapse
-
.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.
-
.parse_packet(data, offset) ⇒ Object
Same as RR.parse, but takes an entire packet binary data to perform name expansion.
Instance Method Summary collapse
-
#cls ⇒ Object
Class accessor.
-
#comp_data(offset, compnames) ⇒ Object
Return the RR object in binary data format, suitable for using in network streams, with names compressed.
-
#data ⇒ Object
Return the RR object in binary data format, suitable for using in network streams.
-
#initialize(arg) ⇒ RR
constructor
Create a new instance of Net::DNS::RR class, or an instance of any of the subclass of the appropriate type.
-
#inspect ⇒ Object
Returns a human readable representation of this record.
-
#to_a ⇒ Object
Returns an Array with all the attributes for this record.
-
#to_s ⇒ Object
Returns a String representation of this record.
-
#type ⇒ Object
Type accessor.
- #value ⇒ Object
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
#name ⇒ Object (readonly)
Returns the value of attribute name.
150 151 152 |
# File 'lib/net/dns/rr.rb', line 150 def name @name end |
#rdata ⇒ Object (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 |
#ttl ⇒ Object (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
#cls ⇒ Object
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 |
#data ⇒ Object
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 |
#inspect ⇒ Object
206 207 208 |
# File 'lib/net/dns/rr.rb', line 206 def inspect to_s end |
#to_a ⇒ Object
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_s ⇒ Object
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 |
#type ⇒ Object
Type accessor
155 156 157 |
# File 'lib/net/dns/rr.rb', line 155 def type @type.to_s end |
#value ⇒ Object
164 165 166 |
# File 'lib/net/dns/rr.rb', line 164 def value get_inspect end |