阶段1: 调度/生命周期切换 device_pool——task_manager 设备解析与状态查询、STFDevice 去 occupy/release、web_server 端点换数据源(USB 桥接保留到阶段 2)
This commit is contained in:
+33
-31
@@ -647,7 +647,7 @@ def api_device_screen_all():
|
||||
data = request.json or {}
|
||||
mode = data.get("mode", "on")
|
||||
try:
|
||||
serials = [d["serial"] for d in stf.list_all_devices() if d.get("present")]
|
||||
serials = device_pool.list_online()
|
||||
except Exception as e:
|
||||
return jsonify({"ok": False, "error": f"获取设备列表失败: {e}"}), 502
|
||||
if not serials:
|
||||
@@ -741,7 +741,12 @@ def api_stop_all():
|
||||
@app.route("/api/release", methods=["POST"])
|
||||
@perm_required(PERM_DEVICES)
|
||||
def api_release():
|
||||
released, failed = stf.release_all_mine()
|
||||
# 阶段 1:调度已不占 STF,此处仅清理迁移期遗留的 STF 占用记录
|
||||
# (阶段 3 摘除 STF 后此接口改为清理本实例 _running/worker 状态)
|
||||
try:
|
||||
released, failed = stf.release_all_mine()
|
||||
except Exception:
|
||||
released, failed = [], []
|
||||
return jsonify({"ok": True, "released": released, "failed": failed})
|
||||
|
||||
|
||||
@@ -916,32 +921,30 @@ def api_steps_test():
|
||||
def api_uiauto_devices():
|
||||
"""获取可选设备列表(抓取元素用)。
|
||||
|
||||
uiautodev 只认识本地 adb 已连接的设备;平台设备池(STF)里在线但未
|
||||
本地连接的设备(如 100.100.10.10)在这里补全,并先做一次轻量 adb
|
||||
connect(单次尝试,绝不 kill-server),让它们可被 uiautodev 抓取。
|
||||
uiautodev 只认识本地 adb 已连接的设备;设备池里在线但未本地连接的设备
|
||||
在这里补全,并先做一次轻量 adb connect(单次尝试,绝不 kill-server),
|
||||
让它们可被 uiautodev 抓取。
|
||||
"""
|
||||
ok, data = uiauto_helper.list_devices()
|
||||
if not ok:
|
||||
return jsonify({"ok": False, "error": data}), 503
|
||||
seen = {d.get("serial") for d in data}
|
||||
try:
|
||||
pool = stf.list_all_devices()
|
||||
online = set(device_pool.list_online())
|
||||
pool = [s for s in device_pool.list_configured() if s in online]
|
||||
except Exception:
|
||||
pool = []
|
||||
added = 0
|
||||
for d in pool:
|
||||
serial = d.get("serial", "")
|
||||
for serial in pool:
|
||||
if not serial or serial in seen:
|
||||
continue
|
||||
if not (d.get("present") and d.get("ready")):
|
||||
continue
|
||||
# 轻量连接(单次尝试,不重试不 kill-server);连不上也照样列出,
|
||||
# 前端抓取时会报明确错误,不影响其他设备的连接
|
||||
adb_connect_light(serial)
|
||||
data.append({
|
||||
"serial": serial,
|
||||
"model": d.get("model") or d.get("product") or "",
|
||||
"product": d.get("product") or "",
|
||||
"model": "",
|
||||
"product": "",
|
||||
"name": serial,
|
||||
"status": "device",
|
||||
"enabled": True,
|
||||
@@ -949,7 +952,7 @@ def api_uiauto_devices():
|
||||
seen.add(serial)
|
||||
added += 1
|
||||
if added:
|
||||
_log.info(f"抓取元素设备列表补全 {added} 台 STF 在线设备: {list(seen)}")
|
||||
_log.info(f"抓取元素设备列表补全 {added} 台在线设备: {list(seen)}")
|
||||
return jsonify({"ok": True, "devices": data})
|
||||
|
||||
|
||||
@@ -1006,18 +1009,16 @@ def api_apks_delete(apk_id):
|
||||
@app.route("/api/apks/install/devices")
|
||||
@perm_required(PERM_APKS)
|
||||
def api_apks_install_devices():
|
||||
"""可安装设备列表(应用管理):STF 在线设备池 + 本机 adb 设备(含 USB 有线连接)。
|
||||
"""可安装设备列表(应用管理):设备池在线设备 + 本机 adb 设备(含 USB 有线连接)。
|
||||
|
||||
source: stf=STF 池 / usb=本机有线 adb / adb=本机网络 adb。
|
||||
source: pool=设备池 / usb=本机有线 adb / adb=本机网络 adb。
|
||||
"""
|
||||
devices, seen = [], set()
|
||||
try:
|
||||
for d in stf.list_all_devices():
|
||||
serial = d.get("serial", "")
|
||||
if serial and d.get("present") and d.get("ready"):
|
||||
devices.append({"serial": serial,
|
||||
"model": d.get("model") or d.get("manufacturer") or "",
|
||||
"source": "stf"})
|
||||
online = set(device_pool.list_online())
|
||||
for serial in device_pool.list_configured():
|
||||
if serial in online:
|
||||
devices.append({"serial": serial, "model": "", "source": "pool"})
|
||||
seen.add(serial)
|
||||
except Exception:
|
||||
pass
|
||||
@@ -1066,12 +1067,11 @@ def _blocked_adb_cmd(cmd):
|
||||
|
||||
|
||||
def _merged_device_list():
|
||||
"""本地 adb(含 USB)+ STF 在线设备池的合并列表([{serial, state}])。
|
||||
"""本地 adb(含 USB)+ 设备池的合并列表([{serial, state}])。
|
||||
|
||||
供维护终端/剪贴板注入/应用版本管理等设备选择场景共用。
|
||||
STF 里 adb 可达但 agent 未就绪的设备(手机端 agent 启动失败)也列入,
|
||||
标记 stf_not_ready——这种设备恰恰需要用维护终端卸载/重装 agent 修复,
|
||||
不列出来就永远无法修复(死循环)。
|
||||
状态:device/offline=本机 adb 实际状态;pool=设备池已配置但本机未连接;
|
||||
stf_not_ready=STF agent 未就绪(迁移期保留,阶段 3 摘除 STF 后删除)。
|
||||
"""
|
||||
states = {}
|
||||
out = _adb("devices")
|
||||
@@ -1079,15 +1079,17 @@ def _merged_device_list():
|
||||
parts = line.split()
|
||||
if len(parts) >= 2 and parts[0] and not parts[0].startswith("*"):
|
||||
states[parts[0]] = parts[1]
|
||||
try:
|
||||
for serial in device_pool.list_configured():
|
||||
if serial not in states:
|
||||
states[serial] = "pool"
|
||||
except Exception:
|
||||
pass
|
||||
# 迁移期:STF 里 adb 可达但 agent 未就绪的设备仍列出,供维护终端修复 agent
|
||||
try:
|
||||
for d in stf.list_all_devices():
|
||||
serial = d.get("serial", "")
|
||||
if not serial or serial in states:
|
||||
continue
|
||||
if d.get("present") and d.get("ready"):
|
||||
states[serial] = "stf"
|
||||
elif d.get("present") and not d.get("ready"):
|
||||
# adb 可达但 STF agent 未就绪(启动失败/未安装):列入供修复
|
||||
if serial and d.get("present") and not d.get("ready") and serial not in states:
|
||||
states[serial] = "stf_not_ready"
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
Reference in New Issue
Block a user