mirror of
https://gitee.com/xmz7891/ykxmz.git
synced 2026-10-18 10:10:43 +00:00
== 用户要求 ==
"安卓那个逻辑也要改一下,就是你输入配对码后,进入一个页面,
页面有两个按钮,第一个按钮是远控,第二个按钮是静默更新被控端"
== 做成什么样 ==
新增 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 兼容校验通过
106 lines
3.7 KiB
Python
106 lines
3.7 KiB
Python
# -*- coding: utf-8 -*-
|
||
r'''查服务器的几个问题:
|
||
|
||
1. 下午网站为什么停了一段时间
|
||
2. 中转站里为什么还有"隧道"
|
||
3. 9100 端口上是什么
|
||
4. 现在到底有哪些服务在跑、有没有没用的
|
||
|
||
== 背景 ==
|
||
|
||
用户反馈:
|
||
* "下午网站有一段时间停了"
|
||
* "为什么中转站里还有隧道,所有没的东西就删了"
|
||
* "网站官网不是 <服务器IP> 吗,改成 <服务器IP>:9100,中转站也一样"
|
||
* "我感觉网站还是不稳定"
|
||
|
||
"隧道"最可能是**早年那套 Cloudflare Tunnel(cloudflared)**的残留 ——
|
||
那时候用 `relay.xxmxxs.top` 走隧道,后来换成 nginx + Let's Encrypt
|
||
直连(`yk.xxmxxs.top`),隧道应该已经没用了。
|
||
|
||
如果 cloudflared 还在跑,它可能:
|
||
* 占着资源
|
||
* 隔一段时间重连,把日志刷满
|
||
* **跟 nginx 抢同一个域名的流量** —— 这正是"不稳定"的常见原因
|
||
'''
|
||
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. 所有跟本项目相关的 systemd 单元 ===="
|
||
systemctl list-units --all --no-pager --plain 2>/dev/null \
|
||
| grep -iE 'ykxmz|lanremote|cloudflare|cloudflared|tunnel|relay' \
|
||
| sed 's/^/ /' || echo " (没有)"
|
||
|
||
echo
|
||
echo "==== 2. 隧道进程 / 容器 ===="
|
||
ps -eo pid,etimes,comm,args 2>/dev/null | grep -iE 'cloudflared|frpc|ngrok|tunnel' \
|
||
| grep -v grep | sed 's/^/ /' || echo " (没有隧道进程)"
|
||
echo " --- docker ---"
|
||
sudo docker ps -a --format ' {{.Names}} {{.Image}} {{.Status}} {{.Ports}}' 2>/dev/null || echo " (docker 不可用)"
|
||
|
||
echo
|
||
echo "==== 3. 监听端口 ===="
|
||
sudo ss -tlnp 2>/dev/null | sed 's/^/ /'
|
||
|
||
echo
|
||
echo "==== 4. 9100 端口是什么 ===="
|
||
sudo ss -tlnp 2>/dev/null | grep 9100 | sed 's/^/ /' || echo " 9100 上没有东西"
|
||
echo " 9100 本地能不能连:"
|
||
curl -s -o /dev/null -w " http://127.0.0.1:9100/ -> %{http_code}\n" --max-time 8 http://127.0.0.1:9100/ 2>&1 || true
|
||
|
||
echo
|
||
echo "==== 5. nginx 站点 ===="
|
||
sudo ls -1 /etc/nginx/sites-enabled/ 2>/dev/null | sed 's/^/ /'
|
||
echo " --- server_name 和 listen ---"
|
||
sudo grep -hE 'server_name|listen' /etc/nginx/sites-available/* 2>/dev/null | sed 's/^/ /'
|
||
|
||
echo
|
||
echo "==== 6. 服务状态 ===="
|
||
for s in nginx ykxmz-relay ykxmz-monitor.timer certbot.timer lanremote-tunnel lanremote-relay cloudflared; do
|
||
st=$(systemctl is-active $s 2>/dev/null)
|
||
[ -n "$st" ] && printf ' %-26s %s\n' "$s" "$st"
|
||
done
|
||
|
||
echo
|
||
echo "==== 7. 下午有没有异常(journal 里 nginx / relay 的错误)===="
|
||
echo " --- nginx 今天的 error.log 尾部 ---"
|
||
sudo tail -25 /var/log/nginx/error.log 2>/dev/null | sed 's/^/ /' || echo " (读不到)"
|
||
echo " --- ykxmz-relay 最近的重启 ---"
|
||
sudo journalctl -u ykxmz-relay --since "today" --no-pager 2>/dev/null \
|
||
| grep -iE 'start|stop|fail|error|restart' | tail -12 | sed 's/^/ /' || echo " (读不到)"
|
||
|
||
echo
|
||
echo "==== 8. 内存 / 负载 ===="
|
||
free -m | sed 's/^/ /'
|
||
uptime | sed 's/^/ /'
|
||
|
||
echo
|
||
echo "==== 9. 有没有没用的旧目录 ===="
|
||
for d in /root/lanremote-relay /root/lanremote /opt/lanremote /root/.cloudflared /etc/cloudflared; do
|
||
[ -e "$d" ] && echo " 存在: $d ($(sudo du -sh $d 2>/dev/null | cut -f1))"
|
||
done
|
||
echo " --- /root 下的目录 ---"
|
||
sudo ls -1 /root 2>/dev/null | head -20 | sed 's/^/ /'
|
||
'''
|
||
|
||
|
||
def main() -> int:
|
||
print("=" * 62)
|
||
print(" 服务器诊断:隧道 / 9100 / 下午的中断")
|
||
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())
|