#!/bin/bash
# zt_tunnel.sh — 快速隧道守护：建立隧道 → 提取URL → 推飞书 → 保活
# 由 launchd 常驻运行（KeepAlive 崩溃自动重启）
LOG=/tmp/cf_tunnel.log
FEISHU="feishu:oc_12a027e33451d07713cb10b57b933c9c"

while true; do
  ~/bin/cloudflared tunnel --url http://127.0.0.1:8766 > $LOG 2>&1 &
  CFPID=$!
  # 等待 URL 出现（最多 60s）
  URL=""
  for i in $(seq 1 30); do
    sleep 2
    URL=$(grep -oE "https://[a-z0-9-]+\.trycloudflare\.com" $LOG | head -1)
    [ -n "$URL" ] && break
  done
  if [ -z "$URL" ]; then
    echo "$(date) 隧道建立失败，60s后重试" >> $LOG
    kill $CFPID 2>/dev/null
    sleep 60
    continue
  fi
  # 推送飞书（限频：与上次URL相同则不推）
  LAST=$(cat /tmp/cf_last_url 2>/dev/null)
  if [ "$URL" != "$LAST" ]; then
    sleep 3   # 等隧道完全就绪
/Users/xpresso/.hermes/hermes-agent/venv/bin/hermes send --to "$FEISHU" --subject "📊 量化看板·公网地址(已更新)" "🌐 $URL/dashboard.html

任意网络可开(手机/公司WiFi/4G均可)
- 首次加载10-20秒(12MB), 之后秒开
- 每日17:05自动更新数据
- 此地址为本机隧道最新地址, 重启后如有变化会自动推送新地址" 2>/dev/null
    echo "$URL" > /tmp/cf_last_url
  fi
  # 保活监视（2026-09-15 事故: cloudflared 进程活着但隧道被服务端注销「Unauthorized: Tunnel not found」，
  # 它会无限重试且永不退出 → 下面的 wait 永不返回 → 守护脚本永不重建 → 公网地址死掉但无人知道，
  # 用户侧表现为 ERR_NAME_NOT_RESOLVED。故必须主动探测并重启进程。）
  # 探测项均为轻量: 日志计数(本循环已截断 LOG, 故按循环计数) + DNS 解析(0 字节, 直击 ERR_NAME_NOT_RESOLVED)
  HOST=$(echo "$URL" | sed 's|https://||')
  FAILS=0
  while kill -0 $CFPID 2>/dev/null; do
    sleep 60
    kill -0 $CFPID 2>/dev/null || break
    REVOKED=$(grep -c "Tunnel not found" $LOG 2>/dev/null)
    if nslookup "$HOST" > /dev/null 2>&1; then DNS=ok; else DNS=dead; fi
    if [ "${REVOKED:-0}" -gt 2 ] || [ "$DNS" = "dead" ]; then
      FAILS=$((FAILS + 1))
      echo "$(date) 健康检查失败 $FAILS/2 (revoked=$REVOKED dns=$DNS)" >> $LOG
      if [ "$FAILS" -ge 2 ]; then
        echo "$(date) 隧道不可用(revoked=$REVOKED dns=$DNS), 主动重启 cloudflared" >> $LOG
        kill $CFPID 2>/dev/null
        break
      fi
    else
      FAILS=0
    fi
  done
  # 等待隧道进程退出（崩溃/被杀则重启循环）
  wait $CFPID
  echo "$(date) 隧道退出，5s后重建" >> $LOG
  sleep 5
done
