From 08706617833df371aa1b58fa9a8729eb67a120e0 Mon Sep 17 00:00:00 2001
From: Lars Beckers <lars.beckers@rwth-aachen.de>
Date: Wed, 31 Aug 2022 00:20:11 +0200
Subject: [PATCH] networkd: add generic customization options

---
 networkd/defaults/main.yml                    |  8 +++++++-
 networkd/tasks/main.yml                       |  2 +-
 networkd/templates/20-wired-dhcp.network.j2   |  9 ++++++++-
 networkd/templates/20-wired-routed.network.j2 | 13 +++++++++++++
 4 files changed, 29 insertions(+), 3 deletions(-)

diff --git a/networkd/defaults/main.yml b/networkd/defaults/main.yml
index 4db2087..38d6196 100644
--- a/networkd/defaults/main.yml
+++ b/networkd/defaults/main.yml
@@ -14,6 +14,7 @@
 #     address: '10.10.10.10/24'
 #     gateway: '10.10.10.1'
 #   - type: 'routed'
+#     identifier: 'file-name'
 #     interfaces:
 #       - 'eth0'
 #     addresses:
@@ -51,11 +52,16 @@
 #         name: transport
 #         bridge: true
 
-networkd_type: 'dhcp'  # if networkd not defined
 networkd_ipfwd: false  # works only globally anyway
 
 ### old style config follows, still supported
 
+# if networkd not defined
+networkd_type: 'dhcp'
+
+# for static and dhcp types only
+# networkd_interface: eth0
+
 # for static type only
 networkd_address: 10.10.10.10/24
 networkd_gateway: 10.10.10.1
diff --git a/networkd/tasks/main.yml b/networkd/tasks/main.yml
index e8e06d9..60ae009 100644
--- a/networkd/tasks/main.yml
+++ b/networkd/tasks/main.yml
@@ -3,7 +3,7 @@
 - name: ensure networkd has a valid configuration
   template:
     src: "20-wired-{{ item.1.type }}.network.j2"
-    dest: /etc/systemd/network/{{ item.0 }}-wired.network
+    dest: "/etc/systemd/network/{{ item.0 }}-{{ item.1.identifier|default('wired') }}.network"
     owner: root
     group: root
     mode: '0644'
diff --git a/networkd/templates/20-wired-dhcp.network.j2 b/networkd/templates/20-wired-dhcp.network.j2
index a780e7d..3737690 100644
--- a/networkd/templates/20-wired-dhcp.network.j2
+++ b/networkd/templates/20-wired-dhcp.network.j2
@@ -1,8 +1,15 @@
 [Match]
-Name={{ item.1.interface|default(ansible_default_ipv4.interface) }}
+Name={{ item.1.interface|default(networkd_interface|default(ansible_default_ipv4.interface)) }}
 
 [Network]
 DHCP=ipv4
 {% if networkd_ipfwd %}
 IPForward=yes
 {% endif %}
+{% for custom in network.custom|default([]) %}
+
+[{{ custom.category }}]
+{% for key, value in custom.settings.items() %}
+{{ key }}={{ value }}
+{% endfor %}
+{% endfor %}
diff --git a/networkd/templates/20-wired-routed.network.j2 b/networkd/templates/20-wired-routed.network.j2
index 94e0340..7cb766d 100644
--- a/networkd/templates/20-wired-routed.network.j2
+++ b/networkd/templates/20-wired-routed.network.j2
@@ -15,6 +15,9 @@ DNS={{ server }}
 {% if networkd_ipfwd %}
 IPForward=yes
 {% endif %}
+{% for key, value in (network.settings|default({})).items() %}
+{{ key }}={{ value }}
+{% endfor %}
 {% endif %}
 
 {% for route in network.routes|default([{'gateway': network.gateway}]) %}
@@ -38,4 +41,14 @@ PreferredSource={{ route.source }}
 {% if route.metric is defined %}
 Metric={{ route.metric }}
 {% endif %}
+{% for key, value in (route.settings|default({})).items() %}
+{{ key }}={{ value }}
+{% endfor %}
+{% endfor %}
+{% for custom in network.custom|default([]) %}
+
+[{{ custom.category }}]
+{% for key, value in custom.settings.items() %}
+{{ key }}={{ value }}
+{% endfor %}
 {% endfor %}
-- 
GitLab