Class: Dnsruby::RRSet

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

Class Method Summary collapse

Instance Method Summary collapse

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

.new_from_string(string) ⇒ Object



21
22
23
24
25
26
# File 'lib/dnsruby/resource/RRSet.rb', line 21

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



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

#eachObject



142
143
144
145
146
# File 'lib/dnsruby/resource/RRSet.rb', line 142

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

#klassObject

Return the klass of this RRSet



158
159
160
# File 'lib/dnsruby/resource/RRSet.rb', line 158

def klass
  return @rrs[0].klass
end

#lengthObject



186
187
188
# File 'lib/dnsruby/resource/RRSet.rb', line 186

def length
  return @rrs.length
end

#nameObject



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

#rrsObject

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

#sigsObject

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_canonicalObject



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_sObject



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

#ttlObject

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

#typeObject

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