Class: Dnsruby::RRSet
- Inherits:
-
Object
- Object
- Dnsruby::RRSet
- Includes:
- Comparable
- Defined in:
- lib/dnsruby/resource/RRSet.rb
Overview
RFC2181, section 5 “It is however possible for most record types to exist with the same label, class and type, but with different data. Such a group of records is hereby defined to be a Resource Record Set (RRSet).” This class also stores the RRSIG records which cover the RRSet
Instance Attribute Summary collapse
-
#num_sigs ⇒ Object
readonly
The number of RRSIGs stored in this RRSet.
Class Method Summary collapse
Instance Method Summary collapse
- #<=>(other) ⇒ Object
- #==(other) ⇒ Object
- #[](index) ⇒ Object
-
#add(rin, do_clone = true) ⇒ Object
Add the RR to this RRSet Takes a copy of the RR by default.
-
#delete(rr) ⇒ Object
Delete the RR from this RRSet.
- #each ⇒ Object
-
#initialize(rrs = []) ⇒ RRSet
constructor
A new instance of RRSet.
-
#klass ⇒ Object
Return the klass of this RRSet.
- #length ⇒ Object
- #name ⇒ Object
-
#privateAdd(r) ⇒ Object
:nodoc:.
-
#rrs ⇒ Object
The RRs (not RRSIGs) stored in this RRSet.
-
#sigs ⇒ Object
The RRSIGs stored with this RRSet.
- #sort_canonical ⇒ Object
- #to_s ⇒ Object
-
#ttl ⇒ Object
Return the ttl of this RRSet.
- #ttl=(ttl) ⇒ Object
-
#type ⇒ Object
Return the type of this RRSet.
Constructor Details
#initialize(rrs = []) ⇒ RRSet
Returns a new instance of RRSet.
13 14 15 16 17 18 19 20 |
# File 'lib/dnsruby/resource/RRSet.rb', line 13 def initialize(rrs = []) if (!rrs.instance_of?Array) rrs = [rrs] end @rrs = [] @num_sigs = 0 rrs.each {|rr| add(rr)} end |
Instance Attribute Details
#num_sigs ⇒ Object (readonly)
The number of RRSIGs stored in this RRSet
12 13 14 |
# File 'lib/dnsruby/resource/RRSet.rb', line 12 def num_sigs @num_sigs end |
Class Method Details
Instance Method Details
#<=>(other) ⇒ Object
95 96 97 98 99 100 101 102 103 |
# File 'lib/dnsruby/resource/RRSet.rb', line 95 def <=>(other) # return 1 if ((!other) || !(other.name) || !(other.type)) # return -1 if (!@name) if (name.canonical == other.name.canonical) return type.code <=> other.type.code else return name <=> other.name end end |
#==(other) ⇒ Object
123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
# File 'lib/dnsruby/resource/RRSet.rb', line 123 def ==(other) return false unless other.instance_of?RRSet return false if (other.sigs.length != self.sigs.length) return false if (other.rrs.length != self.rrs.length) return false if (other.ttl != self.ttl) otherrrs = other.rrs self.rrs.each {|rr| return false if (!otherrrs.include?rr) } othersigs= other.sigs self.sigs.each {|sig| return false if (!othersigs.include?sig) } return true end |
#[](index) ⇒ Object
147 148 149 |
# File 'lib/dnsruby/resource/RRSet.rb', line 147 def [](index) return @rrs[index] end |
#add(rin, do_clone = true) ⇒ Object
Add the RR to this RRSet Takes a copy of the RR by default. To suppress this, pass false as the second parameter.
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 |
# File 'lib/dnsruby/resource/RRSet.rb', line 56 def add(rin, do_clone = true) if (rin.instance_of?RRSet) ret = false [rin.rrs, rin.sigs].each {|rr| ret = add(rr)} return ret end # r = RR.create(r.to_s) # clone the record r = nil if do_clone r = rin.clone else r = rin end if (@rrs.size() == 0) # && !(r.type == Types.RRSIG)) return privateAdd(r) end # Check the type, klass and ttl are correct first = @rrs[0] if (!r.sameRRset(first)) return false # raise ArgumentError.new("record does not match rrset") end if (!(r.type == Types::RRSIG) && (!(first.type == Types::RRSIG))) if (r.ttl != first.ttl) # RFC2181, section 5.2 if (r.ttl > first.ttl) r.ttl=(first.ttl) else @rrs.each do |rr| rr.ttl = r.ttl end end end end return privateAdd(r) # return true end |
#delete(rr) ⇒ Object
Delete the RR from this RRSet
139 140 141 |
# File 'lib/dnsruby/resource/RRSet.rb', line 139 def delete(rr) @rrs.delete(rr) end |
#each ⇒ Object
142 143 144 145 146 |
# File 'lib/dnsruby/resource/RRSet.rb', line 142 def each @rrs.each do |rr| yield rr end end |
#klass ⇒ Object
Return the klass of this RRSet
158 159 160 |
# File 'lib/dnsruby/resource/RRSet.rb', line 158 def klass return @rrs[0].klass end |
#length ⇒ Object
186 187 188 |
# File 'lib/dnsruby/resource/RRSet.rb', line 186 def length return @rrs.length end |
#name ⇒ Object
172 173 174 175 176 177 178 |
# File 'lib/dnsruby/resource/RRSet.rb', line 172 def name if (@rrs[0]) return @rrs[0].name else return nil end end |
#privateAdd(r) ⇒ Object
:nodoc:
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/dnsruby/resource/RRSet.rb', line 34 def privateAdd(r) #:nodoc: if @rrs.include?r return true end new_pos = @rrs.length - @num_sigs if ((@num_sigs == @rrs.length) && @num_sigs > 0) # if we added RRSIG first if (((r.type != @rrs.last.type_covered) && (r.type != Types.RRSIG))|| ((r.type == Types.RRSIG) && (r.type_covered != @rrs.last.type_covered))) return false end end if (r.type == Types::RRSIG) new_pos = @rrs.length @num_sigs += 1 end @rrs.insert(new_pos, r) return true end |
#rrs ⇒ Object
The RRs (not RRSIGs) stored in this RRSet
31 32 33 |
# File 'lib/dnsruby/resource/RRSet.rb', line 31 def rrs return @rrs[0, @rrs.length-@num_sigs] end |
#sigs ⇒ Object
The RRSIGs stored with this RRSet
27 28 29 |
# File 'lib/dnsruby/resource/RRSet.rb', line 27 def sigs return @rrs[@rrs.length-@num_sigs, @num_sigs] end |
#sort_canonical ⇒ Object
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
# File 'lib/dnsruby/resource/RRSet.rb', line 105 def sort_canonical # Make a list, for all the RRs, where each RR contributes # the canonical RDATA encoding canonical_rrs = {} self.rrs.each do |rr| data = MessageEncoder.new {|msg| rr.encode_rdata(msg, true) }.to_s canonical_rrs[data] = rr end return_rrs = RRSet.new canonical_rrs.keys.sort.each { |rdata| return_rrs.add(canonical_rrs[rdata], false) } return return_rrs end |
#to_s ⇒ Object
179 180 181 182 183 184 185 |
# File 'lib/dnsruby/resource/RRSet.rb', line 179 def to_s ret = "" each {|rec| ret += rec.to_s + "\n" } return ret end |
#ttl ⇒ Object
Return the ttl of this RRSet
162 163 164 |
# File 'lib/dnsruby/resource/RRSet.rb', line 162 def ttl return @rrs[0].ttl end |
#ttl=(ttl) ⇒ Object
165 166 167 168 169 170 171 |
# File 'lib/dnsruby/resource/RRSet.rb', line 165 def ttl=(ttl) [rrs, sigs].each {|rrs| rrs.each {|rr| rr.ttl = ttl } } end |
#type ⇒ Object
Return the type of this RRSet
151 152 153 154 155 156 |
# File 'lib/dnsruby/resource/RRSet.rb', line 151 def type if (@rrs[0]) return @rrs[0].type end return nil end |