class Proxy::Dns::Powerdns::Record

Attributes

mysql_connection[R]
powerdns_pdnssec[R]

Public Class Methods

new(options = {}) click to toggle source
Calls superclass method
# File lib/smart_proxy_dns_powerdns/dns_powerdns_main.rb, line 22
def initialize options = {}
  raise "dns_powerdns provider needs 'powerdns_mysql_hostname' option" unless options[:powerdns_mysql_hostname]
  raise "dns_powerdns provider needs 'powerdns_mysql_username' option" unless options[:powerdns_mysql_username]
  raise "dns_powerdns provider needs 'powerdns_mysql_password' option" unless options[:powerdns_mysql_password]
  raise "dns_powerdns provider needs 'powerdns_mysql_database' option" unless options[:powerdns_mysql_database]
  @mysql_connection = Mysql2::Client.new(
    :host => options[:powerdns_mysql_hostname],
    :username => options[:powerdns_mysql_username],
    :password => options[:powerdns_mysql_password],
    :database => options[:powerdns_mysql_database]
  )

  @powerdns_pdnssec = options[:powerdns_pdnssec] || false

  # Normalize the somewhat weird PTR API spec to name / content
  case options[:type]
  when "PTR"
    if options[:value] =~ /\.(in-addr|ip6)\.arpa$/
      @name = options[:value]
    else
      @name = IPAddr.new(options[:value]).reverse
    end
    @content = options[:fqdn]
  else
    @name = options[:fqdn]
    @content = options[:value]
  end

  super(options)
end
record(attrs = {}) click to toggle source
# File lib/smart_proxy_dns_powerdns/dns_powerdns_main.rb, line 12
def self.record(attrs = {})
  new(attrs.merge(
    :powerdns_mysql_hostname => ::Proxy::Dns::Powerdns::Plugin.settings.powerdns_mysql_hostname,
    :powerdns_mysql_username => ::Proxy::Dns::Powerdns::Plugin.settings.powerdns_mysql_username,
    :powerdns_mysql_password => ::Proxy::Dns::Powerdns::Plugin.settings.powerdns_mysql_password,
    :powerdns_mysql_database => ::Proxy::Dns::Powerdns::Plugin.settings.powerdns_mysql_database,
    :powerdns_pdnssec => ::Proxy::Dns::Powerdns::Plugin.settings.powerdns_pdnssec
  ))
end

Public Instance Methods

create() click to toggle source
# File lib/smart_proxy_dns_powerdns/dns_powerdns_main.rb, line 53
def create
  domain_row = domain
  raise Proxy::Dns::Error, "Unable to determine zone. Zone must exist in PowerDNS." unless domain_row

  if ip = dns_find(domain_row['id'], @name)
    raise Proxy::Dns::Collision, "#{@name} is already in use by #{ip}"
  end

  create_record(domain_row['id'], @name, @ttl, @content, @type)

  rectify_zone(domain_row['name'])
end
remove() click to toggle source
# File lib/smart_proxy_dns_powerdns/dns_powerdns_main.rb, line 66
def remove
  domain_row = domain
  raise Proxy::Dns::Error, "Unable to determine zone. Zone must exist in PowerDNS." unless domain_row

  delete_record(domain_row['id'], @name, @type)

  rectify_zone(domain_row['name'])
end

Private Instance Methods

create_record(domain_id, name, ttl, content, type) click to toggle source
# File lib/smart_proxy_dns_powerdns/dns_powerdns_main.rb, line 98
def create_record domain_id, name, ttl, content, type
  name = mysql_connection.escape(name)
  content = mysql_connection.escape(content)
  type = mysql_connection.escape(type)
  mysql_connection.query("INSERT INTO records (domain_id, name, ttl, content, type) VALUES (#{domain_id}, '#{name}', #{ttl.to_i}, '#{content}', '#{type}')")
  true
end
delete_record(domain_id, name, type) click to toggle source
# File lib/smart_proxy_dns_powerdns/dns_powerdns_main.rb, line 107
def delete_record domain_id, name, type
  name = mysql_connection.escape(name)
  type = mysql_connection.escape(type)
  mysql_connection.query("DELETE FROM records WHERE domain_id=#{domain_id} AND name='#{name}' AND type='#{type}'")
  true
end
dns_find(domain_id, key) click to toggle source
# File lib/smart_proxy_dns_powerdns/dns_powerdns_main.rb, line 88
def dns_find domain_id, key
  value = nil
  key = mysql_connection.escape(key)
  mysql_connection.query("SELECT content FROM records WHERE domain_id=#{domain_id} AND name = '#{key}' LIMIT 1").each do |row|
    value = row["content"]
  end
  value || false
end
domain() click to toggle source
# File lib/smart_proxy_dns_powerdns/dns_powerdns_main.rb, line 76
def domain
  domain = nil

  name = mysql_connection.escape(@name)
  mysql_connection.query("SELECT LENGTH(name) domain_length, id, name FROM domains WHERE '#{name}' LIKE CONCAT('%%.', name) ORDER BY domain_length DESC LIMIT 1").each do |row|
    domain = row
  end

  domain
end
rectify_zone(domain) click to toggle source
# File lib/smart_proxy_dns_powerdns/dns_powerdns_main.rb, line 115
def rectify_zone domain
  if @powerdns_pdnssec
    %x(#{@powerdns_pdnssec} rectify-zone "#{domain}")

    $?.exitstatus == 0
  else
    true
  end
end