# -*- coding: utf-8 -*- """修看门狗测试的断言。 错在哪:我用 `NRestarts` 判断看门狗有没有重启隧道。 但 `NRestarts` **只统计 Restart=always 的自动重启**, `systemctl restart` 这种手动重启不算在里面 —— 所以永远看到 0。 该看的是: * 看门狗日志里有没有「连续 3 次不通 -> 重启隧道」 * 地址有没有变(变了就说明隧道被重启并重新申请了地址) """ from __future__ import annotations import sys from pathlib import Path TARGET = Path(r"C:\Users\shu\Desktop\deepseekagent\LanRemote\_build" r"\test_watchdog_restart.sh") OLD_JUDGE = '''if [ "$AFTER" -gt "$BEFORE" ]; then echo " ✓ 看门狗确实触发了隧道重启" else echo " ✗ 看门狗没重启隧道 —— 逻辑有问题" fi''' NEW_JUDGE = '''# 注意:NRestarts 只统计 Restart=always 的**自动**重启, # 不含 systemctl restart 的手动重启。所以不能拿它判断。 # 该看的是:日志里有没有「连续 3 次不通」,以及地址有没有变。 if grep -q "连续 3 次不通" "$RELAY_DIR/watchdog.log" 2>/dev/null; then echo " ✓ 看门狗日志里有「连续 3 次不通 -> 重启隧道」" else echo " ✗ 日志里没看到触发重启" fi if [ -n "$NEW_URL" ] && [ "$NEW_URL" != "$BEFORE_URL" ]; then echo " ✓ 地址确实变了(说明隧道被重启并重新申请了地址)" else echo " ~ 地址没变" fi''' OLD_MARK = '''BEFORE=$(systemctl show lanremote-tunnel -p NRestarts | cut -d= -f2)''' NEW_MARK = '''BEFORE=$(systemctl show lanremote-tunnel -p NRestarts | cut -d= -f2) BEFORE_URL=$(cat "$URL_FILE" 2>/dev/null || echo "")''' def main() -> int: text = TARGET.read_text(encoding="utf-8") ok = True for old, new, tag in ((OLD_JUDGE, NEW_JUDGE, "判定逻辑"), (OLD_MARK, NEW_MARK, "记录重启前地址")): if old in text: text = text.replace(old, new, 1) print(f" {tag}: 已改") else: print(f" [跳过] {tag} —— 锚点没找到") ok = False TARGET.write_text(text, encoding="utf-8", newline="\n") raw = TARGET.read_bytes() if b"\r\n" in raw: TARGET.write_bytes(raw.replace(b"\r\n", b"\n")) print(" 顺手修了 CRLF") return 0 if ok else 1 if __name__ == "__main__": sys.exit(main())