diff files/fwireguard.in @ 458:09c782570d89

Add a rc.d script "fwireguard" to help with automatic setup of Wireguard interfaces
author Franz Glasner <fzglas.hg@dom66.de>
date Tue, 11 Jun 2024 03:15:54 +0200
parents
children 345f1270e41e
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/files/fwireguard.in	Tue Jun 11 03:15:54 2024 +0200
@@ -0,0 +1,113 @@
+#!/bin/sh
+
+# PROVIDE: fwireguard
+# REQUIRE: NETWORKING
+# KEYWORD: shutdown
+
+# @(#)%%SIMPLEVERSIONTAG%%
+
+#
+# fwireguard_enable (bool):    Set to "YES" to enable wireguard (default: "NO")
+# fwireguard_wait (str):       wait (sleep) this time before calling post-start
+#                              when configuring an interface (default: 2s)
+#
+
+. /etc/rc.subr
+
+name=fwireguard
+desc="Wireguard startup helper"
+rcvar=fwireguard_enable
+extra_commands="reload status"
+
+start_cmd="${name}_start"
+stop_cmd="${name}_stop"
+reload_cmd="${name}_reload"
+status_cmd="${name}_status"
+
+
+load_rc_config $name
+
+
+: ${fwireguard_enable:="NO"}
+: ${fwireguard_wait="2s"}
+
+
+fwireguard_start()
+{
+    local _d _f _if
+    _d="%%PREFIX%%/etc/fwireguard"
+    if [ ! -d "${_d}" ]; then mkdir "${_d}"; fi
+    for _if in `/sbin/ifconfig -g wg`; do
+
+        _f="${_d}/${_if}.key"
+        if [ ! -f "${_f}" ]; then
+            echo "Generating secret key for ${_if} in ${_f}"
+            (umask 0077; /usr/bin/wg genkey > "${_f}")
+        fi
+
+        _f="${_d}/${_if}.pub"
+        if [ ! -f "${_f}" ]; then
+            echo "Generating public key for ${_if} in ${_f}"
+            /usr/bin/wg pubkey < ${_d}/${_if}.key > "${_f}"
+        fi
+
+        _f="${_d}/${_if}.conf"
+        if [ ! -f "${_f}" ]; then
+            echo "Generating minimal config for ${_if} in ${_f}"
+            umask 0077
+            echo "[Interface]"                                  >  "${_f}"
+            /usr/bin/printf 'PrivateKey\t\t= '                  >> "${_f}"
+            /bin/cat "${_d}/${_if}.key"                         >> "${_f}"
+            echo -e "#ListenPort\t\t= 51820"                    >> "${_f}"
+            echo -e "#FwMark\t\t\t= 0x12345678\n"               >> "${_f}"
+            echo "#[Peer]"                                      >> "${_f}"
+            echo -e "#PublicKey\t\t= BlAbLABlA/EtCeTcEtc="      >> "${_f}"
+            echo -e "#AllowedIPs\t\t= 10.X.X.1/32, 10.X.X.2/32" >> "${_f}"
+            echo -e "#PresharedKey\t\t= BlAbLABlA/EtCeTcEtc="   >> "${_f}"
+            echo -e "#Endpoint\t\t= [2001:db8::1]:51820"        >> "${_f}"
+            echo -e "#PersistentKeepalive\t= 30"                >> "${_f}"
+        fi
+
+        /sbin/ifconfig "${_if}" destroy
+        /sbin/ifconfig "${_if}" create    # will take ifconfig_wgX="inet values" from /etc/rc.conf
+        /usr/bin/wg setconf "${_if}" "${_f}"
+        if [ -x "${_d}/${_if}.post-start" ]; then
+            if [ -n "${fwireguard_wait}" ]; then
+                /bin/sleep "${fwireguard_wait}"
+            fi
+            "${_d}/${_if}.post-start"
+        fi
+#       /usr/bin/wg syncconf ${_if} ${_f}
+    done
+}
+
+
+fwireguard_stop()
+{
+    local _d _if
+    _d="%%PREFIX%%/etc/fwireguard"
+    for _if in `/sbin/ifconfig -g wg`; do
+        if [ -x "${_d}/${_if}.pre-stop" ]; then
+            "${_d}/${_if}.pre-stop"
+        fi
+        /sbin/ifconfig "${_if}" down
+    done
+}
+
+
+fwireguard_reload()
+{
+    fwireguard_start
+}
+
+
+fwireguard_status()
+{
+    local _if
+    for _if in `/sbin/ifconfig -g wg`; do
+        /usr/bin/wg show "${_if}"
+    done
+}
+
+
+run_rc_command "$1"