mirror of
https://gitee.com/xmz7891/ykxmz.git
synced 2026-10-18 14:50:45 +00:00
下载区
- 管理页加一张「下载最新版」卡片,就一个按钮
自动指向 /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)
30 lines
781 B
Python
30 lines
781 B
Python
# -*- coding: utf-8 -*-
|
|
r"""跑设备上的验证脚本。"""
|
|
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
|
|
|
|
NAME = sys.argv[1] if len(sys.argv) > 1 else "verify_one_link.sh"
|
|
TIMEOUT = int(sys.argv[2]) if len(sys.argv) > 2 else 600
|
|
|
|
|
|
def main() -> int:
|
|
local = ROOT / "_build" / NAME
|
|
raw = local.read_bytes()
|
|
if b"\r\n" in raw:
|
|
local.write_bytes(raw.replace(b"\r\n", b"\n"))
|
|
upload(str(local), "/root/run_it.sh", 0o755)
|
|
_c, out, _e = run("bash /root/run_it.sh 2>&1", timeout=TIMEOUT)
|
|
print(out[-3000:])
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|