From 6f91113b3f2e0b64db008530dbe15ebea67e0bf2 Mon Sep 17 00:00:00 2001 From: Samuel Lorch Date: Sat, 10 Feb 2024 19:55:58 +0100 Subject: [PATCH] Implement Networkd Addressing and Wireguard Templates --- src/apply/networkd/mod.rs | 73 ++++++++++++------- .../networkd/config-addressing.network | 22 ++++++ .../networkd/create-wireguard.netdev | 24 ++++++ 3 files changed, 93 insertions(+), 26 deletions(-) create mode 100644 src/templates/networkd/config-addressing.network create mode 100644 src/templates/networkd/create-wireguard.netdev diff --git a/src/apply/networkd/mod.rs b/src/apply/networkd/mod.rs index 15f9e93..78c4ef8 100644 --- a/src/apply/networkd/mod.rs +++ b/src/apply/networkd/mod.rs @@ -17,7 +17,7 @@ pub fn apply_networkd(pending_config: Config, current_config: Config) -> Result< info!("Got Files"); for file in files { info!("Conf File {}", file.name); - info!("{}", file.content); + info!("\n{}", file.content); } Ok(()) } @@ -114,39 +114,60 @@ pub fn generate_networkd_config_files( } // Step 4 Generate wireguard netdev files - /* TODO - for interface in &pending_config.network.interfaces { - if let NetworkInterfaceType::Bridge { .. } = interface.interface_type { - let mut context = Context::new(); - context.insert("name", &interface.name); + for interface in &pending_config.vpn.wireguard.interfaces { + let mut context = Context::new(); + context.insert("interface", &interface); + context.insert("peers", &interface.peers(pending_config.clone())); - files.push(generate_config_file( - context, - "networkd/create-wireguard.netdev", - format!("40-create-wireguard-{}.netdev", &interface.name), - )?); - } + files.push(generate_config_file( + context, + "networkd/create-wireguard.netdev", + format!("40-create-wireguard-{}.netdev", &interface.name), + )?); } - */ // Step 5 Generate Addressing network files - /* for interface in &pending_config.network.interfaces { - if let NetworkInterfaceType::Vlan { id, .. } = &interface.interface_type { - let mut context = Context::new(); - match &interface.interface_type { - NetworkInterfaceType::Hardware { device } => context.insert("name", &device), - _ => context.insert("name", &member.name), - }; + let mut context = Context::new(); + match &interface.interface_type { + NetworkInterfaceType::Hardware { device } => context.insert("name", &device), + _ => context.insert("name", &interface.name), + }; - files.push(generate_config_file( - context, - "networkd/config-addressing.network", - format!("70-config-addressing-{}.network", &interface.name), - )?); + context.insert("interface", &interface); + + // List of all vlans that have this interface as a parent + let mut vlans = Vec::new(); + // TODO Use Backreferenceing instead of loop and if + for vlan in &pending_config.network.interfaces { + match &vlan.interface_type { + NetworkInterfaceType::Vlan { parent, .. } => { + if parent == &interface.name { + vlans.push(vlan.name.clone()); + } + } + _ => (), + }; } + context.insert("vlans", &vlans); + + // List all Static Routes for this interface + let mut static_routes = Vec::new(); + // TODO Use Backreferenceing instead of loop and if + for static_route in &pending_config.network.static_routes { + if static_route.interface == interface.name { + static_routes.push(static_route); + } + } + context.insert("static_routes", &static_routes); + + files.push(generate_config_file( + context, + "networkd/config-addressing.network", + format!("70-config-addressing-{}.network", &interface.name), + )?); } - */ + Ok(files) } diff --git a/src/templates/networkd/config-addressing.network b/src/templates/networkd/config-addressing.network new file mode 100644 index 0000000..e6307b6 --- /dev/null +++ b/src/templates/networkd/config-addressing.network @@ -0,0 +1,22 @@ +[Match] +Name={{ name }} + +[Network] +LLMNR=no +{% if interface.addressing_mode is containing("static") -%} +Address={{ interface.addressing_mode.static.address }} +{% elif interface.addressing_mode is containing("dhcp") -%} +DHCP=yes +{% endif -%} +{% for vlan in vlans -%} +VLAN={{ vlan }} +{% endfor -%} + +{% for static_route in static_routes %} +[Route] +Destination={{ static_route.destination }} +Gateway={{ static_route.gateway }} +{% if static_route.metric != 0 -%} +Metric={{ static_route.metric }} +{% endif -%} +{% endfor -%} diff --git a/src/templates/networkd/create-wireguard.netdev b/src/templates/networkd/create-wireguard.netdev new file mode 100644 index 0000000..05f1a9d --- /dev/null +++ b/src/templates/networkd/create-wireguard.netdev @@ -0,0 +1,24 @@ +[NetDev] +Name={{ interface.name }} +Kind=wireguard + +[WireGuard] +ListenPort={{ interface.listen_port }} +PrivateKey={{ interface.private_key }} + +{% for peer in peers -%} +[WireGuardPeer] +PublicKey={{ peer.public_key }} +{% if peer.preshared_key -%} +PresharedKey={{ peer.preshared_key }} +{% endif -%} +{% for allowed_ip in peer.allowed_ips -%} +AllowedIPs={{ allowed_ip }} +{% endfor -%} +{% if peer.endpoint -%} +Endpoint={{ peer.endpoint }} +{% endif -%} +{% if peer.persistent_keepalive -%} +PersistentKeepalive={{ peer.persistent_keepalive }} +{% endif %} +{% endfor %}