class Dnsruby::RRSet

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

Attributes

num_sigs[R]

The number of RRSIGs stored in this RRSet

Public Class Methods

new(rrs = []) click to toggle source
# 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
new_from_string(string) click to toggle source
# 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

Public Instance Methods

<=>(other) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# File lib/dnsruby/resource/RRSet.rb, line 147
def [](index)
  return @rrs[index]
end
add(rin, do_clone = true) click to toggle source

Add the RR to this RRSet Takes a copy of the RR by default. To suppress this, pass false as the second parameter.

# 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) click to toggle source

Delete the RR from this RRSet

# File lib/dnsruby/resource/RRSet.rb, line 139
def delete(rr)
  @rrs.delete(rr)
end
each() { |rr| ... } click to toggle source
# File lib/dnsruby/resource/RRSet.rb, line 142
def each
  @rrs.each do |rr|
    yield rr
  end
end
klass() click to toggle source

Return the klass of this RRSet

# File lib/dnsruby/resource/RRSet.rb, line 158
def klass
  return @rrs[0].klass
end
length() click to toggle source
# File lib/dnsruby/resource/RRSet.rb, line 186
def length
  return @rrs.length
end
name() click to toggle source
# File lib/dnsruby/resource/RRSet.rb, line 172
def name
  if (@rrs[0])
    return @rrs[0].name
  else
    return nil
  end
end
rrs() click to toggle source

The RRs (not RRSIGs) stored in this RRSet

# File lib/dnsruby/resource/RRSet.rb, line 31
def rrs
  return @rrs[0, @rrs.length-@num_sigs]
end
sigs() click to toggle source
# File lib/dnsruby/resource/RRSet.rb, line 27
def sigs
  return @rrs[@rrs.length-@num_sigs, @num_sigs]
end
sort_canonical() click to toggle source
# 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() click to toggle source
# File lib/dnsruby/resource/RRSet.rb, line 179
def to_s
  ret = ""
  each {|rec|
    ret += rec.to_s + "\n"
  }
  return ret
end
ttl() click to toggle source

Return the ttl of this RRSet

# File lib/dnsruby/resource/RRSet.rb, line 162
def ttl
  return @rrs[0].ttl
end
ttl=(ttl) click to toggle source
# File lib/dnsruby/resource/RRSet.rb, line 165
def ttl=(ttl)
  [rrs, sigs].each {|rrs|
    rrs.each {|rr|
      rr.ttl = ttl
    }
  }
end
type() click to toggle source

Return the type of this RRSet

# File lib/dnsruby/resource/RRSet.rb, line 151
def type
  if (@rrs[0])
    return @rrs[0].type
  end
  return nil
end