Class: Dnsruby::RRSet

Inherits:
Object
  • Object
show all
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

Class Method Summary collapse

Instance Method Summary collapse

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_sigsObject (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

.new_from_string(string) ⇒ Object



37
38
39
40
41
42
# File 'lib/Dnsruby/resource/resource.rb', line 37

def self.new_from_string(string)
  rr_strings = string.split("\n")
  rrs = rr_strings.map { |s| Dnsruby::RR.new_from_string(s) }

  Dnsruby::RRSet.new(rrs)
end

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

#eachObject



158
159
160
161
162
# File 'lib/Dnsruby/resource/resource.rb', line 158

def each
  @rrs.each do |rr|
    yield rr
  end
end

#klassObject

Return the klass of this RRSet



174
175
176
# File 'lib/Dnsruby/resource/resource.rb', line 174

def klass
  return @rrs[0].klass
end

#lengthObject



202
203
204
# File 'lib/Dnsruby/resource/resource.rb', line 202

def length
  return @rrs.length
end

#nameObject



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

#rrsObject

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

#sigsObject

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_canonicalObject



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_sObject



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

#ttlObject

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

#typeObject

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