Files
ykxmz/_build/patch_install_watchdog.py
xmz7891 b62ac865ea ykxmz 1.5.0:修复手表端 TLS 证书校验 + MTU 修复网络稳定性
被控端
- 修复 MTU 问题:夹 MSS + 路径 MTU 探测(公网可用率 48% -> 100%)
- 复用 HTTP 连接(免掉每次新建 TLS 的 30% 握手失败)
- 每分钟回头找局域网,自动切回快 400 倍的路径
- 画面心跳帧:静止时省流量,客户端仍知道流是活的
- 锁屏时给出可操作的提示

手表端
- 内置 GTS Root R4 / GlobalSign Root CA,修 SSLHandshakeException
- 连接错误翻译成人话(证书/时间/解析/超时分别提示)
- 经中转连上后用服务器报的地址刷新已配对记录
- 新增局域网连接页面、服务器延迟检测

服务器端
- 支持 chunked 请求体(修每 16 秒一次的连接错乱与大面积 502)
- 网络调优脚本 net-tune.sh(开机自动应用)
- 管理页:批量删除、网络体检、下载区
- 隧道改 HTTP/2 + 双连接

文档
- 许可协议 / 安装前必读 / 安装后须知(作者:小麦子)
2026-10-06 19:01:05 +08:00

161 lines
5.2 KiB
Python

# -*- coding: utf-8 -*-
"""把隧道看门狗写进 install.sh。
为什么需要:
匿名隧道在这条线路上时好时坏。tunnel-run.sh 只管**建立**阶段,
建立之后中途失效没人管 —— 用户只能自己发现、自己 SSH 上来重启。
看门狗每 5 分钟检查一次公网可达性,连续 3 次不通就重启隧道。
写进 install.sh 之后,别人部署也会有这个能力。
"""
from __future__ import annotations
import sys
from pathlib import Path
INSTALL = Path(r"C:\Users\shu\Desktop\deepseekagent\LanRemote\relay"
r"\install.sh")
ANCHOR = '''systemctl daemon-reload
systemctl enable lanremote-relay lanremote-tunnel >/dev/null 2>&1
systemctl start lanremote-relay
sleep 3
systemctl start lanremote-tunnel
echo " 两个服务已注册并启动"'''
NEW = '''systemctl daemon-reload
systemctl enable lanremote-relay lanremote-tunnel >/dev/null 2>&1
systemctl start lanremote-relay
sleep 3
systemctl start lanremote-tunnel
echo " 两个服务已注册并启动"
# ---------- 3b. 装隧道看门狗 ----------
# 匿名隧道建立之后中途失效没人管,用户只能自己发现、自己上来重启。
# 看门狗每 5 分钟检查一次公网可达性,连续 3 次不通就重启隧道。
echo
echo "[3b] 装隧道看门狗"
if [ -f "$RELAY_DIR/watchdog.sh" ] || [ -f "$SCRIPT_DIR/watchdog.sh" ]; then
if [ -f "$SCRIPT_DIR/watchdog.sh" ] && \\
[ "$(readlink -f "$SCRIPT_DIR/watchdog.sh")" != \\
"$(readlink -f "$RELAY_DIR/watchdog.sh" 2>/dev/null || echo x)" ]; then
cp -f "$SCRIPT_DIR/watchdog.sh" "$RELAY_DIR/watchdog.sh"
fi
chmod +x "$RELAY_DIR/watchdog.sh"
cat > /etc/systemd/system/lanremote-watchdog.service <<'WDUNIT'
[Unit]
Description=LanRemote 隧道看门狗(检查公网可达性)
After=lanremote-relay.service lanremote-tunnel.service
[Service]
Type=oneshot
ExecStart=/bin/bash /root/lanremote-relay/watchdog.sh
MemoryMax=64M
StandardOutput=append:/root/lanremote-relay/watchdog.log
StandardError=append:/root/lanremote-relay/watchdog.log
WDUNIT
cat > /etc/systemd/system/lanremote-watchdog.timer <<'WDTIMER'
[Unit]
Description=每 5 分钟检查一次隧道
[Timer]
OnBootSec=3min
OnUnitActiveSec=5min
AccuracySec=30s
Unit=lanremote-watchdog.service
[Install]
WantedBy=timers.target
WDTIMER
systemctl daemon-reload
systemctl enable lanremote-watchdog.timer >/dev/null 2>&1
systemctl start lanremote-watchdog.timer
echo " 看门狗已启用(每 5 分钟检查一次)"
else
echo " [跳过] 没找到 watchdog.sh"
fi'''
# 便捷命令里加一个"看隧道状态"
CMD_ANCHOR = '''cat > /usr/local/bin/lanremote-key <<'EOF'
#!/bin/bash
# 打印管理页钥匙
cat /root/lanremote-relay/data/admin_key.txt 2>/dev/null || echo "(还没有钥匙)"
EOF
chmod +x /usr/local/bin/lanremote-key'''
CMD_NEW = CMD_ANCHOR + '''
cat > /usr/local/bin/lanremote-status <<'EOF'
#!/bin/bash
# 一眼看清中转 + 隧道的状态
echo "=== 服务 ==="
for s in lanremote-relay lanremote-tunnel lanremote-watchdog.timer; do
printf " %-28s %s\\n" "$s" "$(systemctl is-active "$s" 2>/dev/null)"
done
echo
echo "=== 公网地址 ==="
cat /root/lanremote-relay/public_url.txt 2>/dev/null || echo " (还没有)"
echo
echo "=== 可达性 ==="
URL=$(cat /root/lanremote-relay/public_url.txt 2>/dev/null)
if [ -n "$URL" ]; then
C=$(timeout 20 curl -4 -s -o /dev/null -w '%{http_code}' "$URL/v1/health" 2>/dev/null)
echo " HTTP ${C:-超时}"
fi
echo
echo "=== 看门狗最近记录 ==="
tail -3 /root/lanremote-relay/watchdog.log 2>/dev/null | sed 's/^/ /' || echo " (还没有)"
echo
echo "=== 内存 ==="
free -m | awk 'NR==2{printf " 已用 %s MB / 可用 %s MB\\n", $3, $7}'
EOF
chmod +x /usr/local/bin/lanremote-status'''
# 说明里提一句
DOC_ANCHOR = ''' 下面还有两个命令(SSH 上去用):
lanremote-url 打印当前公网地址
systemctl restart lanremote-tunnel 换个地址(超时的时候用)'''
DOC_NEW = ''' 下面还有三个命令(SSH 上去用):
lanremote-status 一眼看清中转 + 隧道状态(推荐先看这个)
lanremote-url 打印当前公网地址
systemctl restart lanremote-tunnel 手动换地址
隧道有看门狗看着:每 5 分钟检查一次公网可达性,
连续 3 次不通会自动重启隧道。你不用管它。'''
def main() -> int:
text = INSTALL.read_text(encoding="utf-8")
ok = True
for old, new, tag in ((ANCHOR, NEW, "看门狗安装"),
(CMD_ANCHOR, CMD_NEW, "lanremote-status 命令")):
if old in text:
text = text.replace(old, new, 1)
print(f" {tag}: 已加")
else:
print(f" [跳过] {tag} —— 锚点没找到")
ok = False
if DOC_ANCHOR in text:
text = text.replace(DOC_ANCHOR, DOC_NEW, 1)
print(" 说明文档: 已更新")
else:
print(" [跳过] 说明文档锚点没找到")
INSTALL.write_text(text, encoding="utf-8", newline="\n")
raw = INSTALL.read_bytes()
if b"\r\n" in raw:
INSTALL.write_bytes(raw.replace(b"\r\n", b"\n"))
print(" 顺手修了 CRLF")
print(" install.sh 已更新,纯 LF")
return 0 if ok else 1
if __name__ == "__main__":
sys.exit(main())