summaryrefslogtreecommitdiff
path: root/lib/puppet/provider/dns_record/zonefile.rb
blob: dfa788c92f33b144856f770f468c73610e83caec (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
require 'zonefile'
require 'puppet/functions/zones'

Puppet::Type.type(:dns_record).provide(:zonefile) do

  # def initialize(*args)
  #   super
  #   # zone_name = resource[:zone]
  #   resource[:notify] = [
  #     "Dns_zone[adrift.space]"
  #   ]
  #   puts "notify = #{resource[:notify]}"
  # end

  def self.instances
    puts "Instances"
    [ new(type: :A,
          value: '1.2.3.4',
          name: "Test",
          zone: 'adrift.space',
         ),
    ]

  end

  def create
    # context.notice("Creating #{name} with #{should}")
    zone = get_zone(resource[:zone])
    type = resource[:type]
    data = {
      :name => resource[:key],
    }

    if resource[:ttl]
      data[:ttl] = resource[:ttl]
    end

    # :SOA

    case type
      # TODO keep this in sync with type
    when :A, :MX, :CNAME, :A4, :AAAA, :PTR, :SRV
      data[:host] = resource[:value]
    when :TXT
      data[:text] = resource[:value]
    end

    remove_record(zone, resource)

    case type
    when :AAAA
      zone.add_record(:a4, data)
    else
      zone.add_record(type, data)
    end
  end

  # private
  def remove_record(zone, record_to_remove)
    case type
    when :AAAA
      zone.a4.reject! {|record| record[:name] == record_to_remove[:key] }
    when nil
      Zonefile::RECORDS.map{|t| t.downcase.intern}.each do |t|
        zone.records[t].reject! {|record| record[:name] == record_to_remove[:key] }
      end
    else
      zone.records[type.downcase.intern].reject! {|record| record[:name] == record_to_remove[:key] }
    end
  end

  def destroy
    zone = get_zone(resource[:zone])
    remove_record(zone, resource)
  end

  def exists?
    !! find_self
  end

  def find_self
    zone = get_zone(resource[:zone])
    t = resource[:type]
    case t
    when nil
      dataset = Zonefile::RECORDS.map {|t| t.downcase.intern}.map {|t| zone.records[t]}.flatten
      dataset.find {|record| record[:name] == resource[:key]}
    when :AAAA
      zone.a4.find {|record| record[:name] == resource[:key]}
    else
      zone.records[t.downcase.intern].find {|record| record[:name] == resource[:key]}
    end
  end

  # Setting new values on type or key doesn't make sense, since they
  # are our primary keys.

  def type
    resource[:type]
  end

  def key
    resource[:key]
  end

  def value
    record = find_self
    record && record[:host]
  end

  def value=(value)
    record = find_self
    # Puppet creates the resources instead of setting it the fetch
    # method failed
    record[:host] = value
  end

  def ttl
    record = find_self
    record && record[:ttl]
  end

  def ttl=(value)
    record = find_self
    record[:ttl] = value
  end
end