/
gabelchik
/
dpcs-diagnostics
Обзор
Документация
Войти
/
gabelchik
/
dpcs-diagnostics
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
main.py
111 строк
4 KB
Leo
между комп
22 июл 2026, 16:03
22 июл 2026, 16:03
2494a77
Код
Авторство
О чём код?
import uvicorn, requests from fastapi import FastAPI, HTTPException from pydantic import BaseModel from typing import List, Dict, Any, Optional from core.orchestrator import DiagnosticCore app = FastAPI(title="Diagnostic Orchestrator API") core = DiagnosticCore(config_path="config/config.json") def fix_remote_permissions(node_ip: str, mismatched: list): for item in mismatched: process = item.get("process") path = item.get("path") expected_perms = item.get("expected_permissions") print(f"[FIX] Отправка запроса на исправление прав для '{process}' на {node_ip}...") try: url = f"http://{node_ip}/fix-permissions" payload = {"path": path, "permissions": expected_perms} response = requests.post(url, json=payload, timeout=5.0) if response.status_code == 200: print(f"[FIX][SUCCESS] Права для '{process}' успешно изменены") else: print(f"[FIX][ERROR] Узел вернул статус {response.status_code}") except Exception as e: print(f"[FIX][FATAL] Не удалось связаться с узлом {node_ip}: {e}") def collect_network_states() -> Dict[str, Any]: flow_settings_url = core._config.get("flow_settings_url") try: response = requests.get(flow_settings_url, timeout=5.0) if response.status_code != 200: raise HTTPException(status_code=502, detail="Flow-settings недоступен") nodes = response.json() except Exception as e: raise HTTPException(status_code=502, detail=f"Ошибка сети flow-settings: {e}") node_ips = nodes.get("node_ips", {}) if not node_ips: raise HTTPException(status_code=404, detail="Список активных узлов пуст") network_states = {} for node_name, node_ip in node_ips.items(): try: metrics_url = f"http://{node_ip}/metrics" metrics_response = requests.get(metrics_url, timeout=3.0) if metrics_response.status_code == 200: data = metrics_response.json() data["node_ip"] = node_ip network_states[node_name] = data except Exception: continue return network_states class PartialDiagnosticRequest(BaseModel): run_modules: Optional[List[str]] = None @app.get("/api/v1/diagnostics") def run_full_diagnostics(): network_states = collect_network_states() global_reports = {} for node_name, node_data in network_states.items(): node_ip = node_data.pop("node_ip", None) if not node_ip: print(f"[ERROR] Не найден IP для узла {node_name}, исправление прав невозможно.") actual_state = {node_name: node_data} report = core.execute_diagnostics(target_modules=None, actual_state=actual_state) core.save_and_respond(report) integrity_report = report.get("modules", {}).get("integrity", {}) mismatched_perms = integrity_report.get("mismatched_permissions", []) if mismatched_perms: fix_remote_permissions(node_ip, mismatched_perms) global_reports[node_name] = report return {"status": "SUCCESS", "results": global_reports} @app.post("/api/v1/diagnostics/partial") def run_partial_diagnostics(payload: PartialDiagnosticRequest): network_states = collect_network_states() global_reports = {} for node_name, node_data in network_states.items(): node_ip = node_data.pop("node_ip", None) if not node_ip: print(f"[ERROR] Не найден IP для узла {node_name}, исправление прав невозможно.") wrapped_state = {node_name: node_data} report = core.execute_diagnostics(target_modules=payload.run_modules, actual_state=wrapped_state) core.save_and_respond(report) if "integrity" in payload.run_modules: integrity_report = report.get("modules", {}).get("integrity", {}) mismatched_perms = integrity_report.get("mismatched_permissions", []) if mismatched_perms: fix_remote_permissions(node_ip, mismatched_perms) global_reports[node_name] = report return {"status": "SUCCESS", "results": global_reports} if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000, log_level="info")