From 297dc5337385f354ab9859b0eb688691d8eb8dbc Mon Sep 17 00:00:00 2001 From: wnlen <544241974@qq.com> Date: Sat, 17 Jan 2026 19:40:12 +0800 Subject: [PATCH] scripts\clash_profile_conversion.sh start.sh --- scripts/clash_profile_conversion.sh | 25 ++++++++++++++++++++----- start.sh | 21 +++++++++++++++++++++ 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/scripts/clash_profile_conversion.sh b/scripts/clash_profile_conversion.sh index 60faf4e..6e886d5 100644 --- a/scripts/clash_profile_conversion.sh +++ b/scripts/clash_profile_conversion.sh @@ -61,11 +61,26 @@ fi TMP_OUT="$Temp_Dir/.clash_config.converted.yaml" rm -f "$TMP_OUT" 2>/dev/null || true -# 4) 拼接 /sub 参数(尽量通用) -CONVERT_URL="${SUBCONVERTER_URL}/sub?target=${SUB_TARGET}&url=${SUB_URL}" -if [ "$SUB_UDP" = "true" ]; then CONVERT_URL="${CONVERT_URL}&udp=true"; fi -if [ "$SUB_EMOJI" = "true" ]; then CONVERT_URL="${CONVERT_URL}&emoji=true"; fi -if [ "$SUB_SORT" = "true" ]; then CONVERT_URL="${CONVERT_URL}&sort=true"; fi +# 4) 调用 subconverter:用 -G + --data-urlencode,避免 url 参数里含 ? & 导致 400 +# 注意:SUB_URL 必须是原始订阅 URL(例如 https://.../subscribe?token=xxx) +TMP_OUT="${OUT_FILE}.tmp" + +set +e +curl -fsSLG "${SUBCONVERTER_URL}/sub" \ + --data-urlencode "target=${SUB_TARGET}" \ + --data-urlencode "url=${SUB_URL}" \ + -o "${TMP_OUT}" +rc=$? +set -e + +if [ $rc -ne 0 ] || [ ! -s "${TMP_OUT}" ]; then + echo "[WARN] convert failed (rc=${rc}), skip" + rm -f "${TMP_OUT}" 2>/dev/null || true + exit 0 +fi + +mv -f "${TMP_OUT}" "${OUT_FILE}" +echo "[OK] converted via subconverter -> ${OUT_FILE} (target=${SUB_TARGET})" # 5) 执行转换(失败则回退) set +e diff --git a/start.sh b/start.sh index 8b39111..6a8089f 100644 --- a/start.sh +++ b/start.sh @@ -443,6 +443,27 @@ if [ "$SKIP_CONFIG_REBUILD" != "true" ]; then # 3) 强制注入 secret force_write_secret "$CONFIG_FILE" || true + # ========================= + # 配置自检:防止无效订阅导致服务崩溃 + # - 若新生成的 CONFIG_FILE 非法 + # - 自动回退到 conf/config.yaml(上一次可用配置) + # ========================= + BIN="${Server_Dir}/bin/clash-linux-amd64" + NEW_CFG="$CONFIG_FILE" + OLD_CFG="${Conf_Dir}/config.yaml" + + if [ -x "$BIN" ] && [ -f "$NEW_CFG" ]; then + if ! "$BIN" -t -f "$NEW_CFG" >/dev/null 2>&1; then + echo "[ERROR] Generated config invalid, fallback to last good config: $OLD_CFG" >&2 + if [ -f "$OLD_CFG" ]; then + cp -f "$OLD_CFG" "$NEW_CFG" + else + echo "[FATAL] No valid config available, aborting startup" >&2 + exit 1 + fi + fi + fi + echo "[INFO] Runtime config generated: $CONFIG_FILE (size=$(wc -c <"$CONFIG_FILE" 2>/dev/null || echo 0))" else echo "[WARN] Download did not produce clash.yaml (rc=$ReturnStatus), skip runtime config generation" >&2