mirror of
https://github.com/wnlen/clash-for-linux.git
synced 2026-02-04 10:11:28 +08:00
Update start.sh
This commit is contained in:
62
start.sh
62
start.sh
@ -212,6 +212,57 @@ force_write_controller_and_ui() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fix_external_ui_by_safe_paths() {
|
||||||
|
local bin="$1"
|
||||||
|
local cfg="$2"
|
||||||
|
local test_out="$3"
|
||||||
|
local ui_src="${UI_SRC_DIR:-$Server_Dir/dashboard/public}"
|
||||||
|
|
||||||
|
[ -x "$bin" ] || return 0
|
||||||
|
[ -s "$cfg" ] || return 0
|
||||||
|
|
||||||
|
# 先跑一次 test,把原因写入 test_out
|
||||||
|
"$bin" -t -f "$cfg" >"$test_out" 2>&1
|
||||||
|
local rc=$?
|
||||||
|
[ $rc -eq 0 ] && return 0
|
||||||
|
|
||||||
|
# 只处理 external-ui 的 SAFE_PATH 报错
|
||||||
|
if ! grep -q "SAFE_PATHS" "$test_out"; then
|
||||||
|
return $rc
|
||||||
|
fi
|
||||||
|
if ! grep -q "external-ui" "$cfg" && ! grep -q "external-ui" "$test_out"; then
|
||||||
|
return $rc
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 从 test_out 抽取 allowed paths 的第一个 base
|
||||||
|
# 例:allowed paths: [/opt/clash-for-linux/.config/mihomo]
|
||||||
|
local base
|
||||||
|
base="$(sed -n 's/.*allowed paths: \[\([^]]*\)\].*/\1/p' "$test_out" | head -n 1)"
|
||||||
|
|
||||||
|
[ -n "$base" ] || return $rc
|
||||||
|
|
||||||
|
# external-ui 必须在 allowed base 的子目录里
|
||||||
|
local ui_dst="$base/ui"
|
||||||
|
mkdir -p "$ui_dst" 2>/dev/null || true
|
||||||
|
|
||||||
|
# 把 UI 文件同步过去(真实目录,不用软链,避免跳出 base)
|
||||||
|
if [ -d "$ui_src" ]; then
|
||||||
|
if command -v rsync >/dev/null 2>&1; then
|
||||||
|
rsync -a --delete "$ui_src"/ "$ui_dst"/ 2>/dev/null || true
|
||||||
|
else
|
||||||
|
rm -rf "$ui_dst"/* 2>/dev/null || true
|
||||||
|
cp -a "$ui_src"/. "$ui_dst"/ 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 重写 external-ui 到新目录
|
||||||
|
upsert_yaml_kv "$cfg" "external-ui" "$ui_dst" || true
|
||||||
|
|
||||||
|
# 再 test 一次
|
||||||
|
"$bin" -t -f "$cfg" >"$test_out" 2>&1
|
||||||
|
return $?
|
||||||
|
}
|
||||||
|
|
||||||
# 设置默认值
|
# 设置默认值
|
||||||
CLASH_HTTP_PORT="${CLASH_HTTP_PORT:-7890}"
|
CLASH_HTTP_PORT="${CLASH_HTTP_PORT:-7890}"
|
||||||
CLASH_SOCKS_PORT="${CLASH_SOCKS_PORT:-7891}"
|
CLASH_SOCKS_PORT="${CLASH_SOCKS_PORT:-7891}"
|
||||||
@ -544,17 +595,18 @@ if [ "$SKIP_CONFIG_REBUILD" != "true" ]; then
|
|||||||
OLD_CFG="${Conf_Dir}/config.yaml"
|
OLD_CFG="${Conf_Dir}/config.yaml"
|
||||||
TEST_OUT="$Temp_Dir/config.test.out"
|
TEST_OUT="$Temp_Dir/config.test.out"
|
||||||
|
|
||||||
if [ -x "$BIN" ] && [ -f "$NEW_CFG" ]; then
|
TEST_OUT="$Temp_Dir/config.test.out"
|
||||||
: >"$TEST_OUT"
|
|
||||||
|
|
||||||
|
if [ -x "$BIN" ] && [ -f "$NEW_CFG" ]; then
|
||||||
|
# 先尝试自动修复 external-ui 的 SAFE_PATH 问题(内部会跑 -t)
|
||||||
set +e
|
set +e
|
||||||
"$BIN" -t -f "$NEW_CFG" >"$TEST_OUT" 2>&1
|
fix_external_ui_by_safe_paths "$BIN" "$NEW_CFG" "$TEST_OUT"
|
||||||
test_rc=$?
|
test_rc=$?
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
if [ $test_rc -ne 0 ]; then
|
if [ "$test_rc" -ne 0 ]; then
|
||||||
echo "[ERROR] Generated config invalid, rc=$test_rc, reason(file=$TEST_OUT, size=$(wc -c <"$TEST_OUT" 2>/dev/null || echo 0))" >&2
|
echo "[ERROR] Generated config invalid, rc=$test_rc, reason(file=$TEST_OUT, size=$(wc -c <"$TEST_OUT" 2>/dev/null || echo 0))" >&2
|
||||||
tail -n 200 "$TEST_OUT" >&2
|
tail -n 120 "$TEST_OUT" >&2 || true
|
||||||
|
|
||||||
echo "[ERROR] fallback to last good config: $OLD_CFG" >&2
|
echo "[ERROR] fallback to last good config: $OLD_CFG" >&2
|
||||||
if [ -f "$OLD_CFG" ]; then
|
if [ -f "$OLD_CFG" ]; then
|
||||||
|
|||||||
Reference in New Issue
Block a user