#!/usr/bin/env bash # Updates an existing wireguard-ui-multi installation: pulls the latest # source, rebuilds frontend assets + binary if needed, reinstalls, and # restarts the service. # # Usage (as root): # cd /opt/wireguard-ui-multi-src && ./update.sh # or from anywhere: # /opt/wireguard-ui-multi-src/update.sh --src-dir /opt/wireguard-ui-multi-src set -euo pipefail SRC_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REF="main" RESTART=1 while [[ $# -gt 0 ]]; do case "$1" in --src-dir) SRC_DIR="$2"; shift 2 ;; --ref) REF="$2"; shift 2 ;; --no-restart) RESTART=0; shift ;; -h|--help) echo "Usage: $0 [--src-dir ] [--ref ] [--no-restart]" >&2 exit 1 ;; *) echo "Unknown option: $1" >&2; exit 1 ;; esac done if [[ "$(id -u)" -ne 0 ]]; then echo "Must run as root (rebuilds and reinstalls the service)." >&2 exit 1 fi export PATH="/usr/local/go/bin:/usr/local/bin:$PATH" if [[ ! -d "$SRC_DIR/.git" ]]; then echo "No git checkout found at $SRC_DIR. Run bootstrap.sh first." >&2 exit 1 fi echo "Fetching latest $REF..." git -C "$SRC_DIR" fetch --depth 1 origin "$REF" BEFORE="$(git -C "$SRC_DIR" rev-parse HEAD)" PREV_PACKAGE_JSON_HASH="$(sha256sum "$SRC_DIR/package.json" 2>/dev/null | awk '{print $1}')" git -C "$SRC_DIR" checkout "$REF" git -C "$SRC_DIR" reset --hard "origin/$REF" AFTER="$(git -C "$SRC_DIR" rev-parse HEAD)" NEW_PACKAGE_JSON_HASH="$(sha256sum "$SRC_DIR/package.json" 2>/dev/null | awk '{print $1}')" if [[ "$BEFORE" == "$AFTER" ]]; then echo "Already up to date ($AFTER)." else echo "Updated $BEFORE -> $AFTER" fi cd "$SRC_DIR" if [[ "$PREV_PACKAGE_JSON_HASH" != "$NEW_PACKAGE_JSON_HASH" ]] || [[ ! -d assets/dist ]]; then echo "Frontend dependencies changed (or assets missing), rebuilding assets..." if ! command -v yarn >/dev/null 2>&1; then echo "yarn not found; install nodejs/npm/yarn first (see bootstrap.sh)." >&2 exit 1 fi bash prepare_assets.sh fi echo "Rebuilding binary..." go mod tidy CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o wireguard-ui . echo "Reinstalling..." bash scripts/install.sh if [[ "$RESTART" -eq 1 ]]; then if systemctl is-enabled --quiet wireguard-ui-multi.service 2>/dev/null || systemctl is-active --quiet wireguard-ui-multi.service 2>/dev/null; then echo "Restarting wireguard-ui-multi.service to pick up the new binary..." systemctl restart wireguard-ui-multi.service systemctl status --no-pager wireguard-ui-multi.service else echo "Service not enabled/active yet, skipping restart. Start it with:" echo " systemctl enable --now wireguard-ui-multi.service" fi else echo "Skipping restart (--no-restart). Restart manually with:" echo " systemctl restart wireguard-ui-multi.service" fi echo echo "Update complete."