# -*- coding: utf-8 -*- """把最新的服务器端文件部署到设备并复核。""" from __future__ import annotations import sys from pathlib import Path ROOT = Path(__file__).resolve().parent.parent sys.path.insert(0, str(ROOT / "_build")) from devssh import upload, run # noqa: E402 FILES = ( (ROOT / "relay" / "relay.py", "/root/lanremote-relay/relay.py"), (ROOT / "relay" / "watchdog.sh", "/root/lanremote-relay/watchdog.sh"), (ROOT / "relay" / "tunnel-run.sh", "/root/lanremote-relay/tunnel-run.sh"), (ROOT / "relay" / "install.sh", "/root/lanremote-relay/install.sh"), ) def main() -> int: print("一、上传") for local, remote in FILES: raw = local.read_bytes() # shell 脚本必须是 LF,否则设备上跑不起来 if raw.count(b"\r\n") and local.suffix == ".sh": raw = raw.replace(b"\r\n", b"\n") local.write_bytes(raw) print(f" {local.name}: 修了 CRLF") upload(str(local), remote, 0o755) print(f" {local.name} -> {remote}") print() print("二、语法检查") run("bash -n /root/lanremote-relay/watchdog.sh " "&& bash -n /root/lanremote-relay/tunnel-run.sh " "&& bash -n /root/lanremote-relay/install.sh " "&& echo ' 三个脚本语法 OK'") print() print("三、重启并复核") run("systemctl restart lanremote-relay; sleep 5; " "printf ' %-32s %-10s %s\\n' 服务 运行 开机自启; " "for s in lanremote-relay lanremote-tunnel lanremote-watchdog.timer; " "do printf ' %-32s %-10s %s\\n' \"$s\" " "\"$(systemctl is-active $s 2>/dev/null)\" " "\"$(systemctl is-enabled $s 2>/dev/null)\"; done") print() print("四、健康检查") run("curl -s --max-time 8 http://127.0.0.1:8080/v1/health | head -c 200") print() run("echo -n ' 公网地址: '; cat /root/lanremote-relay/public_url.txt") run("echo -n ' 可达性: HTTP '; timeout 20 curl -4 -s -o /dev/null " "-w '%{http_code}\\n' -H 'User-Agent: LanRemote/1.4.0' " "https://relay.xxmxxs.top/v1/health") print() print("五、清掉测试残留(这次部署后又连上来的测试设备)") run("KEY=$(cat /root/lanremote-relay/data/admin_key.txt); " "curl -s --max-time 8 -X POST " "http://127.0.0.1:8080/v1/admin/delete_all " "-H \"X-Admin: $KEY\" -H 'Content-Type: application/json' -d '{}'") print() run("python3 -c \"import json; " "d=json.load(open('/root/lanremote-relay/data/relay_state.json')); " "print(' 剩余配对码绑定:', len(d.get('codes', [])))\"") return 0 if __name__ == "__main__": sys.exit(main())