diff options
Diffstat (limited to 'lib/puppet/provider/dns_zone2/named.rb')
-rw-r--r-- | lib/puppet/provider/dns_zone2/named.rb | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/lib/puppet/provider/dns_zone2/named.rb b/lib/puppet/provider/dns_zone2/named.rb new file mode 100644 index 0000000..e249be6 --- /dev/null +++ b/lib/puppet/provider/dns_zone2/named.rb @@ -0,0 +1,96 @@ +Puppet::Type.type(:dns_zone2).provide(:named) do + def self.instances + `named-checkconf -l`.split("\n").map do |record| + name, cls, view, type = record.split(' '); + new(:name => name, :cls => cls, :view => view, :type => type) + end + end + + def create(records) + print("Create #{resource[:name]}\n") + write_zone records + end + + def destroy + print("Remove #{resource[:name]}\n") + end + + def refresh(records) + print("Refresh #{resource[:name]}\n") + write_zone records + end + + def exists? + # instances.find { |r| r.name == resource[:name] } + # resource[:ensure] == :present + `named-checkconf -l` + .split("\n") + .grep(/#{resource[:origin]} /) + .length > 0 + end + + def filename + "/var/named/zones/#{resource[:name]}db" + end + + def zone_content(records) + content = <<~EOF + ; File managed by Puppet. + ; Local changes WILL be overwritten + ; File last generated #{Time.now} + + $ORIGIN #{resource[:origin]} + $TTL #{resource[:default_ttl]} + + @ #{resource[:soa_ttl]} IN SOA #{resource[:mname]} #{resource[:rname]} ( + #{serial+1} ; serial + #{resource[:refresh]} ; refresh + #{resource[:retry]} ; retry + #{resource[:expire]} ; expire + #{resource[:negative_ttl]} ; Negative TTL + ) + EOF + + records + .filter {|r| r[:zone] == resource[:name] } + .group_by {|r| r[:type]} + .sort_by {|(type, _)| + # Bit of a hack, but ensures that SOA is always first, + # NS is after + # And the rest have stable order + { + SOA: 0, + NS: 1, + A: 2, + AAAA: 3, + CNAME: 4, + HINFO: 5, + MINFO: 6, + MX: 7, + PTR: 8, + TXT: 9, + WKS: 10, + }[type] + }.each{|(type, values)| + content += <<~EOF + ; #{type} Records + EOF + values.each {|val| + content += <<~EOF + #{val[:key]} #{val[:ttl]} IN #{val[:type]} #{val[:value]} + EOF + } + } + content + end + + def write_zone(content) + File.open(filename, 'w') do |file| + file.write content + end + end + + def serial + `rndc zonestatus #{name} | awk -F' ' '/^serial:/ { print $2 }'`.to_i + end +end |