From 39b0aee2c9e056b795030e5de0f2f314563b36b2 Mon Sep 17 00:00:00 2001 From: Joywayer Date: Thu, 6 Aug 2026 16:02:22 +0800 Subject: [PATCH] =?UTF-8?q?feat(vps-xray):=20=E6=96=B0=E5=A2=9E=20update?= =?UTF-8?q?=5Fenv=5Ffield=20=E5=B0=B1=E5=9C=B0=E6=9B=B4=E6=96=B0=20.env=20?= =?UTF-8?q?=E5=8D=95=E4=B8=AA=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vps-xray/deploy.sh | 17 +++++++++++++ vps-xray/tests/test-restart-schedule.sh | 34 +++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/vps-xray/deploy.sh b/vps-xray/deploy.sh index 608dbeb..c8f659d 100644 --- a/vps-xray/deploy.sh +++ b/vps-xray/deploy.sh @@ -127,6 +127,23 @@ resolve_restart_config() { return 0 } +# 就地更新 .env 中的单个字段:存在则替换,不存在则追加。 +# 刻意不复用 save_env——后者是 cat > 全量重写,会抹掉用户自己加的注释与字段; +# 轻量入口只该改自己那一行。 +update_env_field() { + local file="$1" key="$2" value="$3" esc + [ -f "$file" ] || return 1 + + if grep -q "^${key}=" "$file"; then + # 用 | 作分隔符,并转义 value 中的 | & \,避免值里的 / 破坏 sed + esc=$(printf '%s' "$value" | sed 's/[|&\\]/\\&/g') + sed -i "s|^${key}=.*|${key}=${esc}|" "$file" + else + printf '%s=%s\n' "$key" "$value" >> "$file" + fi + return 0 +} + resolve_restart_config || exit 1 # 过渡兼容:harden_system / start_service / save_env 仍引用 DAILY_RESTART, diff --git a/vps-xray/tests/test-restart-schedule.sh b/vps-xray/tests/test-restart-schedule.sh index 1066fc2..f8c4b07 100644 --- a/vps-xray/tests/test-restart-schedule.sh +++ b/vps-xray/tests/test-restart-schedule.sh @@ -105,6 +105,40 @@ reset_env; XRAY_RESTART_TIMEZONE="" resolve_restart_config 2>/dev/null is "时区空串报错" "$?" "1" +echo "== update_env_field ==" + +TMP="$(mktemp -d)" +trap 'rm -rf "$TMP"' EXIT + +cat > "${TMP}/.env" << 'ENVEOF' +# 这是用户自己加的注释 +XRAY_PORT=443 +XRAY_RESTART_EVERY_DAYS=0 +# 尾部注释 +ENVEOF + +update_env_field "${TMP}/.env" XRAY_RESTART_EVERY_DAYS 7 +is "替换已有字段" "$(grep '^XRAY_RESTART_EVERY_DAYS=' "${TMP}/.env")" "XRAY_RESTART_EVERY_DAYS=7" +is "保留用户注释" "$(grep -c '这是用户自己加的注释' "${TMP}/.env")" "1" +is "保留尾部注释" "$(grep -c '尾部注释' "${TMP}/.env")" "1" +is "不影响其它字段" "$(grep '^XRAY_PORT=' "${TMP}/.env")" "XRAY_PORT=443" + +update_env_field "${TMP}/.env" XRAY_RESTART_TIME 05:30 +is "追加缺失字段" "$(grep '^XRAY_RESTART_TIME=' "${TMP}/.env")" "XRAY_RESTART_TIME=05:30" + +update_env_field "${TMP}/.env" XRAY_RESTART_TIMEZONE Asia/Shanghai +is "含斜杠的值不被 sed 分隔符干扰" \ + "$(grep '^XRAY_RESTART_TIMEZONE=' "${TMP}/.env")" "XRAY_RESTART_TIMEZONE=Asia/Shanghai" + +update_env_field "${TMP}/.env" XRAY_RESTART_TIMEZONE Europe/Berlin +is "含斜杠的值可被再次替换" \ + "$(grep '^XRAY_RESTART_TIMEZONE=' "${TMP}/.env")" "XRAY_RESTART_TIMEZONE=Europe/Berlin" + +is "字段总行数正确" "$(grep -c '^XRAY_RESTART_TIMEZONE=' "${TMP}/.env")" "1" + +update_env_field "${TMP}/nonexistent" FOO bar 2>/dev/null +is "文件不存在返回 1" "$?" "1" + echo "" echo "通过 ${PASS},失败 ${FAIL}" [ "$FAIL" -eq 0 ]