中转站加下载区 + 大文件流式发送

下载区
- 管理页加一张「下载最新版」卡片,就一个按钮
  自动指向 /v1/downloads 里最新的被控端整包,不用每次改页面
- GET /v1/downloads 列出成品
- GET /download/<文件> 直接给文件
  只允许白名单后缀(.apk/.zip/.txt/.exe/.idsig)
  文件名严格校验,挡目录穿越(../ 和 ..%2F 都试过)
- 卡片下面附一个 Gitee 历史版本入口

大文件
- 原来 read_bytes() 一次性读进内存再 write。
  19MB 在 460MB 的设备上勉强,更要命的是 Cloudflare
  有 100 秒的源站响应上限,数据越晚开始流动越容易被掐。
- 改成 64KB 分块流式发送,边读边发
  实测:19MB 公网下载 40 秒完成,字节数完全一致

版本
- 三端分开打包(原来是一个合并 zip)
    ykxmz-agent-1.5.0.zip   被控端
    ykxmz-server-1.5.0.zip  服务器端
    ykxmz-watch-1.5.0.apk   控制端(直接给 APK)
This commit is contained in:
xmz7891
2026-10-06 23:08:06 +08:00
parent e86679294a
commit 60d1bdfe58
10 changed files with 732 additions and 30 deletions
+27
View File
@@ -0,0 +1,27 @@
# -*- coding: utf-8 -*-
r"""跑设备上的验证脚本(避免 PowerShell 的引号/变量展开地狱)。"""
from __future__ import annotations
import sys
from pathlib import Path
ROOT = Path(r"C:\Users\shu\Desktop\deepseekagent\LanRemote")
sys.path.insert(0, str(ROOT / "_build"))
from devssh import run, upload # noqa: E402
def main() -> int:
local = ROOT / "_build" / "verify_dl_final.sh"
raw = local.read_bytes()
if b"\r\n" in raw:
local.write_bytes(raw.replace(b"\r\n", b"\n"))
upload(str(local), "/root/vdf.sh", 0o755)
_code, out, _err = run("bash /root/vdf.sh 2>&1", timeout=900)
print(out[-2600:])
return 0
if __name__ == "__main__":
sys.exit(main())