""" 增强的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 = EnhancedAdbService() @router.get("/server/info", response_model=ServerInfo, summary="获取ADB服务器信息") async def get_server_info(): """获取ADB服务器信息""" try: logger.debug("API请求: 获取ADB服务器信息") 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 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) 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) 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) 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) 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) 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) 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请求: 获取端口转发列表") 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) 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) 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)}")