feat(vps-xray): 新增 update_env_field 就地更新 .env 单个字段
This commit is contained in:
@@ -127,6 +127,23 @@ resolve_restart_config() {
|
|||||||
return 0
|
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
|
resolve_restart_config || exit 1
|
||||||
|
|
||||||
# 过渡兼容:harden_system / start_service / save_env 仍引用 DAILY_RESTART,
|
# 过渡兼容:harden_system / start_service / save_env 仍引用 DAILY_RESTART,
|
||||||
|
|||||||
@@ -105,6 +105,40 @@ reset_env; XRAY_RESTART_TIMEZONE=""
|
|||||||
resolve_restart_config 2>/dev/null
|
resolve_restart_config 2>/dev/null
|
||||||
is "时区空串报错" "$?" "1"
|
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 ""
|
||||||
echo "通过 ${PASS},失败 ${FAIL}"
|
echo "通过 ${PASS},失败 ${FAIL}"
|
||||||
[ "$FAIL" -eq 0 ]
|
[ "$FAIL" -eq 0 ]
|
||||||
|
|||||||
Reference in New Issue
Block a user