from typing import Dict, Any from fastapi import APIRouter, Body, HTTPException, Depends from services.ip_service import IPService from utils.i18n import get_translations from babel.support import Translations router = APIRouter() ip_service = IPService() @router.post("/check_ip") async def check_ip_config(data: Dict[str, Any] = Body(...), translations: Translations = Depends(get_translations())): """Проверяет доступность IP-адреса перед его применением. Выполняет ARP-сканирование для проверки, занят ли указанный IP-адрес, и возвращает результат проверки. Args: data (Dict[str, Any]): Словарь с данными конфигурации, включая "ipv4_updates" с полем "ipv4.address-data" для нового IP-адреса. translations: Объект переводов для текущего языка. Returns: Dict[str, Any]: Словарь с ключами: - "available" (bool): Доступен ли IP-адрес. - "message" (str): Сообщение о результате проверки. Raises: HTTPException: Если произошла внутренняя ошибка (status_code=500). """ try: result = await ip_service.check_ip_config(data, translations) return result except Exception as e: raise HTTPException( status_code=500, detail=translations.gettext("Ошибка проверки IP конфигурации: {error}").format(error=str(e)) ) @router.post("/apply_ip") async def apply_ip_config(data: Dict[str, Any] = Body(...), translations: Translations = Depends(get_translations())): """Применяет проверенные IP-настройки к указанному сетевому профилю. Обновляет настройки соединения через NetworkManager, отключает и переподключает устройство к сети. Args: data (Dict[str, Any]): Словарь с данными конфигурации, включая "connection_id" и "ipv4_updates" с обновлениями IP-настроек. translations: Объект переводов для текущего языка. Returns: dict: Словарь с ключами: - "success" (bool): Успешность операции. - "message" (str): Сообщение об успешном применении настроек. Raises: HTTPException: Если подключение не найдено (status_code=404) или произошла внутренняя ошибка (status_code=500). """ try: await ip_service.apply_ip_config(data, translations) return { "success": True, "message": translations.gettext("Настройки сетевого профиля для {connection_id} применены").format( connection_id=data["connection_id"] ), } except ValueError as e: raise HTTPException(status_code=404, detail=translations.gettext(str(e))) except Exception as e: raise HTTPException( status_code=500, detail=translations.gettext("Ошибка проверки IP конфигурации: {error}").format(error=str(e)) ) @router.post("/save_ip") async def save_ip_config(data: Dict[str, Any] = Body(...), translations: Translations = Depends(get_translations())): """Применяет проверенные IP-настройки для отката сетевого профиля. Используется для сохранения и отката настроек сетевого профиля к предыдущему состоянию через NetworkManager. Args: data (Dict[str, Any]): Словарь с данными конфигурации, включая "connection_id" и "ipv4_updates" с обновлениями IP-настроек. translations: Объект переводов для текущего языка. Returns: dict: Словарь с ключами: - "success" (bool): Успешность операции. - "message" (str): Сообщение об успешном применении настроек. Raises: HTTPException: Если подключение не найдено (status_code=404) или произошла внутренняя ошибка (status_code=500). """ try: await ip_service.apply_ip_config(data, translations) return { "success": True, "message": translations.gettext("Настройки сетевого профиля для {connection_id} применены").format( connection_id=data["connection_id"] ), } except ValueError as e: raise HTTPException(status_code=404, detail=translations.gettext(str(e))) except Exception as e: raise HTTPException( status_code=500, detail=translations.gettext("Ошибка проверки IP конфигурации: {error}").format(error=str(e)) )