From 830d62ead89b3a638bb187ef1920f4da004a5610 Mon Sep 17 00:00:00 2001 From: hotyue <52734432+hotyue@users.noreply.github.com> Date: Sun, 26 Apr 2026 08:31:23 +0000 Subject: [PATCH] =?UTF-8?q?fix(core):=20=E5=BC=95=E5=85=A5=204=20=E7=A7=92?= =?UTF-8?q?=E6=9E=81=E9=80=9F=E9=A2=84=E6=A3=80(Fail-Fast)=E6=9C=BA?= =?UTF-8?q?=E5=88=B6=E5=BD=BB=E5=BA=95=E6=A0=B9=E9=99=A4=E5=A4=8D=E6=9D=82?= =?UTF-8?q?=E8=B7=AF=E7=94=B1=E4=B8=8B=E7=9A=84=E6=8E=A2=E9=92=88=E6=AD=BB?= =?UTF-8?q?=E7=AD=89=E5=81=87=E6=AD=BB=EF=BC=8C=E5=B9=B6=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E4=B8=89=E7=BA=A7=E5=AE=B9=E7=81=BE=E6=89=93=E9=9D=B6=E7=AD=96?= =?UTF-8?q?=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/mod_quality.sh | 68 ++++++++++++++++++++++++++++++--------------- 1 file changed, 45 insertions(+), 23 deletions(-) diff --git a/core/mod_quality.sh b/core/mod_quality.sh index f63f6fb..7a649c7 100755 --- a/core/mod_quality.sh +++ b/core/mod_quality.sh @@ -52,34 +52,56 @@ if [ ! -s "$PROBE_SCRIPT" ]; then chmod +x "$PROBE_SCRIPT" 2>/dev/null fi -# 封装打靶与清洗逻辑为函数 -execute_probe() { - IP_ADDR="" - JSON_DATA="" - RAW_OUTPUT=$(timeout 180 bash "$PROBE_SCRIPT" "$@" 2>/dev/null) - JSON_DATA="{${RAW_OUTPUT#*\{}" - ESC=$(printf '\033') - JSON_DATA=$(printf "%s" "$JSON_DATA" | sed -e "s/${ESC}\[[0-9;]*[a-zA-Z]//g" -e "s/${ESC}[0-9;]*[a-zA-Z]//g" -e "s/x1b\\[[0-9;]*[a-zA-Z]//g" -e "s/x1b[0-9;]*[a-zA-Z]//g") - IP_ADDR=$(echo "$JSON_DATA" | jq -r '.Head.IP // empty' 2>/dev/null) +# ========================================== +# 3. 极速预检与容灾打靶系统 +# ========================================== + +# 封装链路预检函数 (4秒极速探路,拒绝死等) +preflight_check() { + local curl_args=("-s" "-m" "4") + # 提取网卡和协议约束 + for ((i=1; i<=$#; i++)); do + if [[ "${!i}" == "-i" ]]; then + local next=$((i+1)) + curl_args+=("--interface" "${!next}") + elif [[ "${!i}" == "-4" ]]; then + curl_args+=("-4") + elif [[ "${!i}" == "-6" ]]; then + curl_args+=("-6") + fi + done + # 验证该路由设置是否能成功连通外部网络 + curl "${curl_args[@]}" "https://www.cloudflare.com/cdn-cgi/trace" >/dev/null 2>&1 + return $? } -# 🚀 首轮实弹打靶 (严格遵守 BIND_IP 与动态协议配置) -execute_probe "${PROBE_ARGS[@]}" - -# 🚑 容灾阶梯 1:剥离物理网卡枷锁 -# 针对多 IP 站群机,如果 -i 参数导致 WARP 等复杂路由死锁 -if [ -z "$IP_ADDR" ] && [[ "${PROBE_ARGS[*]}" == *"-i"* ]]; then +# 📡 寻路雷达:测定哪一组参数可以走通 +FINAL_ARGS=() +if preflight_check "${PROBE_ARGS[@]}"; then + # 阶梯 0: 原定参数 (带 BIND_IP 和协议) 通畅 + FINAL_ARGS=("${PROBE_ARGS[@]}") +else + # 阶梯 1: 剥离物理网卡限制,只保留协议限制 FALLBACK_ARGS=("-y" "-j" "-${DYNAMIC_IP_PREF}") - execute_probe "${FALLBACK_ARGS[@]}" + if preflight_check "${FALLBACK_ARGS[@]}"; then + FINAL_ARGS=("${FALLBACK_ARGS[@]}") + else + # 阶梯 2: 终极裸跑 (不限网卡,不限协议) + FINAL_ARGS=("-y" "-j") + fi fi -# 🚑 容灾阶梯 2:终极裸跑抢救 -# 针对 EUSERV 这种极端机器,强加协议参数 (-4/-6) 可能反而导致探针内部测速路由瘫痪。 -# 彻底退化为最原始的无参状态,完全交由系统内核自主决断 -if [ -z "$IP_ADDR" ]; then - NAKED_ARGS=("-y" "-j") - execute_probe "${NAKED_ARGS[@]}" -fi +# ========================================== +# 4. 终极实弹打靶 +# ========================================== + +# 此时 FINAL_ARGS 已经被证实是连通的,我们只执行 1 次 ip.sh +# 将超时放宽至 300 秒,给第三方 API (如 ipregistry) 充足的响应时间 +RAW_OUTPUT=$(timeout 300 bash "$PROBE_SCRIPT" "${FINAL_ARGS[@]}" 2>/dev/null) +JSON_DATA="{${RAW_OUTPUT#*\{}" +ESC=$(printf '\033') +JSON_DATA=$(printf "%s" "$JSON_DATA" | sed -e "s/${ESC}\[[0-9;]*[a-zA-Z]//g" -e "s/${ESC}[0-9;]*[a-zA-Z]//g" -e "s/x1b\\[[0-9;]*[a-zA-Z]//g" -e "s/x1b[0-9;]*[a-zA-Z]//g") +IP_ADDR=$(echo "$JSON_DATA" | jq -r '.Head.IP // empty' 2>/dev/null) if [ -z "$IP_ADDR" ]; then curl -s -X POST "${TG_API_URL}" \