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