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