class Dns::CatalogZone::Provider::Knot

Public Class Methods

new(setting) click to toggle source
# File lib/dns/catalog_zone/provider/knot.rb, line 130
def initialize(setting)
  @setting = setting
end

Public Instance Methods

make(catalog_zone) click to toggle source
# File lib/dns/catalog_zone/provider/knot.rb, line 133
def make(catalog_zone)
  @output = ''
  @templates = []
  @acls = []
  @remotes = []
  @zones = []
  global_config(catalog_zone)
  zones_config(catalog_zone)
  make_output
end
make_output() click to toggle source
# File lib/dns/catalog_zone/provider/knot.rb, line 144
def make_output
  output_r 'acl:'
  @acls.each do |acl|
    output_r acl.print
  end
  output_r 'remote:'
  @remotes.each do |remote|
    output_r remote.print
  end
  output_r 'template:'
  @templates.each do |template|
    output_r template.print
  end
  output_r 'zone:'
  @zones.each do |zone|
    output_r zone.print
  end
end
reconfig() click to toggle source
# File lib/dns/catalog_zone/provider/knot.rb, line 163
def reconfig
  system("#{control} reload")
end

Private Instance Methods

add_acl(acl) click to toggle source
# File lib/dns/catalog_zone/provider/knot.rb, line 179
def add_acl(acl)
  @acls.push(acl)
end
add_remote(remote) click to toggle source
# File lib/dns/catalog_zone/provider/knot.rb, line 175
def add_remote(remote)
  @remotes.push(remote)
end
add_template(template) click to toggle source
# File lib/dns/catalog_zone/provider/knot.rb, line 171
def add_template(template)
  @templates.push(template)
end
add_zone(zone) click to toggle source
# File lib/dns/catalog_zone/provider/knot.rb, line 183
def add_zone(zone)
  @zones.push(zone)
end
control() click to toggle source
# File lib/dns/catalog_zone/provider/knot.rb, line 168
def control
  @setting['control'] || "knotc"
end
global_config(catalog_zone) click to toggle source
# File lib/dns/catalog_zone/provider/knot.rb, line 195
def global_config(catalog_zone)
  template = Template.new(id: 'catalog-zone')

  add_template(template)
  catalog_zone.masters.each_pair do |label, master|
    output_master(master, template, label)
  end
  catalog_zone.notifies.each_pair do |label, notify|
    output_notify(notify, template, label)
  end
  catalog_zone.allow_transfers.each_pair do |_label, prefixes|
    output_prefixes(prefixes, template, 'allow-transfer')
  end
end
mkl(prefix, label) click to toggle source
# File lib/dns/catalog_zone/provider/knot.rb, line 187
def mkl(prefix, label)
  label = "#{prefix}-#{label}"
  label.tr!('.', '-')
  label.gsub!(/-$/, 'global')

  label
end
output_master(master, template, label) click to toggle source
# File lib/dns/catalog_zone/provider/knot.rb, line 210
def output_master(master, template, label)
  return if master.addresses.empty?

  # for request axfr
  remote = Remote.new(id: mkl('master', label), tsig: master.tsig)
  # for allow notify
  acl = Acl.new(id: mkl('notify', label), action: 'notify', key: master.tsig)
  master.addresses.each do |addr|
    remote.add_address(addr)
    acl.add_address(addr)
  end
  template.add_acl(mkl('notify', label))
  template.add_master(mkl('master', label))
  add_acl(acl)
  add_remote(remote)
end
output_notify(notify, template, label) click to toggle source
# File lib/dns/catalog_zone/provider/knot.rb, line 227
def output_notify(notify, template, label)
  return if notify.addresses.empty?
  # for send notify
  remote = Remote.new(id: mkl('notify', label), tsig: notify.tsig)
  # for allow transfer
  acl = Acl.new(id: mkl('transfer', label), action: 'transfer', key: notify.tsig)
  notify.addresses.each do |addr|
    remote.add_address(addr)
    acl.add_address(addr)
  end
  template.add_notify(mkl('notify', label))
  template.add_acl(mkl('transfer', label))
  add_acl(acl)
  add_remote(remote)
end
output_prefixes(prefixes, template, label) click to toggle source
# File lib/dns/catalog_zone/provider/knot.rb, line 243
def output_prefixes(prefixes, template, label)
  acl = Acl.new(id: mkl('acl', label), action: 'transfer')

  prefixes.prefixes.each do |prefix|
    acl.add_address("#{prefix.address}/#{prefix.prefix_length}")
  end
  add_acl(acl)
  template.add_acl(mkl('acl', label))
end
zones_config(catalog_zone) click to toggle source
# File lib/dns/catalog_zone/provider/knot.rb, line 253
def zones_config(catalog_zone)
  catalog_zone.zones.each_pair do |_hash, zone|
    zone_path = zonepath(zone)
    storage = ::File.dirname(zone_path)
    file = ::File.basename(zone_path)

    kzone = Zone.new(domain: zone.zonename,
                     storage: storage,
                     file: file)

    add_zone(kzone)
    zone.masters.each_pair do |label, master|
      output_master(master, kzone, "#{zone.zonename}-#{label}")
    end
    zone.notifies.each_pair do |label, notify|
      output_notify(notify, kzone, "#{zone.zonename}-#{label}")
    end
    zone.allow_transfers.each_pair do |label, prefixes|
      output_prefixes(prefixes, kzone, "#{zone.zonename}-#{label}")
    end
  end
end