Class: Proxy::Dns::Powerdns::Record

Inherits:
Record
  • Object
show all
Includes:
Log, Util
Defined in:
lib/smart_proxy_dns_powerdns/dns_powerdns_main.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(a_server, a_ttl, url, api_key) ⇒ Record

Returns a new instance of Record.



11
12
13
14
15
16
# File 'lib/smart_proxy_dns_powerdns/dns_powerdns_main.rb', line 11

def initialize(a_server, a_ttl, url, api_key)
  @url = url
  @api_key = api_key

  super(a_server, a_ttl)
end

Instance Attribute Details

#api_keyObject (readonly)

Returns the value of attribute api_key.



9
10
11
# File 'lib/smart_proxy_dns_powerdns/dns_powerdns_main.rb', line 9

def api_key
  @api_key
end

#urlObject (readonly)

Returns the value of attribute url.



9
10
11
# File 'lib/smart_proxy_dns_powerdns/dns_powerdns_main.rb', line 9

def url
  @url
end

Instance Method Details

#create_record(domain_id, name, type, content) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/smart_proxy_dns_powerdns/dns_powerdns_main.rb', line 53

def create_record domain_id, name, type, content
  content += '.' if ['PTR', 'CNAME'].include?(type)
  rrset = {
    :name => name + '.',
    :type => type,
    :ttl => @ttl.to_i,
    :changetype => :REPLACE,
    :records => [
      {
        :content => content,
        :disabled => false
      }
    ]
  }

  patch_records domain_id, rrset
end

#delete_record(domain_id, name, type) ⇒ Object



71
72
73
74
75
76
77
78
79
80
# File 'lib/smart_proxy_dns_powerdns/dns_powerdns_main.rb', line 71

def delete_record domain_id, name, type
  rrset = {
    :name => name + '.',
    :type => type,
    :changetype => :DELETE,
    :records => []
  }

  patch_records domain_id, rrset
end

#do_create(name, value, type) ⇒ Object



18
19
20
21
22
23
24
# File 'lib/smart_proxy_dns_powerdns/dns_powerdns_main.rb', line 18

def do_create(name, value, type)
  zone = get_zone(name)
  unless create_record(zone['id'], name, type, value)
    raise Proxy::Dns::Error.new("Failed to insert record #{name} #{type} #{value}")
  end
  true
end

#do_remove(name, type) ⇒ Object



26
27
28
29
# File 'lib/smart_proxy_dns_powerdns/dns_powerdns_main.rb', line 26

def do_remove(name, type)
  zone = get_zone(name)
  delete_record(zone['id'], name, type)
end

#get_zone(name) ⇒ Object

Raises:

  • (Proxy::Dns::Error)


31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/smart_proxy_dns_powerdns/dns_powerdns_main.rb', line 31

def get_zone name
  fqdn = Resolv::DNS::Name.create(name)
  fqdn = Resolv::DNS::Name.create(name + '.') unless fqdn.absolute?
  uri = URI("#{@url}/zones")

  result = Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
    request = Net::HTTP::Get.new uri
    request['X-API-Key'] = @api_key
    response = http.request request
    zones = JSON.parse(response.body) rescue []

    zones.select { |zone|
      domain = Resolv::DNS::Name.create(zone['name'])
      domain == fqdn or fqdn.subdomain_of?(domain)
    }.max_by { |zone| zone['name'].length }
  end

  raise Proxy::Dns::Error, "Unable to determine zone for #{name}. Zone must exist in PowerDNS." unless result

  result
end