aboutsummaryrefslogtreecommitdiffstats
path: root/modules/scripts/usque-warp
diff options
context:
space:
mode:
Diffstat (limited to 'modules/scripts/usque-warp')
-rw-r--r--modules/scripts/usque-warp/script.sh115
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