gonets/SRV/api/v1/ip.py
2025-11-19 15:03:02 +05:00

111 lines
5.3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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))
)