背景:`adb install` 在 MIUI 上被「USB 安装」拦下(USER_RESTRICTED),必须人工点确认;
而**由设备上的 App 自己调系统安装器**走的是普通应用安装流程,不触发那道拦截。
平台侧实现(设备端 Agent APK 在另一个仓库,契约见 doc/DEVICE_AGENT.md):
- web/device_agent_api.py(新):
* 设备侧 `/api/device/agent/{bootstrap,apk/<id>,report}` —— 无登录会话,靠
`X-Device-Token`(常量时间比对)鉴权;`X-Device-Fingerprint` 让平台认出是哪台设备
(换 IP 也认得出,并把平台分配的名称回给它);**默认关闭,关闭时统一 404**,
不暴露接口存在性;只读清单与文件,不返回任何配置/密钥
* 管理侧 `/api/agent-store/{config,logs}` —— 登录 + 应用管理权限;启用时自动生成令牌,
可一键重置(旧令牌立即失效)
- core/models.py:新增 `device_install_log`(下载/安装记录,自动裁剪保留 500 条)
- 应用管理页新增「📱 设备端应用商店」面板:开关 / 接入地址 / 令牌(复制·重置)/ 安装记录;
面板里写明它与「平台批量推送」的分工
- doc/DEVICE_AGENT.md(新):**两个仓库共享的接口契约** —— 接入流程、三个设备接口的
完整规格与错误码、adb 指令协议(剪贴板/身份显示/配置下发)、版本兼容约定、安全须知;
API.md、DATA_MODEL.md、doc/README.md 索引同步
验证:
- 后端 9 组用例:默认关闭 404、无/错令牌 401、指纹认出设备名、清单、下载、上报与失败
原因落库、关闭后重新 404、重置令牌后旧令牌立即失效、未登录管理端被拒 —— 全通过
- 真实浏览器:面板渲染、点开关 → 自动生成令牌 → 设备端带令牌拉到清单且 device.name=A08、
无 JS 报错;测试后已把开关还原为关闭
- 全量回归 105 项通过(42 GET + 62 写探测 + 7 关键业务)
37 lines
1.6 KiB
Python
37 lines
1.6 KiB
Python
"""Web 层蓝图包:web_server.py 只保留 app 初始化与装配,路由按功能域拆分。
|
|
|
|
模块划分(按功能定位问题):
|
|
auth — 登录/登出/CSRF/权限装饰器/页面路由(/、/wall)
|
|
monitor — 状态/运行控制/设备操作/远程看屏
|
|
tasks — 任务计划/分组/自定义动作/元素抓取/步骤测试
|
|
admin — 用户管理/日志
|
|
tools — adb 终端/剪贴板注入/应用版本
|
|
devices — 设备池管理
|
|
apks — 应用管理
|
|
tailscale — Tailscale 管理
|
|
system — 系统数据备份导出/导入
|
|
device_agent— 设备端 Agent 专用接口(应用商店:清单/下载/上报)+ 其管理端配置
|
|
"""
|
|
from flask import Blueprint
|
|
|
|
|
|
def register_blueprints(app):
|
|
"""注册全部蓝图(url_prefix 为空,路由路径保持原样)。"""
|
|
from .auth import bp as auth_bp
|
|
from .monitor import bp as monitor_bp
|
|
from .tasks_api import bp as tasks_bp
|
|
from .admin_api import bp as admin_bp
|
|
from .tools_api import bp as tools_bp
|
|
from .devices_api import bp as devices_bp
|
|
from .apks_api import bp as apks_bp
|
|
from .tailscale_api import bp as tailscale_bp
|
|
from . import agent_api as _agent_mod
|
|
from .agent_api import bp as agent_bp
|
|
_agent_mod.set_app(app)
|
|
from .system_api import bp as system_bp
|
|
from .device_agent_api import bp as devagent_bp
|
|
for bp in (auth_bp, monitor_bp, tasks_bp, admin_bp, tools_bp,
|
|
devices_bp, apks_bp, tailscale_bp, agent_bp, system_bp,
|
|
devagent_bp):
|
|
app.register_blueprint(bp)
|