From ec381b71de6020b6e4ff13b9a0df48cd0b156996 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= Date: Mon, 14 Feb 2022 16:52:13 +0100 Subject: Add module dns_record. --- lib/puppet/functions/zones.rb | 14 ++++ lib/puppet/provider/dns_record/zonefile.rb | 108 +++++++++++++++++++++++++++++ lib/puppet/provider/dns_zone/zonefile.rb | 56 +++++++++++++++ lib/puppet/type/dns_record.rb | 45 ++++++++++++ lib/puppet/type/dns_zone.rb | 19 +++++ 5 files changed, 242 insertions(+) create mode 100644 lib/puppet/functions/zones.rb create mode 100644 lib/puppet/provider/dns_record/zonefile.rb create mode 100644 lib/puppet/provider/dns_zone/zonefile.rb create mode 100644 lib/puppet/type/dns_record.rb create mode 100644 lib/puppet/type/dns_zone.rb (limited to 'lib') diff --git a/lib/puppet/functions/zones.rb b/lib/puppet/functions/zones.rb new file mode 100644 index 0000000..7dfa269 --- /dev/null +++ b/lib/puppet/functions/zones.rb @@ -0,0 +1,14 @@ +require 'zonefile' + +def get_zone(zone_name) + if ! $zones + $zones = {} + end + + if ! $zones[zone_name] + zone_file = "/var/named/dynamic/db.#{zone_name}" + $zones[zone_name] = Zonefile.from_file(zone_file, "#{zone_name}.") + end + + $zones[zone_name] +end diff --git a/lib/puppet/provider/dns_record/zonefile.rb b/lib/puppet/provider/dns_record/zonefile.rb new file mode 100644 index 0000000..f44014e --- /dev/null +++ b/lib/puppet/provider/dns_record/zonefile.rb @@ -0,0 +1,108 @@ +require 'zonefile' +require 'puppet/functions/zones' + +Puppet::Type.type(:dns_record).provide(:zonefile) do + + def self.instances + puts "Instances" + [ new(type: :A, + value: '1.2.3.4', + ), + ] + + end + + def create + puts "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 + when :A, :MX, :NS, :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) + when :NS + zone.add_record(:ns, data) + else + zone.add_record(type, data) + end + end + + # private + def remove_record(zone, record_to_remove) + case type + when :AAAA + zone.a4.select! {|record| ! (record[:name] == record_to_remove[:key]) } + when :NS + zone.ns.select! {|record| ! (record[:name] == record_to_remove[:key] && record[:host] == record_to_remove[:value])} + when nil + Zonefile::RECORDS.map{|t| t.downcase.intern}.each do |t| + zone.records[t].select! {|record| ! (record[:name] == record_to_remove[:key]) } + end + else + zone.records[type.downcase.intern].select! {|record| ! (record[:name] == record_to_remove[:key]) } + end + end + + def destroy + zone = get_zone(resource[:zone]) + remove_record(zone, resource) + end + + def exists? + 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 + + def flush + puts "record flush" + end + + def self.flush + puts "recurd self.flush" + end + + + def type + resource[:type] + end + + def value + resource[:value] + end + + def key + resource[:key] + end + + def ttl + resource[:ttl] + end +end diff --git a/lib/puppet/provider/dns_zone/zonefile.rb b/lib/puppet/provider/dns_zone/zonefile.rb new file mode 100644 index 0000000..6ed15bd --- /dev/null +++ b/lib/puppet/provider/dns_zone/zonefile.rb @@ -0,0 +1,56 @@ +require 'zonefile' +require 'puppet/functions/zones' + +Puppet::Type.type(:dns_zone).provide(:zonefile) do + + def self.instances + [ +# new( +# name: 'adrift.space', +# ensure: :present, +# ), + ] + end + + def create + zone_name = resource[:zone] + zone = get_zone(zone_name) + + zone.new_serial + + File.open("/var/named/dynamic/db.#{zone_name}", 'w') do |f| + f.write zone.output + end + + end + + def destroy + puts "Detroy" + end + + def refresh + puts ">>> Refresh" + end + + def exists? + puts "@property_hash = #{@property_hash}" + # puts "resource[:refresh] = #{resource.refresh}" + # puts "self[:refresh] = #{self[:refresh]}" + zone_name = resource[:zone] + File.exists?("/var/named/dynamic/db.#{zone_name}") + end + + def primary + resource[:primary] + end + + def flush + puts "zone flush" + end + + # zf = + + # zf.new_serial + # puts "#{zf.output}" + +end diff --git a/lib/puppet/type/dns_record.rb b/lib/puppet/type/dns_record.rb new file mode 100644 index 0000000..0e22156 --- /dev/null +++ b/lib/puppet/type/dns_record.rb @@ -0,0 +1,45 @@ +Puppet::Type.newtype(:dns_record) do + @doc = %q{ + } + + # concat/lib/puppet/type/concat_file.rb + ensurable + + newparam(:zone) do + desc "Zone which this record belongs to" + isrequired + end + + newparam(:name, :namevar => true) do + desc "Hello" + end + + #newparam(:refresh) do + # desc "Refreshes" + #end + + newproperty(:type) do + desc "DNS Record type, such as A, or TXT" + newvalues(:A, :AAAA, :CNAME, :NS) + isrequired + end + + newproperty(:key) do + desc "DNS Name" + isrequired + end + + newproperty(:value) do + desc "Record contents, valid value depend on type" + isrequired + end + + newproperty(:ttl) do + desc "Optional TTL for record" + end + + autonotify(:dns_zone) { parameter(:zone).value } + autobefore(:dns_zone) { parameter(:zone).value } + autorequire(:dns_zone) { parameter(:zone).value } + +end diff --git a/lib/puppet/type/dns_zone.rb b/lib/puppet/type/dns_zone.rb new file mode 100644 index 0000000..6cd9aef --- /dev/null +++ b/lib/puppet/type/dns_zone.rb @@ -0,0 +1,19 @@ +Puppet::Type.newtype(:dns_zone) do + # zone_name = $name + # path = /var/named + # file = "${path}/dynamic/db.${zone_name}" + # purge = false + + ensurable + + newparam(:purge) do + desc "Should all existing records be purged?" + end + + newparam(:zone, :namevar => true) do + end + + newproperty(:primary) do + desc "Hello" + end +end -- cgit v1.2.3