feat: 工具Tab新增STF设备管理(读写220脚本DEVICES列表+docker adb connect/disconnect,220侧timeout兜底防卡死)+ 修复设备列表:5555重复显示

This commit is contained in:
2026-08-11 10:50:41 +08:00
parent 8e23541380
commit 5dd605e3a0
5 changed files with 267 additions and 4 deletions
+41 -1
View File
@@ -38,8 +38,9 @@ from core.models import db, init_db, User, DeviceGroup, TaskJob, CustomAction
from core.apk_manager import ApkManager
from core.adb_helper import (screenshot, list_installed_apps, adb_connect_light,
adb_connect, _ADB_LOCK, _adb)
from core import uiauto_helper, tailscale_client
from core import uiauto_helper, tailscale_client, stf_device_mgmt
from core.tailscale_client import TailscaleError
from core.stf_device_mgmt import StfDevError
from config import ADB_PATH, STF_SSH_TARGET, STF_DOCKER_CONTAINER
from tasks import list_task_types, get_task_class
@@ -992,6 +993,45 @@ def _set_device_clipboard(serial, text):
return False, f"{type(e).__name__}: {str(e)[:120]}"
@app.route("/api/stf/devmgmt/status")
@admin_required
def api_stf_devmgmt_status():
"""STF 设备管理:脚本配置的 IP + 220 adb 实际连接状态。"""
try:
st = stf_device_mgmt.status()
return jsonify({"ok": True, **st})
except StfDevError as e:
return jsonify({"ok": False, "error": str(e)}), 502
@app.route("/api/stf/devmgmt/add", methods=["POST"])
@admin_required
def api_stf_devmgmt_add():
"""STF 设备管理:添加设备(写入脚本 + 立即 connect)。"""
ip = (request.json or {}).get("ip", "").strip()
if not ip:
return jsonify({"ok": False, "error": "请输入设备 IP"}), 400
try:
msgs = stf_device_mgmt.add_device(ip)
return jsonify({"ok": True, "msgs": msgs})
except StfDevError as e:
return jsonify({"ok": False, "error": str(e)}), 502
@app.route("/api/stf/devmgmt/remove", methods=["POST"])
@admin_required
def api_stf_devmgmt_remove():
"""STF 设备管理:移除设备(脚本删除 + disconnect)。"""
ip = (request.json or {}).get("ip", "").strip()
if not ip:
return jsonify({"ok": False, "error": "请输入设备 IP"}), 400
try:
msgs = stf_device_mgmt.remove_device(ip)
return jsonify({"ok": True, "msgs": msgs})
except StfDevError as e:
return jsonify({"ok": False, "error": str(e)}), 502
@app.route("/api/stf/restart", methods=["POST"])
@admin_required
def api_stf_restart():