#!/bin/sh
# TunnelBox v0.1 — 把本机服务一键穿透到公网 HTTPS (基于 cloudflared quick tunnel, 免费零配置)
# 用法: tunnel-box.sh <本地端口> [本地地址]
#   例: tunnel-box.sh 8080          → 暴露 http://127.0.0.1:8080
set -e

PORT=${1:?用法: tunnel-box.sh <本地端口> [本地地址]}
HOST=${2:-127.0.0.1}

# 找/装 cloudflared
if ! command -v cloudflared >/dev/null 2>&1; then
  echo "[TunnelBox] 未找到 cloudflared, 尝试自动安装..."
  case "$(uname -s)" in
    Linux)
      [ "$(uname -m)" = "x86_64" ] && ARCH=amd64 || ARCH=arm64
      curl -fsSL -o /tmp/cloudflared "https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-${ARCH}" || {
        echo "[TunnelBox] 下载失败, 请手动安装: https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/"; exit 1; }
      chmod +x /tmp/cloudflared
      [ -w /usr/local/bin ] && mv /tmp/cloudflared /usr/local/bin/cloudflared || CLOUDFLARED=/tmp/cloudflared
      ;;
    Darwin) brew install cloudflared ;;
    *) echo "[TunnelBox] 请手动安装 cloudflared"; exit 1 ;;
  esac
fi
CF=cloudflared; [ -n "${CLOUDFLARED:-}" ] && CF=$CLOUDFLARED
command -v $CF >/dev/null 2>&1 || { echo "[TunnelBox] cloudflared 不可用"; exit 1; }

# 检查本地服务活着
if ! (exec 3<>/dev/tcp/$HOST/$PORT) 2>/dev/null; then
  echo "[TunnelBox] ⚠ 本地 $HOST:$PORT 没有服务在监听, 仍继续建隧道"
fi

echo "[TunnelBox] 正在建立隧道 → $HOST:$PORT (Ctrl+C 断开)"
OUT=$($CF tunnel --url "http://$HOST:$PORT" 2>&1 | tee /dev/stderr | grep -m1 -o 'https://[a-z0-9-]*\.trycloudflare\.com')
if [ -n "$OUT" ]; then
  echo ""
  echo "=============================="
  echo " ✅ 公网地址: $OUT"
  echo " ⚠ 临时地址, 进程断开即失效; 任何人拿到都能访问, 注意别暴露敏感服务"
  echo "=============================="
fi
