diff options
| author | Arpit Chakladar <arpitchakladar+git@gmail.com> | 2026-07-28 23:49:54 +0530 |
|---|---|---|
| committer | Arpit Chakladar <arpitchakladar+git@gmail.com> | 2026-07-28 23:57:05 +0530 |
| commit | 95f99f52683235606fdc8ce69eafda384017d8f0 (patch) | |
| tree | f5790ca2a85b9237b17b476d8455c70667140c14 /modules/scripts/usque-warp/script.sh | |
| parent | b8b0d5e9c7fb6a7d130dcdd14a51ac51cf539be4 (diff) | |
| download | home-manager-config-95f99f52683235606fdc8ce69eafda384017d8f0.tar.gz home-manager-config-95f99f52683235606fdc8ce69eafda384017d8f0.zip | |
fix(usque-warp): fixed connect and disconnect options
- Previously if the system reboots before disconnect is ran the PID file
lingers and prevented running on the next boot.
- Disconnect replaced the tun0 redirect in ip route to the previous
default route which caused duplicate routes
- disconnect didn't run kill for the usque process with sudo and thus it
failed to kill the process
Diffstat (limited to 'modules/scripts/usque-warp/script.sh')
| -rw-r--r-- | modules/scripts/usque-warp/script.sh | 115 |
1 files changed, 92 insertions, 23 deletions
diff --git a/modules/scripts/usque-warp/script.sh b/modules/scripts/usque-warp/script.sh index 9dc735a..43c89a2 100644 --- a/modules/scripts/usque-warp/script.sh +++ b/modules/scripts/usque-warp/script.sh @@ -1,12 +1,15 @@ +#!/usr/bin/env bash set -euo pipefail CONFIG_DIR="$HOME/.cache/usque" CONFIG="$CONFIG_DIR/config.json" TUN_DEV="tun0" -PID_FILE="/tmp/usque-warp.pid" -STATE_FILE="/tmp/usque-warp.state" -LOG_FILE="/tmp/usque-warp.log" + +RUNTIME_DIR="${XDG_RUNTIME_DIR:-/tmp}" +PID_FILE="$RUNTIME_DIR/usque-warp.pid" +STATE_FILE="$RUNTIME_DIR/usque-warp.state" +LOG_FILE="$RUNTIME_DIR/usque-warp.log" ensure_config() { @@ -34,19 +37,51 @@ ensure_config() { } +remove_tun_default_routes() { + while ip route show | grep -qE "^default .*dev $TUN_DEV"; do + ROUTE=$(ip route show | grep -E "^default .*dev $TUN_DEV" | head -n1) + + echo "Removing route: $ROUTE" + + sudo ip route del $ROUTE || true + done +} + + connect() { ensure_config if [[ -f "$PID_FILE" ]]; then - echo "usque-warp is already running" + OLD_PID=$(cat "$PID_FILE") + + if kill -0 "$OLD_PID" 2>/dev/null; then + echo "usque-warp is already running (PID $OLD_PID)" + exit 1 + else + echo "Removing stale PID file..." + rm -f "$PID_FILE" + fi + fi + + + echo "Saving current default route..." + + DEFAULT_ROUTE=$(ip route show default | grep -v "dev $TUN_DEV" | head -n1) + + if [[ -z "$DEFAULT_ROUTE" ]]; then + echo "Could not determine current default route" exit 1 fi + echo "$DEFAULT_ROUTE" > "$STATE_FILE" + + echo "Starting usque..." sudo usque nativetun -c "$CONFIG" >"$LOG_FILE" 2>&1 & echo $! > "$PID_FILE" + echo "Waiting for MASQUE connection..." MASQUE_IP="" @@ -55,36 +90,53 @@ connect() { MASQUE_IP=$(grep -oP 'MASQUE connection to \K[0-9.]+(?=:443)' "$LOG_FILE" 2>/dev/null || true) if [[ -n "$MASQUE_IP" ]]; then - break + break fi sleep 1 -done + done + if [[ -z "$MASQUE_IP" ]]; then echo "Failed to detect MASQUE endpoint" - kill "$(cat "$PID_FILE")" || true - rm "$PID_FILE" + + kill "$(cat "$PID_FILE")" 2>/dev/null || true + rm -f "$PID_FILE" + exit 1 fi - DEFAULT_ROUTE=$(ip route show default | head -n1) GATEWAY=$(echo "$DEFAULT_ROUTE" | awk '{for(i=1;i<=NF;i++) if($i=="via") print $(i+1)}') INTERFACE=$(echo "$DEFAULT_ROUTE" | awk '{for(i=1;i<=NF;i++) if($i=="dev") print $(i+1)}') + if [[ -z "$GATEWAY" || -z "$INTERFACE" ]]; then - echo "Cannot determine gateway" + echo "Cannot determine gateway/interface" exit 1 fi - echo "$GATEWAY $INTERFACE $MASQUE_IP" > "$STATE_FILE" + + echo "$MASQUE_IP $GATEWAY $INTERFACE" >> "$STATE_FILE" + echo "Allowing MASQUE endpoint outside tunnel..." - sudo ip route replace "$MASQUE_IP" via "$GATEWAY" dev "$INTERFACE" + + sudo ip route replace \ + "$MASQUE_IP" \ + via "$GATEWAY" \ + dev "$INTERFACE" + + + echo "Removing old tun routes..." + + remove_tun_default_routes + echo "Switching default route to tun0..." - sudo ip route replace default dev "$TUN_DEV" metric 1 + + sudo ip route add default dev "$TUN_DEV" metric 1 + echo "Connected" } @@ -93,24 +145,39 @@ done disconnect() { echo "Disconnecting..." - if [[ -f "$STATE_FILE" ]]; then - read GATEWAY INTERFACE MASQUE_IP < "$STATE_FILE" + echo "Removing tun routes..." + + while ip route show | grep -qE "^default .*dev $TUN_DEV"; do + ROUTE=$(ip route show | grep -E "^default .*dev $TUN_DEV" | head -n1) + + echo "Removing route: $ROUTE" + + sudo ip route del $ROUTE || true + done - echo "Restoring normal route..." - sudo ip route replace default via "$GATEWAY" dev "$INTERFACE" + if [[ -f "$STATE_FILE" ]]; then + MASQUE_IP=$(grep -oP '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' "$STATE_FILE" | head -n1 || true) - sudo ip route del "$MASQUE_IP" 2>/dev/null || true + if [[ -n "$MASQUE_IP" ]]; then + echo "Removing MASQUE route: $MASQUE_IP" + sudo ip route del "$MASQUE_IP" 2>/dev/null || true + fi - rm "$STATE_FILE" + rm -f "$STATE_FILE" fi + if [[ -f "$PID_FILE" ]]; then - kill "$(cat "$PID_FILE")" 2>/dev/null || true - rm "$PID_FILE" - fi + PID=$(cat "$PID_FILE") - sudo ip route del default dev "$TUN_DEV" 2>/dev/null || true + if kill -0 "$PID" 2>/dev/null; then + echo "Stopping usque..." + sudo kill "$PID" 2>/dev/null || true + fi + + rm -f "$PID_FILE" + fi echo "Disconnected" } @@ -120,9 +187,11 @@ case "${1:-}" in connect) connect ;; + disconnect) disconnect ;; + *) echo "Usage: $0 {connect|disconnect}" exit 1 |
