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

"""
增强的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)}")