feat(vps-xray): 生成 timer/service/guard 三个单元文件
timer 每天唤醒,N 天间隔判断交给 guard 脚本, 绕开 OnCalendar 无法表达任意 N 天间隔的限制。
This commit is contained in:
@@ -144,6 +144,59 @@ update_env_field "${TMP}/.env2" NEWKEY val
|
||||
is "缺尾换行时不黏连" "$(grep -c '^NEWKEY=val$' "${TMP}/.env2")" "1"
|
||||
is "缺尾换行时原字段完好" "$(grep -c '^KEY=old$' "${TMP}/.env2")" "1"
|
||||
|
||||
echo "== render_restart_units =="
|
||||
|
||||
SYSTEMD_DIR="${TMP}/systemd"
|
||||
GUARD_BIN="${TMP}/bin/xray-restart-guard"
|
||||
RESTART_STATE_FILE="${TMP}/state/last-restart"
|
||||
mkdir -p "${TMP}/systemd" "${TMP}/bin" "${TMP}/state"
|
||||
|
||||
# systemctl 打桩:记录被调用的参数,避免碰真实 systemd
|
||||
STUB="${TMP}/stub"
|
||||
mkdir -p "$STUB"
|
||||
cat > "${STUB}/systemctl" << 'STUBEOF'
|
||||
#!/bin/sh
|
||||
echo "systemctl $*" >> "${SYSTEMCTL_LOG}"
|
||||
STUBEOF
|
||||
chmod 755 "${STUB}/systemctl"
|
||||
export SYSTEMCTL_LOG="${TMP}/systemctl.log"
|
||||
: > "$SYSTEMCTL_LOG"
|
||||
export PATH="${STUB}:${PATH}"
|
||||
|
||||
render_restart_units 7 04:00 Asia/Shanghai
|
||||
|
||||
is "timer 文件存在" "$([ -f "${SYSTEMD_DIR}/xray-restart.timer" ] && echo yes)" "yes"
|
||||
is "service 文件存在" "$([ -f "${SYSTEMD_DIR}/xray-restart.service" ] && echo yes)" "yes"
|
||||
is "guard 可执行" "$([ -x "$GUARD_BIN" ] && echo yes)" "yes"
|
||||
|
||||
is "OnCalendar 每天触发" \
|
||||
"$(grep -c '^OnCalendar=\*-\*-\* 04:00:00$' "${SYSTEMD_DIR}/xray-restart.timer")" "1"
|
||||
is "TimeZone 写入" \
|
||||
"$(grep -c '^TimeZone=Asia/Shanghai$' "${SYSTEMD_DIR}/xray-restart.timer")" "1"
|
||||
is "Persistent 开启" \
|
||||
"$(grep -c '^Persistent=true$' "${SYSTEMD_DIR}/xray-restart.timer")" "1"
|
||||
is "service 指向 guard" \
|
||||
"$(grep -c "^ExecStart=${GUARD_BIN}\$" "${SYSTEMD_DIR}/xray-restart.service")" "1"
|
||||
is "guard 里天数正确" \
|
||||
"$(grep -c '^DAYS=7$' "$GUARD_BIN")" "1"
|
||||
is "guard 里状态文件路径正确" \
|
||||
"$(grep -c "^STATE=\"${RESTART_STATE_FILE}\"\$" "$GUARD_BIN")" "1"
|
||||
is "guard 用 PATH 查找 systemctl 而非绝对路径" \
|
||||
"$(grep -c '^exec systemctl restart xray$' "$GUARD_BIN")" "1"
|
||||
|
||||
render_restart_units 3 23:05 Europe/Berlin
|
||||
is "重复渲染覆盖天数" "$(grep -c '^DAYS=3$' "$GUARD_BIN")" "1"
|
||||
is "重复渲染覆盖时间" \
|
||||
"$(grep -c '^OnCalendar=\*-\*-\* 23:05:00$' "${SYSTEMD_DIR}/xray-restart.timer")" "1"
|
||||
|
||||
remove_restart_units
|
||||
is "remove 后 timer 消失" "$([ -f "${SYSTEMD_DIR}/xray-restart.timer" ] && echo yes || echo no)" "no"
|
||||
is "remove 后 service 消失" "$([ -f "${SYSTEMD_DIR}/xray-restart.service" ] && echo yes || echo no)" "no"
|
||||
is "remove 后 guard 消失" "$([ -f "$GUARD_BIN" ] && echo yes || echo no)" "no"
|
||||
|
||||
remove_restart_units
|
||||
is "重复 remove 返回 1" "$?" "1"
|
||||
|
||||
echo ""
|
||||
echo "通过 ${PASS},失败 ${FAIL}"
|
||||
[ "$FAIL" -eq 0 ]
|
||||
|
||||
Reference in New Issue
Block a user