Files
wireguard-ui/src/scripts/wg-quick-manage.sh
T
2026-09-20 04:14:32 +01:00

88 lines
2.3 KiB
Bash
Executable File

#!/bin/bash
# Manages a single wireguard-ui host tunnel directly with wg-quick.
#
# This project deliberately avoids /etc/wireguard entirely so it can never
# collide with an existing WireGuard setup. Host configs live under
# /var/lib/wgui/hosts and the web server brings tunnels up/down through this
# helper instead of systemd. Interfaces follow the project convention
# wgui<host_id> (e.g. wgui0), never stock names like wg0.
#
# Usage: wg-quick-manage.sh <up|down|restart> <interface> <config-path>
# action up bring the tunnel up if it is not already up
# down bring the tunnel down if it is up
# restart down (if needed), then up
# interface e.g. wgui0 — must match wgui[0-9]+ (project convention)
# config-path must be /var/lib/wgui/hosts/<interface>.conf
#
# Designed to run as root only (the web server runs as root).
set -euo pipefail
ACTION="${1:-}"
INTERFACE="${2:-}"
CONFIG_PATH="${3:-}"
if [ -z "$ACTION" ] || [ -z "$INTERFACE" ] || [ -z "$CONFIG_PATH" ]; then
echo "usage: $0 <up|down|restart> <interface> <config-path>" >&2
exit 1
fi
if [[ ! "$INTERFACE" =~ ^wgui[0-9]+$ ]]; then
echo "error: refusing to manage non-project interface '$INTERFACE' (expected wgui[0-9]+)" >&2
exit 1
fi
case "$ACTION" in
up | down | restart) ;;
*)
echo "error: unknown action '$ACTION' (expected up, down, or restart)" >&2
exit 1
;;
esac
# EXPECTED_CONFIG_PATH="/var/lib/wgui/hosts/${INTERFACE}.conf"
# if [ "$CONFIG_PATH" != "$EXPECTED_CONFIG_PATH" ]; then
# echo "error: config path must be $EXPECTED_CONFIG_PATH" >&2
# exit 1
# fi
WG_QUICK_BIN="$(command -v wg-quick)"
if [ -z "$WG_QUICK_BIN" ]; then
echo "error: wg-quick not found — run setup-wireguard.sh first" >&2
exit 1
fi
interface_is_up() {
ip link show dev "$INTERFACE" >/dev/null 2>&1
}
bring_up() {
if interface_is_up; then
echo "interface $INTERFACE is already up — nothing to do."
return 0
fi
"$WG_QUICK_BIN" up "$CONFIG_PATH"
}
bring_down() {
if ! interface_is_up; then
echo "interface $INTERFACE is not up — nothing to do."
return 0
fi
"$WG_QUICK_BIN" down "$CONFIG_PATH"
}
case "$ACTION" in
up)
bring_up
;;
down)
bring_down
;;
restart)
bring_down
bring_up
;;
esac