#!/usr/bin/env bash set -euo pipefail # Check for existing Tor daemon (env var or default port 9050) EXISTING_TOR_PORT="${TOR_SOCKS_PORT:-9050}" if nc -z 127.0.0.1 "$EXISTING_TOR_PORT" 2>/dev/null; then # Use existing Tor daemon - no startup/cleanup needed export TORSOCKS_TOR_PORT=$EXISTING_TOR_PORT if [[ "$(uname)" == "Darwin" ]]; then if [[ "$1" == "ssh" ]]; then shift exec ssh -o ProxyCommand="nc -x 127.0.0.1:$EXISTING_TOR_PORT %h %p" "$@" else exec torsocks "$@" fi else exec torsocks "$@" fi fi # Create temporary directory for this tor instance TOR_DIR=$(mktemp -d -t tornade.XXXXXX) # Generate random ports in ephemeral range (49152-65535) to avoid collisions SOCKS_PORT=$((49152 + RANDOM % 16383)) CONTROL_PORT=$((SOCKS_PORT + 1)) # Track tor PID for cleanup TOR_PID="" # Cleanup function - must be defined before trap cleanup() { if [ -n "$TOR_PID" ] && kill -0 "$TOR_PID" 2>/dev/null; then kill "$TOR_PID" 2>/dev/null || true wait "$TOR_PID" 2>/dev/null || true fi rm -rf "$TOR_DIR" } trap cleanup EXIT INT TERM # Create tor configuration cat > "$TOR_DIR/torrc" <