summaryrefslogtreecommitdiff
path: root/lib/puppet/provider/dns_zone2/named.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/puppet/provider/dns_zone2/named.rb')
-rw-r--r--lib/puppet/provider/dns_zone2/named.rb96
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