Class: Dnsruby::RRSet
- Inherits:
-
Object
- Object
- Dnsruby::RRSet
- Includes:
- Comparable
- Defined in:
- lib/Dnsruby/resource/resource.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.
29 30 31 32 33 34 35 36 |
# File 'lib/Dnsruby/resource/resource.rb', line 29 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
28 29 30 |
# File 'lib/Dnsruby/resource/resource.rb', line 28 def num_sigs @num_sigs end |
Class Method Details
Instance Method Details
#<=>(other) ⇒ Object
111 112 113 114 115 116 117 118 119 |
# File 'lib/Dnsruby/resource/resource.rb', line 111 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
139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
# File 'lib/Dnsruby/resource/resource.rb', line 139 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
163 164 165 |
# File 'lib/Dnsruby/resource/resource.rb', line 163 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.
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
# File 'lib/Dnsruby/resource/resource.rb', line 72 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
155 156 157 |
# File 'lib/Dnsruby/resource/resource.rb', line 155 def delete(rr) @rrs.delete(rr) end |
#each ⇒ Object
158 159 160 161 162 |
# File 'lib/Dnsruby/resource/resource.rb', line 158 def each @rrs.each do |rr| yield rr end end |
#klass ⇒ Object
Return the klass of this RRSet
174 175 176 |
# File 'lib/Dnsruby/resource/resource.rb', line 174 def klass return @rrs[0].klass end |
#length ⇒ Object
202 203 204 |
# File 'lib/Dnsruby/resource/resource.rb', line 202 def length return @rrs.length end |
#name ⇒ Object
188 189 190 191 192 193 194 |
# File 'lib/Dnsruby/resource/resource.rb', line 188 def name if (@rrs[0]) return @rrs[0].name else return nil end end |
#privateAdd(r) ⇒ Object
:nodoc:
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
# File 'lib/Dnsruby/resource/resource.rb', line 50 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
47 48 49 |
# File 'lib/Dnsruby/resource/resource.rb', line 47 def rrs return @rrs[0, @rrs.length-@num_sigs] end |
#sigs ⇒ Object
The RRSIGs stored with this RRSet
43 44 45 |
# File 'lib/Dnsruby/resource/resource.rb', line 43 def sigs return @rrs[@rrs.length-@num_sigs, @num_sigs] end |
#sort_canonical ⇒ Object
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
# File 'lib/Dnsruby/resource/resource.rb', line 121 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
195 196 197 198 199 200 201 |
# File 'lib/Dnsruby/resource/resource.rb', line 195 def to_s ret = "" each {|rec| ret += rec.to_s + "\n" } return ret end |
#ttl ⇒ Object
Return the ttl of this RRSet
178 179 180 |
# File 'lib/Dnsruby/resource/resource.rb', line 178 def ttl return @rrs[0].ttl end |
#ttl=(ttl) ⇒ Object
181 182 183 184 185 186 187 |
# File 'lib/Dnsruby/resource/resource.rb', line 181 def ttl=(ttl) [rrs, sigs].each {|rrs| rrs.each {|rr| rr.ttl = ttl } } end |
#type ⇒ Object
Return the type of this RRSet
167 168 169 170 171 172 |
# File 'lib/Dnsruby/resource/resource.rb', line 167 def type if (@rrs[0]) return @rrs[0].type end return nil end |