From a0c997dc239759a19d80a53eb9f3b3def91f53f5 Mon Sep 17 00:00:00 2001
From: mwiegand <mwiegand@seibert-media.net>
Date: Fri, 18 Jun 2021 00:01:04 +0200
Subject: [PATCH] wip

---
 bundles/bind/items.py            |  0
 bundles/bind/metadata.py         | 44 ++++++++++++++++++++++++++++++++
 groups/all.py                    |  6 ++++-
 groups/applications/dnsserver.py |  5 ++++
 nodes/home.backups.py            |  3 +++
 nodes/htz.games.py               |  3 +++
 nodes/htz.mails.py               | 15 +++++++++++
 7 files changed, 75 insertions(+), 1 deletion(-)
 create mode 100644 bundles/bind/items.py
 create mode 100644 bundles/bind/metadata.py
 create mode 100644 groups/applications/dnsserver.py

diff --git a/bundles/bind/items.py b/bundles/bind/items.py
new file mode 100644
index 0000000..e69de29
diff --git a/bundles/bind/metadata.py b/bundles/bind/metadata.py
new file mode 100644
index 0000000..e6b4030
--- /dev/null
+++ b/bundles/bind/metadata.py
@@ -0,0 +1,44 @@
+defaults = {
+    'bind': {
+        'zones': {},
+    },
+}
+
+
+@metadata_reactor.provides(
+    'bind/zones',
+)
+def collect_records(metadata):
+    zones = metadata.get('bind/zones')
+    
+    for other_node in repo.nodes:
+        print(other_node.name)
+        for fqdn, records in other_node.metadata.get('dns').items():
+            matching_zones = sorted(
+                filter(
+                    lambda potential_zone: fqdn.endswith(potential_zone),
+                    zones
+                ),
+                key=len,
+            )
+            
+            if matching_zones:
+                zone = matching_zones[0]
+            else:
+                continue
+
+            name = fqdn[0:-len(zone) - 1]
+
+            for type, values in records.items():
+                for value in values:
+                    zones\
+                        .setdefault(zone, [])\
+                        .append(
+                            (name, type, value)
+                        )
+    
+    return {
+        'bind': {
+            'zones': zones,
+        },
+    }
diff --git a/groups/all.py b/groups/all.py
index 0967ef4..2e8e687 100644
--- a/groups/all.py
+++ b/groups/all.py
@@ -1 +1,5 @@
-{}
+{
+    'metadata': {
+        'dns': {},
+    }
+}
diff --git a/groups/applications/dnsserver.py b/groups/applications/dnsserver.py
new file mode 100644
index 0000000..68c889c
--- /dev/null
+++ b/groups/applications/dnsserver.py
@@ -0,0 +1,5 @@
+{
+    'bundles': [
+        'bind',
+    ],
+}
diff --git a/nodes/home.backups.py b/nodes/home.backups.py
index 3a24e7c..418626e 100644
--- a/nodes/home.backups.py
+++ b/nodes/home.backups.py
@@ -1,3 +1,6 @@
 {
+    'groups': [
+        'debian-10',
+    ],
     'metadata': {},
 }
diff --git a/nodes/htz.games.py b/nodes/htz.games.py
index 2033dac..8363a2b 100644
--- a/nodes/htz.games.py
+++ b/nodes/htz.games.py
@@ -1,4 +1,7 @@
 {
+    'groups': [
+        'debian-10',
+    ],
     'bundles': [
         'steam',
         'l4d2',
diff --git a/nodes/htz.mails.py b/nodes/htz.mails.py
index 0c93520..ddb2492 100644
--- a/nodes/htz.mails.py
+++ b/nodes/htz.mails.py
@@ -5,12 +5,27 @@
         'debian-10',
         'mailserver',
         'webserver',
+        'dnsserver',
     ],
     'bundles': [
         'wireguard',
         'zfs',
     ],
     'metadata': {
+        'bind': {
+            'zones': {
+                'mail2.sublimity.de': [],
+                'sublimity.de': [],
+                'freibrief.net': [],
+                'nadenau.net': [],
+                'naeder.net': [],
+                'rolfwerner.eu': [],
+                'wettengl.net': [],
+                'wingl.de': [],
+                'woodpipe.de': [],
+                'ckn.li': [],
+            },
+        },
         'network': {
             'interface': 'eth0',
             'ipv4': '162.55.188.157/32',