Fix env_check_apply_fixes under partial fix needs
The function used a chain of `(( NEED_X == 1 )) && { ... }` statements.
When the last flag is 0 the trailing arithmetic evaluates to false and
bash returns 1 from the function. Under the main script's `set -e` that
propagates up to bootstrap which exits with the misleading "line 60"
ERR trap right after the installer announces it is going to create the
state directory.
Rewrite the body as plain `if` blocks and return 0 explicitly. Add two
regression assertions that exercise the "only some flags set" and
"nothing to do" paths so the class of bug is caught in CI.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -156,9 +156,20 @@ SYSCTL
|
|||||||
}
|
}
|
||||||
|
|
||||||
env_check_apply_fixes() {
|
env_check_apply_fixes() {
|
||||||
(( ENV_CHECK_NEED_PACKAGES == 1 )) && { log_info '正在安装缺失软件包...'; _env_install_packages || return 1; }
|
if (( ENV_CHECK_NEED_PACKAGES == 1 )); then
|
||||||
(( ENV_CHECK_NEED_STORAGE == 1 )) && { log_info '正在创建状态目录...'; mkdir -p "${IPF_STORAGE_DIR}"; chmod 750 "${IPF_STORAGE_DIR}"; }
|
log_info '正在安装缺失软件包...'
|
||||||
(( ENV_CHECK_NEED_SYSCTL == 1 )) && { log_info '正在写入 sysctl 配置并启用转发...'; _env_write_sysctl || return 1; }
|
_env_install_packages || return 1
|
||||||
|
fi
|
||||||
|
if (( ENV_CHECK_NEED_STORAGE == 1 )); then
|
||||||
|
log_info '正在创建状态目录...'
|
||||||
|
mkdir -p "${IPF_STORAGE_DIR}"
|
||||||
|
chmod 750 "${IPF_STORAGE_DIR}"
|
||||||
|
fi
|
||||||
|
if (( ENV_CHECK_NEED_SYSCTL == 1 )); then
|
||||||
|
log_info '正在写入 sysctl 配置并启用转发...'
|
||||||
|
_env_write_sysctl || return 1
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
env_check_all() {
|
env_check_all() {
|
||||||
|
|||||||
@@ -126,4 +126,19 @@ export IPF_TEST_INPUTS=$'n\n'
|
|||||||
|
|
||||||
assert_eq '3' "$(status_of env_check_all)" 'env_check_all should return 3 when user rejects autofix'
|
assert_eq '3' "$(status_of env_check_all)" 'env_check_all should return 3 when user rejects autofix'
|
||||||
|
|
||||||
|
# Regression: env_check_apply_fixes must return 0 even when the last flag is 0.
|
||||||
|
# 之前写成 `(( NEED_SYSCTL == 1 )) && { ... }`,NEED_SYSCTL=0 时函数返回 1,
|
||||||
|
# 外层 set -e 直接把脚本打死。
|
||||||
|
ENV_CHECK_NEED_PACKAGES=1
|
||||||
|
ENV_CHECK_NEED_STORAGE=0
|
||||||
|
ENV_CHECK_NEED_SYSCTL=0
|
||||||
|
assert_eq '0' "$(status_of env_check_apply_fixes)" \
|
||||||
|
'env_check_apply_fixes should return 0 when only some fixes are needed'
|
||||||
|
|
||||||
|
ENV_CHECK_NEED_PACKAGES=0
|
||||||
|
ENV_CHECK_NEED_STORAGE=0
|
||||||
|
ENV_CHECK_NEED_SYSCTL=0
|
||||||
|
assert_eq '0' "$(status_of env_check_apply_fixes)" \
|
||||||
|
'env_check_apply_fixes should return 0 when no fixes are needed'
|
||||||
|
|
||||||
pass 'test_env_check.sh'
|
pass 'test_env_check.sh'
|
||||||
|
|||||||
Reference in New Issue
Block a user