You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
205 lines
8.9 KiB
205 lines
8.9 KiB
"""
|
|
增强的ADB API端点
|
|
"""
|
|
from typing import List, Optional
|
|
from fastapi import APIRouter, HTTPException, BackgroundTasks
|
|
from app.services.enhanced_adb_service import EnhancedAdbService
|
|
from app.models.adb_models import (
|
|
DeviceInfo, ShellCommand, ShellResponse,
|
|
ForwardRequest, ForwardInfo, ServerInfo
|
|
)
|
|
from app.utils.log import get_enhanced_logger, LogLevel
|
|
logger = get_enhanced_logger(__name__, LogLevel.DEBUG)
|
|
|
|
router = APIRouter(prefix="/adb", tags=["ADB管理"])
|
|
|
|
# 全局ADB服务实例 - 延迟初始化
|
|
adb_service = None
|
|
|
|
def get_adb_service():
|
|
"""获取ADB服务实例(延迟初始化)"""
|
|
global adb_service
|
|
if adb_service is None:
|
|
adb_service = EnhancedAdbService()
|
|
return adb_service
|
|
|
|
|
|
@router.get("/server/info", response_model=ServerInfo, summary="获取ADB服务器信息")
|
|
async def get_server_info():
|
|
"""获取ADB服务器信息"""
|
|
try:
|
|
logger.debug("API请求: 获取ADB服务器信息")
|
|
adb_service = get_adb_service()
|
|
result = await adb_service.get_server_info()
|
|
logger.info("API响应: 获取ADB服务器信息成功", version=result.version)
|
|
return result
|
|
except Exception as e:
|
|
logger.error("获取ADB服务器信息失败", error=str(e))
|
|
raise
|
|
|
|
|
|
@router.get("/devices", response_model=List[DeviceInfo], summary="获取设备列表")
|
|
async def list_devices(status: Optional[str] = None):
|
|
"""获取设备列表"""
|
|
try:
|
|
logger.debug("API请求: 获取设备列表", status=status)
|
|
status_filter = [status] if status else None
|
|
adb_service = get_adb_service()
|
|
result = await adb_service.list_devices(status_filter)
|
|
logger.info("API响应: 获取设备列表成功", device_count=len(result), status=status)
|
|
return result
|
|
except Exception as e:
|
|
logger.error("获取设备列表失败", error=str(e))
|
|
raise
|
|
|
|
|
|
@router.post("/devices/{device_serial}/shell", response_model=ShellResponse, summary="执行Shell命令")
|
|
async def execute_shell_command(device_serial: str, command: ShellCommand):
|
|
"""在指定设备上执行Shell命令"""
|
|
try:
|
|
logger.debug("API请求: 执行Shell命令", device_serial=device_serial, command=command.command)
|
|
adb_service = get_adb_service()
|
|
result = await adb_service.execute_shell_command(
|
|
device_serial,
|
|
command.command,
|
|
command.timeout
|
|
)
|
|
logger.info("API响应: 执行Shell命令完成",
|
|
device_serial=device_serial,
|
|
success=result.success,
|
|
output_length=len(result.output))
|
|
return result
|
|
except Exception as e:
|
|
logger.error("执行Shell命令失败", error=str(e))
|
|
raise
|
|
|
|
|
|
|
|
|
|
|
|
@router.get("/devices/{device_serial}/info", summary="获取设备详细信息")
|
|
async def get_device_info(device_serial: str):
|
|
"""获取设备详细信息"""
|
|
try:
|
|
logger.debug("API请求: 获取设备详细信息", device_serial=device_serial)
|
|
adb_service = get_adb_service()
|
|
result = await adb_service.get_device_info(device_serial)
|
|
if result:
|
|
logger.info("API响应: 获取设备详细信息成功", device_serial=device_serial)
|
|
return result
|
|
else:
|
|
logger.warning("API响应: 设备不存在", device_serial=device_serial)
|
|
raise HTTPException(status_code=404, detail=f"设备 {device_serial} 不存在")
|
|
except HTTPException:
|
|
raise
|
|
except Exception as e:
|
|
logger.error("API错误: 获取设备详细信息失败", device_serial=device_serial, error=str(e))
|
|
raise HTTPException(status_code=500, detail=f"获取设备详细信息失败: {str(e)}")
|
|
|
|
|
|
@router.post("/devices/{device_serial}/ping", summary="ping设备")
|
|
async def ping_device(device_serial: str):
|
|
"""ping设备检查连接状态"""
|
|
try:
|
|
logger.debug("API请求: ping设备", device_serial=device_serial)
|
|
adb_service = get_adb_service()
|
|
success = await adb_service.ping_device(device_serial)
|
|
logger.info("API响应: ping设备完成", device_serial=device_serial, success=success)
|
|
return {"success": success, "message": "设备连接正常" if success else "设备连接失败"}
|
|
except Exception as e:
|
|
logger.error("API错误: ping设备失败", device_serial=device_serial, error=str(e))
|
|
raise HTTPException(status_code=500, detail=f"ping设备失败: {str(e)}")
|
|
|
|
|
|
@router.post("/devices/{device_serial}/install", summary="安装APK")
|
|
async def install_apk(device_serial: str, apk_path: str):
|
|
"""安装APK文件"""
|
|
try:
|
|
logger.debug("API请求: 安装APK", device_serial=device_serial, apk_path=apk_path)
|
|
adb_service = get_adb_service()
|
|
result = await adb_service.install_apk(device_serial, apk_path)
|
|
logger.info("API响应: 安装APK完成", device_serial=device_serial, success=result.success)
|
|
return result
|
|
except Exception as e:
|
|
logger.error("API错误: 安装APK失败", device_serial=device_serial, apk_path=apk_path, error=str(e))
|
|
raise HTTPException(status_code=500, detail=f"安装APK失败: {str(e)}")
|
|
|
|
|
|
@router.delete("/devices/{device_serial}/apps/{package_name}", summary="卸载应用")
|
|
async def uninstall_app(device_serial: str, package_name: str):
|
|
"""卸载应用"""
|
|
try:
|
|
logger.debug("API请求: 卸载应用", device_serial=device_serial, package_name=package_name)
|
|
adb_service = get_adb_service()
|
|
result = await adb_service.uninstall_app(device_serial, package_name)
|
|
logger.info("API响应: 卸载应用完成", device_serial=device_serial, success=result.success)
|
|
return result
|
|
except Exception as e:
|
|
logger.error("API错误: 卸载应用失败", device_serial=device_serial, package_name=package_name, error=str(e))
|
|
raise HTTPException(status_code=500, detail=f"卸载应用失败: {str(e)}")
|
|
|
|
|
|
@router.get("/devices/{device_serial}/apps", summary="获取已安装应用列表")
|
|
async def get_installed_apps(device_serial: str):
|
|
"""获取已安装应用列表"""
|
|
try:
|
|
logger.debug("API请求: 获取已安装应用列表", device_serial=device_serial)
|
|
adb_service = get_adb_service()
|
|
apps = await adb_service.get_installed_apps(device_serial)
|
|
logger.info("API响应: 获取已安装应用列表成功", device_serial=device_serial, app_count=len(apps))
|
|
return {"apps": apps, "count": len(apps)}
|
|
except Exception as e:
|
|
logger.error("API错误: 获取已安装应用列表失败", device_serial=device_serial, error=str(e))
|
|
raise HTTPException(status_code=500, detail=f"获取已安装应用列表失败: {str(e)}")
|
|
|
|
|
|
@router.get("/forward", response_model=List[ForwardInfo], summary="获取端口转发列表")
|
|
async def list_forward_ports():
|
|
"""获取端口转发列表"""
|
|
try:
|
|
logger.debug("API请求: 获取端口转发列表")
|
|
adb_service = get_adb_service()
|
|
result = await adb_service.list_forward_ports()
|
|
logger.info("API响应: 获取端口转发列表成功", forward_count=len(result))
|
|
return result
|
|
except Exception as e:
|
|
logger.error("API错误: 获取端口转发列表失败", error=str(e))
|
|
raise HTTPException(status_code=500, detail=f"获取端口转发列表失败: {str(e)}")
|
|
|
|
|
|
@router.post("/forward", summary="创建端口转发")
|
|
async def create_forward_port(request: ForwardRequest):
|
|
"""创建端口转发"""
|
|
try:
|
|
logger.debug("API请求: 创建端口转发",
|
|
serial=request.serial,
|
|
local=request.local,
|
|
remote=request.remote)
|
|
adb_service = get_adb_service()
|
|
await adb_service.create_forward_port(request)
|
|
logger.info("API响应: 创建端口转发成功",
|
|
serial=request.serial,
|
|
local=request.local,
|
|
remote=request.remote)
|
|
return {"message": "端口转发创建成功"}
|
|
except Exception as e:
|
|
logger.error("API错误: 创建端口转发失败",
|
|
serial=request.serial,
|
|
local=request.local,
|
|
remote=request.remote,
|
|
error=str(e))
|
|
raise HTTPException(status_code=500, detail=f"创建端口转发失败: {str(e)}")
|
|
|
|
|
|
@router.delete("/forward", summary="移除端口转发")
|
|
async def remove_forward_port(local: Optional[str] = None):
|
|
"""移除端口转发"""
|
|
try:
|
|
logger.debug("API请求: 移除端口转发", local=local)
|
|
adb_service = get_adb_service()
|
|
await adb_service.remove_forward_port(local)
|
|
logger.info("API响应: 移除端口转发成功", local=local or "all")
|
|
return {"message": f"端口转发移除成功: {local or 'all'}"}
|
|
except Exception as e:
|
|
logger.error("API错误: 移除端口转发失败", local=local, error=str(e))
|
|
raise HTTPException(status_code=500, detail=f"移除端口转发失败: {str(e)}")
|