From 842e562b91e4f83d54fbe877facec75c531aa528 Mon Sep 17 00:00:00 2001 From: Jerry Date: Sat, 30 Aug 2025 15:47:09 +0800 Subject: [PATCH] 1 --- src/backend/app/api/endpoints.py | 74 +------------------------------- src/backend/config.py | 47 +++++++++++++++----- 2 files changed, 37 insertions(+), 84 deletions(-) diff --git a/src/backend/app/api/endpoints.py b/src/backend/app/api/endpoints.py index fa2244c..f0f9ea8 100644 --- a/src/backend/app/api/endpoints.py +++ b/src/backend/app/api/endpoints.py @@ -1,18 +1,15 @@ -# File: D:\Python work\AI-powered-switches\src\backend\app\api\endpoints.py - import socket from datetime import datetime, timedelta from fastapi import (APIRouter, HTTPException, Response, WebSocket, WebSocketDisconnect) from typing import List from pydantic import BaseModel import asyncio -from fastapi.responses import HTMLResponse, JSONResponse +from fastapi.responses import HTMLResponse import matplotlib.pyplot as plt import io import base64 import psutil import ipaddress -import json from ..services.switch_traffic_monitor import get_switch_monitor from ..utils import logger @@ -23,9 +20,6 @@ from ..services.network_scanner import NetworkScanner from ...app.services.traffic_monitor import traffic_monitor from ...app.models.traffic_models import TrafficRecord, SwitchTrafficRecord from src.backend.app.api.database import SessionLocal -from ..services.network_visualizer import NetworkVisualizer -from ..services.config_validator import ConfigValidator -from ..services.report_generator import ReportGenerator router = APIRouter(prefix="", tags=["API"]) scanner = NetworkScanner() @@ -451,69 +445,3 @@ async def get_network_adapters(): return {"networks": networks} except Exception as e: return {"error": f"获取网络适配器信息失败: {str(e)}"} - - -visualizer = NetworkVisualizer() -report_gen = ReportGenerator() - - -@router.get("/topology/visualize", response_class=HTMLResponse) -async def visualize_topology(): - """获取网络拓扑可视化图""" - try: - devices = await list_devices() - await asyncio.to_thread(visualizer.update_topology, devices["devices"]) - image_data = await asyncio.to_thread(visualizer.generate_topology_image) - return f""" - - Network Topology - -

Network Topology

- Network Topology - - - """ - except Exception as e: - raise HTTPException(500, detail=str(e)) - - -@router.post("/config/validate") -async def validate_config(config: dict): - """验证配置有效性""" - is_valid, errors = await asyncio.to_thread(ConfigValidator.validate_full_config, config) - return { - "valid": is_valid, - "errors": errors, - "has_security_risks": len( - await asyncio.to_thread(ConfigValidator.check_security_risks, config.get("commands", []))) > 0 - } - - -@router.get("/reports/traffic/{ip}") -async def get_traffic_report(ip: str, days: int = 1): - """获取流量分析报告""" - try: - report = await asyncio.to_thread(report_gen.generate_traffic_report, ip, days) - return JSONResponse(content=report) - except Exception as e: - raise HTTPException(500, detail=str(e)) - - -@router.get("/reports/traffic") -async def get_local_traffic_report(days: int = 1): - """获取本地网络流量报告""" - try: - report = await asyncio.to_thread(report_gen.generate_traffic_report, days=days) - return JSONResponse(content=report) - except Exception as e: - raise HTTPException(500, detail=str(e)) - - -@router.get("/topology/traffic_heatmap") -async def get_traffic_heatmap(minutes: int = 10): - """获取流量热力图数据""" - try: - heatmap = await asyncio.to_thread(visualizer.get_traffic_heatmap, minutes) - return {"heatmap": heatmap} - except Exception as e: - raise HTTPException(500, detail=str(e)) \ No newline at end of file diff --git a/src/backend/config.py b/src/backend/config.py index 3a9d8db..a806550 100644 --- a/src/backend/config.py +++ b/src/backend/config.py @@ -1,24 +1,49 @@ from pydantic_settings import BaseSettings from dotenv import load_dotenv import os +import sys -load_dotenv() +ENV_FILE = ".env" + +if not os.path.exists(ENV_FILE): + default_env_content = """ +APP_NAME=AI Network Configurator +DEBUG=True +API_PREFIX=/api + +SILICONFLOW_API_KEY=your-api-key-here +SILICONFLOW_API_URL=https://api.siliconflow.cn/v1 + +SWITCH_USERNAME=admin +SWITCH_PASSWORD=admin +SWITCH_TIMEOUT=10 + +ENSP_DEFAULT_IP=172.17.99.201 +ENSP_DEFAULT_PORT=2000 +""" + with open(ENV_FILE, "w", encoding="utf-8") as f: + f.write(default_env_content) + + print(f"已生成默认配置文件 {ENV_FILE} ,请修改后重新运行程序。") + sys.exit(1) + +load_dotenv(ENV_FILE) class Settings(BaseSettings): - APP_NAME: str = "AI Network Configurator" - DEBUG: bool = True - API_PREFIX: str = "/api" + APP_NAME: str + DEBUG: bool + API_PREFIX: str - SILICONFLOW_API_KEY: str = os.getenv("SILICONFLOW_API_KEY", "sk-oftmyihyxitocscgjdicafzgezprwqpzzgkzsvoxrakkagmd") - SILICONFLOW_API_URL: str = os.getenv("SILICONFLOW_API_URL", "https://api.siliconflow.cn/v1") + SILICONFLOW_API_KEY: str + SILICONFLOW_API_URL: str - SWITCH_USERNAME: str = os.getenv("SWITCH_USERNAME", "admin") - SWITCH_PASSWORD: str = os.getenv("SWITCH_PASSWORD", "admin") - SWITCH_TIMEOUT: int = os.getenv("SWITCH_TIMEOUT", 10) + SWITCH_USERNAME: str + SWITCH_PASSWORD: str + SWITCH_TIMEOUT: int - ENSP_DEFAULT_IP: str = "172.17.99.201" - ENSP_DEFAULT_PORT: int = 2000 + ENSP_DEFAULT_IP: str + ENSP_DEFAULT_PORT: int class Config: env_file = ".env"