From 02df5674b158049b2bd79d09a536989b834949e5 Mon Sep 17 00:00:00 2001
From: shirenn <shirenn@crans.org>
Date: Mon, 22 Feb 2021 01:22:12 +0100
Subject: [PATCH] [slapd] soyouz, query and regex

---
 group_vars/ldap_server.yml               |  3 ++-
 host_vars/daniel.adm.crans.org.yml       |  2 +-
 host_vars/jack.adm.crans.org.yml         |  2 +-
 host_vars/sam.adm.crans.org.yml          |  2 +-
 host_vars/sputnik.adm.crans.org          |  5 +++++
 hosts                                    |  1 +
 ldap.yml                                 |  5 -----
 lookup_plugins/ldap.py                   | 17 +++++++++++++++++
 plays/root.yml                           |  6 +-----
 plays/slapd.yml                          |  7 +++++++
 roles/slapd/templates/ldap/slapd.conf.j2 |  2 +-
 11 files changed, 37 insertions(+), 15 deletions(-)
 create mode 100644 host_vars/sputnik.adm.crans.org
 delete mode 100755 ldap.yml
 create mode 100755 plays/slapd.yml

diff --git a/group_vars/ldap_server.yml b/group_vars/ldap_server.yml
index 8818e0c1..7a52a6ca 100644
--- a/group_vars/ldap_server.yml
+++ b/group_vars/ldap_server.yml
@@ -1,7 +1,8 @@
 ---
 
 glob_slapd:
-  master_ip: 172.16.10.1
+  master_ip: "{{ query('ldap', 'ipv4', 'tealc', 'adm') | first }}"
+  regex: "^(role:(dhcp|dns|dns-primary|dns-secondary|ftp|gitlab|miroir|ntp|pve|radius|backup)|ecdsa-sha2-nistp256:.*|ssh-(ed25519|dss|rsa):.*)$"
   replication_credentials: "{{ vault_ldap_replication_credentials }}"
   private_key: "{{ vault_ldap_private_keyƂ }}"
   certificate: "{{ vault_ldap_certificate }}"
diff --git a/host_vars/daniel.adm.crans.org.yml b/host_vars/daniel.adm.crans.org.yml
index 139b9bd1..6152f24c 100644
--- a/host_vars/daniel.adm.crans.org.yml
+++ b/host_vars/daniel.adm.crans.org.yml
@@ -1,5 +1,5 @@
 ---
 loc_slapd:
-  ip: 172.16.10.12
+  ip: "{{ query('ldap', 'ipv4', 'daniel', 'adm') | first }}"
   replica: true
   replica_rid: 2
diff --git a/host_vars/jack.adm.crans.org.yml b/host_vars/jack.adm.crans.org.yml
index 70c60054..896420ab 100644
--- a/host_vars/jack.adm.crans.org.yml
+++ b/host_vars/jack.adm.crans.org.yml
@@ -1,5 +1,5 @@
 ---
 loc_slapd:
-  ip: 172.16.10.13
+  ip: "{{ query('ldap', 'ipv4', 'jack', 'adm') | first }}"
   replica: true
   replica_rid: 3
diff --git a/host_vars/sam.adm.crans.org.yml b/host_vars/sam.adm.crans.org.yml
index 9ed74927..ce52d174 100644
--- a/host_vars/sam.adm.crans.org.yml
+++ b/host_vars/sam.adm.crans.org.yml
@@ -1,5 +1,5 @@
 ---
 loc_slapd:
-  ip: 172.16.10.11
+  ip: "{{ query('ldap', 'ipv4', 'sam', 'adm') | first }}"
   replica: true
   replica_rid: 1
diff --git a/host_vars/sputnik.adm.crans.org b/host_vars/sputnik.adm.crans.org
new file mode 100644
index 00000000..04c45b94
--- /dev/null
+++ b/host_vars/sputnik.adm.crans.org
@@ -0,0 +1,5 @@
+---
+loc_slapd:
+  ip: "{{ query('ldap', 'ipv4', 'sputnik', 'adm') | first }}"
+  replica: true
+  replica_rid: 4
diff --git a/hosts b/hosts
index 955acc43..bc7e7eac 100644
--- a/hosts
+++ b/hosts
@@ -66,6 +66,7 @@ tealc.adm.crans.org
 sam.adm.crans.org
 daniel.adm.crans.org
 jack.adm.crans.org
+sputnik.adm.crans.org
 
 [linx]
 linx.adm.crans.org
diff --git a/ldap.yml b/ldap.yml
deleted file mode 100755
index 5a4d03f4..00000000
--- a/ldap.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/usr/bin/env ansible-playbook
----
-- hosts: daniel
-  roles:
-    - slapd
diff --git a/lookup_plugins/ldap.py b/lookup_plugins/ldap.py
index 3a77bfb3..838c67b4 100644
--- a/lookup_plugins/ldap.py
+++ b/lookup_plugins/ldap.py
@@ -60,6 +60,21 @@ class LookupModule(LookupBase):
         result = [res.decode('utf-8') for res in result['ipHostNumber']]
         return result
 
+    def ipv4(self, host, vlan):
+        if isinstance(vlan, int):
+            network_query_id = self.base.search(f"ou=networks,{self.base_dn}", ldap.SCOPE_ONELEVEL, f"description={vlan}")
+            network_result = self.base.result(network_query_id)
+            vlan = network_result[1][0][1]['cn'][0].decode('utf-8')
+        if vlan == 'srv':
+            query_id = self.base.search(f"cn={host}.crans.org,cn={host},ou=hosts,{self.base_dn}", ldap.SCOPE_BASE)
+        else:
+            query_id = self.base.search(f"cn={host}.{vlan}.crans.org,cn={host},ou=hosts,{self.base_dn}", ldap.SCOPE_BASE)
+        result = self.base.result(query_id)
+        result = result[1][0][1]
+        result = [res.decode('utf-8') for res in result['ipHostNumber']]
+        result = [ res for res in result if type(ipaddress.ip_address(res)) is ipaddress.IPv4Address ]
+        return result
+
     def all_ip(self, host):
         """
         Retrieve all IP addresses of a device
@@ -141,6 +156,8 @@ class LookupModule(LookupBase):
             result = self.query(*terms[1:])
         elif terms[0] == 'ip':
             result = self.ip(*terms[1:])
+        elif terms[0] == 'ipv4':
+            result = self.ipv4(*terms[1:])
         elif terms[0] == 'all_ip':
             result = self.all_ip(*terms[1:])
         elif terms[0] == 'cn':
diff --git a/plays/root.yml b/plays/root.yml
index 39df3297..7c3dee2f 100755
--- a/plays/root.yml
+++ b/plays/root.yml
@@ -48,11 +48,7 @@
     - qemu-guest-agent
     - serial-tty
 
-- hosts: ldap_server
-  vars:
-    slapd: '{{ glob_slapd | combine(loc_slapd | default({})) }}'
-  roles:
-    - slapd
+- import_playbook: slapd.yml
 
 - hosts: server
   vars:
diff --git a/plays/slapd.yml b/plays/slapd.yml
new file mode 100755
index 00000000..60b55e61
--- /dev/null
+++ b/plays/slapd.yml
@@ -0,0 +1,7 @@
+#!/usr/bin/env ansible-playbook
+---
+- hosts: ldap_server
+  vars:
+    slapd: '{{ glob_slapd | default({}) | combine(loc_slapd | default({})) }}'
+  roles:
+    - slapd
diff --git a/roles/slapd/templates/ldap/slapd.conf.j2 b/roles/slapd/templates/ldap/slapd.conf.j2
index ab870c26..6680b9ee 100644
--- a/roles/slapd/templates/ldap/slapd.conf.j2
+++ b/roles/slapd/templates/ldap/slapd.conf.j2
@@ -31,7 +31,7 @@ auditlog 		/var/log/openldap/auditlog.log
 
 moduleload constraint
 overlay constraint
-constraint_attribute description regex ^(dhcp|dns|dns-primary|dns-secondary|ftp|gitlab|miroir|ntp|pve|radius)$
+constraint_attribute description regex {{ slapd.regex }}
   restrict=ldap:///ou=hosts,dc=crans,dc=org??one?(objectClass=device)
 constraint_attribute uid regex ^_
   restrict=ldap:///ou=passwd,dc=crans,dc=org??one?(objectClass=posixAccount)
-- 
GitLab