class Bosh::Director::PowerDns

Constants

SOA
TTL_4H
TTL_5H
TTL_5M

Public Class Methods

new(domain_name, logger) click to toggle source
# File lib/bosh/director/dns/powerdns.rb, line 8
def initialize(domain_name, logger)
  @domain_name = domain_name
  @logger = logger
end

Public Instance Methods

create_or_update_dns_records(dns_record_name, ip_address) click to toggle source
# File lib/bosh/director/dns/powerdns.rb, line 31
def create_or_update_dns_records(dns_record_name, ip_address)
  create_or_update_record(dns_record_name, ip_address, TTL_5M, 'A')
  update_ptr_record(dns_record_name, ip_address)
end
create_or_update_nameserver(ip_address) click to toggle source
# File lib/bosh/director/dns/powerdns.rb, line 24
def create_or_update_nameserver(ip_address)
  create_or_update_domain
  create_or_update_record(@domain_name, SOA, TTL_5M, 'SOA')
  create_or_update_record(@domain_name, "ns.#{@domain_name}", TTL_4H, 'NS')
  create_or_update_record("ns.#{@domain_name}", ip_address, TTL_5H, 'A')
end
delete(record_pattern) click to toggle source
# File lib/bosh/director/dns/powerdns.rb, line 41
def delete(record_pattern)
  records = find_dns_records_by_pattern(record_pattern)

  # delete A records and collect all IPs for later
  ips = []
  records.each do |record|
    ips << record.content
    Models::Dns::Record.grep(:content, record.name).each do |ptr|
      @logger.info("Deleting reverse DNS record: #{ptr.name} -> #{ptr.content}")
      ptr.destroy
    end
    @logger.info("Deleting DNS record: #{record.name}")
    record.destroy
  end
end
find_dns_record(dns_record_name, ip_address) click to toggle source
# File lib/bosh/director/dns/powerdns.rb, line 13
def find_dns_record(dns_record_name, ip_address)
  Models::Dns::Record.find(name: dns_record_name, type: 'A', content: ip_address)
end
find_dns_records_by_ip(ip_address) click to toggle source
# File lib/bosh/director/dns/powerdns.rb, line 17
def find_dns_records_by_ip(ip_address)
  domain_id = find_domain_id
  return [] unless domain_id

  Models::Dns::Record.filter(domain_id: domain_id, type: 'A', content: ip_address)
end
find_dns_records_by_pattern(record_pattern) click to toggle source
# File lib/bosh/director/dns/powerdns.rb, line 36
def find_dns_records_by_pattern(record_pattern)
  records = Models::Dns::Record.grep(:name, record_pattern)
  records.filter(:domain_id => find_domain_id).all
end

Private Instance Methods

create_or_update_domain() click to toggle source
# File lib/bosh/director/dns/powerdns.rb, line 59
def create_or_update_domain
  Models::Dns::Domain.safe_find_or_create(name: @domain_name, type: 'NATIVE')
end
create_or_update_record(dns_record_name, ip_address, ttl, type) click to toggle source
# File lib/bosh/director/dns/powerdns.rb, line 63
def create_or_update_record(dns_record_name, ip_address, ttl, type)
  record = Models::Dns::Record.find(name: dns_record_name, type: type)
  if record.nil?
    domain = create_or_update_domain
    record = Models::Dns::Record.new(domain_id: domain.id,
      name: dns_record_name, type: type,
      ttl: ttl)
  end
  record.content = ip_address
  record.change_date = Time.now.to_i
  record.save
end
find_domain_id() click to toggle source
# File lib/bosh/director/dns/powerdns.rb, line 108
def find_domain_id
  dns_domain = Models::Dns::Domain.find(
    :name => @domain_name,
    :type => 'NATIVE',
  )
  dns_domain.nil? ? nil : dns_domain.id
end
reverse(ip, n) click to toggle source
# File lib/bosh/director/dns/powerdns.rb, line 128
def reverse(ip, n)
  octets = ip.split(/\./)
  "#{octets[0..(n-1)].reverse.join(".")}.in-addr.arpa"
end
reverse_domain(ip) click to toggle source

@param [String] ip IP address @return [String] reverse dns domain name for an IP

# File lib/bosh/director/dns/powerdns.rb, line 124
def reverse_domain(ip)
  reverse(ip, 3)
end
reverse_host(ip) click to toggle source

@param [String] ip IP address @return [String] reverse dns name for an IP used for a PTR record

# File lib/bosh/director/dns/powerdns.rb, line 118
def reverse_host(ip)
  reverse(ip, 4)
end
update_ptr_record(record_name, ip_address) click to toggle source

create/update DNS PTR records (for reverse lookups)

# File lib/bosh/director/dns/powerdns.rb, line 77
def update_ptr_record(record_name, ip_address)
  reverse_domain = reverse_domain(ip_address)
  reverse_host = reverse_host(ip_address)

  rdomain = Models::Dns::Domain.safe_find_or_create(name: reverse_domain, type: 'NATIVE')

  Models::Dns::Record.find_or_create(
    domain: rdomain,
    name: reverse_domain,
    type: 'SOA', content: SOA,
    ttl: TTL_4H
  )

  Models::Dns::Record.find_or_create(
    domain: rdomain,
    name: reverse_domain,
    type: 'NS', ttl: TTL_4H,
    content: "ns.#{@domain_name}"
  )

  record = Models::Dns::Record.find_or_create(content: record_name, type: 'PTR')
  record.update(
    domain: rdomain,
    name: reverse_host,
    content: record_name,
    type: 'PTR',
    ttl: TTL_5M,
    change_date: Time.now.to_i
  )
end