summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHugo Hörnquist <hugo@lysator.liu.se>2022-02-14 16:52:13 +0100
committerHugo Hörnquist <hugo@lysator.liu.se>2022-02-14 16:52:13 +0100
commitec381b71de6020b6e4ff13b9a0df48cd0b156996 (patch)
treec52ff1d6c5248c839996b2886906e93ea2cc4724
parentVendor zonefile module. (diff)
downloaddns_record-ec381b71de6020b6e4ff13b9a0df48cd0b156996.tar.gz
dns_record-ec381b71de6020b6e4ff13b9a0df48cd0b156996.tar.xz
Add module dns_record.
-rw-r--r--lib/puppet/functions/zones.rb14
-rw-r--r--lib/puppet/provider/dns_record/zonefile.rb108
-rw-r--r--lib/puppet/provider/dns_zone/zonefile.rb56
-rw-r--r--lib/puppet/type/dns_record.rb45
-rw-r--r--lib/puppet/type/dns_zone.rb19
5 files changed, 242 insertions, 0 deletions
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