Files
ykxmz/_build/diag_server_deep.py
T
xmz7891 1d368979aa 2.2.0:手表端连上后先到「远控 / 静默更新被控端」选择页
== 用户要求 ==

"安卓那个逻辑也要改一下,就是你输入配对码后,进入一个页面,
 页面有两个按钮,第一个按钮是远控,第二个按钮是静默更新被控端"

== 做成什么样 ==

新增 choicePanel,连接成功后先进这一页:

    已连接「电脑名」
    电脑端 2.1.5 → 可更新到 2.2.0

    [        远控        ]   <- 第一个按钮
    [   静默更新被控端    ]   <- 第二个按钮

按钮顺序按用户说的来(远控在前)。

页面顶上显示电脑名和**电脑端当前版本** —— 用户之前要求
"手表端连接那个电脑端也可以查看电脑端目前所处的版本",
这里是最自然的展示位置(不弹框,只显示一行)。

为什么不让它直接进控制页:老版本的被控端可能缺功能或有 bug,
"先更新再远控"是更合理的顺序 —— 但不强制,给用户自己选。

== 一个刻意不改的地方 ==

自动切到中转服务器**恢复**时的 `showControlPanel()` **没动** ——
用户本来就在远控页,中途弹一层选择页会打断他。
测试里专门断言了这一点,免得以后有人"顺手统一一下"改坏。

== 顺手修的几个问题 ==

1. **忘了定义 lastDeviceName** —— 写选择页时凭直觉用了这个变量,
   编译报"找不到符号"。补上字段并在连接回调里赋值。
   (教训:写代码时要用的变量,先确认它存在。)

2. **泄漏闸门拦下我自己** —— 这两天写的一批服务器诊断/配置脚本里
   硬编码了服务器 IP(26 处,5 个文件)。规则是 IP 不能进任何
   被跟踪的文件。已全部改成占位符,真实值仍从
   _build/.lightsail_host(已 gitignore)读。

3. **verify_all.ps1 删掉「锁屏时记 SKIP」的逻辑** ——
   用户明确要求删。那个好意带来一个更糟的后果:锁屏时几关根本不跑,
   回归"全绿"了但关键测试其实一跳而过。
   **"因为环境不满足所以不测"比"测了发现失败"更危险。**
   删掉之后果然暴露出 3 个 FAIL —— 屏幕解锁后重跑全部通过,
   确认是环境问题而不是代码问题。

== 服务器这边(不在这份提交里,但同一天做的)==

  * nginx 按用户要求重排:
      IP(80) 任何路径 -> 404(没东西)
      域名 / -> 官网;/zhongzhuanzhan -> 中转站设置
      9100 -> 同样的内容(等 AWS 开防火墙)
  * 删掉早年 Cloudflare Tunnel 的 systemd 残留
  * **补上 ACME 挑战例外** —— 这是最要紧的一条:
    80 端口原来把所有请求都 301 到 https,包括
    /.well-known/acme-challenge/,**续期时会失败**。
    而且它是延迟爆发的(最长 90 天后证书到期才暴露)。
  * 清理 1Panel 安装包残留(223MB)

== 验证 ==

    全量回归 21 关全部 PASS(零 FAIL,桌面可用状态)
    Java 编译通过(android-34, --release 8)
    623+ Python 文件语法通过
    泄漏闸门通过
    全部产物重建,Win7 兼容校验通过
2026-10-10 17:13:24 +08:00

99 lines
3.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
r'''深挖三件事:
1. 那个 `listen 80 default_server; server_name _;` 是谁的配置
2. 下午到底是什么时候断的(监控 / journal 能不能看出)
3. 现在从公网看,服务是不是真的稳定
== 为什么盯着那个 default_server ==
nginx 里同一个端口**只能有一个 default_server**。如果有一个来路不明的
`server_name _; listen 80 default_server;`:
* 用 IP 直接访问(`http://<服务器IP>/`)会落到**它**上面,
而不是我们的站点 —— 这正好能解释"网站不稳定"的错觉
(有时对有时不对,取决于走的是域名还是 IP)
* 它也可能是 1Panel 之类装的,占了位置
== 为什么要查监控 ==
我们有个 `ykxmz-monitor.timer` 每 60 秒检查一次公网。
如果下午真的断了,它的日志里应该有"探测失败"的记录 ——
**那是判断"断了几分钟"最直接的证据**(比事后猜准得多)。
'''
from __future__ import annotations
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parent.parent
sys.path.insert(0, str(ROOT / "_build"))
from lssh import run # noqa: E402
REMOTE = r'''
echo "==== 1. default_server 是谁配的 ===="
sudo grep -rln "default_server" /etc/nginx/ 2>/dev/null | while read f; do
echo " 文件: $f"
grep -n "default_server" "$f" | sed 's/^/ /'
done
echo
echo " --- 那个文件完整内容(如果是 sites-enabled 里没链的,看 sites-available)---"
sudo ls -la /etc/nginx/sites-enabled/ /etc/nginx/conf.d/ 2>/dev/null | sed 's/^/ /'
echo
echo " --- /etc/nginx/nginx.conf 里的 include ---"
sudo grep -nE "include|default_server" /etc/nginx/nginx.conf 2>/dev/null | sed 's/^/ /'
echo
echo "==== 2. 用 IP 直接访问会到哪 ===="
echo " http://127.0.0.1/ (不带 Host):"
curl -s -o /dev/null -w " -> %{http_code} %{size_download} 字节\n" --max-time 10 http://127.0.0.1/ || true
echo " http://127.0.0.1/ 带 Host: yk.xxmxxs.top:"
curl -s -o /dev/null -w " -> %{http_code} %{size_download} 字节\n" --max-time 10 -H "Host: yk.xxmxxs.top" http://127.0.0.1/ || true
echo
echo "==== 3. 监控日志:下午有没有探测失败 ===="
echo " --- 今天的监控日志 ---"
sudo journalctl -u ykxmz-monitor --since "today" --no-pager 2>/dev/null | tail -40 | sed 's/^/ /' || echo " (没有日志)"
echo
echo " --- 报告文件 ---"
sudo ls -la /root/ykxmz-rescue* /var/log/ykxmz* 2>/dev/null | sed 's/^/ /' || echo " (没有报告文件)"
echo
echo "==== 4. 系统有没有重启 / 服务有没有停过 ===="
echo " --- 本次开机时间 ---"
uptime -s | sed 's/^/ /'
echo " --- nginx 进程启动时间 ---"
ps -o pid,lstart,etimes -p $(pgrep -f "nginx: master" | head -1) 2>/dev/null | sed 's/^/ /'
echo " --- relay 进程启动时间 ---"
ps -o pid,lstart,etimes -p 114212 2>/dev/null | sed 's/^/ /'
echo " --- journal 里 systemd 记录的重启 ---"
sudo journalctl --since "today" --no-pager 2>/dev/null | grep -iE "Started|Stopped|Failed|killed|OOM" \
| grep -iE "nginx|ykxmz" | tail -15 | sed 's/^/ /' || echo " (没有)"
echo
echo "==== 5. 磁盘 / inode ===="
df -h / | sed 's/^/ /'
df -i / | sed 's/^/ /'
echo
echo "==== 6. 公网自测(从服务器上打自己)===="
for u in https://yk.xxmxxs.top/ https://yk.xxmxxs.top/v1/health http://<服务器IP>/; do
printf ' %-42s ' "$u"
curl -s -o /dev/null -w "%{http_code} %{time_total}s\n" --max-time 20 "$u" || echo "失败"
done
'''
def main() -> int:
print("=" * 62)
print(" 深挖:default_server / 下午的中断 / 稳定性")
print("=" * 62)
print()
out = run(REMOTE, timeout=300, quiet=True)
print(out[1] if isinstance(out, tuple) else out)
return 0
if __name__ == "__main__":
sys.exit(main())