diff --git a/.gitignore b/.gitignore index ea15021..5bc94dd 100644 --- a/.gitignore +++ b/.gitignore @@ -6,5 +6,5 @@ __pycache__ .wheels .vendor .python3-deb -SRV/storage/devices/devices.json +SRV/storage/subnets/* SRV/storage/wifi/wifi.json \ No newline at end of file diff --git a/SRV/.gitignore b/SRV/.gitignore index 9cb3d81..20dffb4 100644 --- a/SRV/.gitignore +++ b/SRV/.gitignore @@ -6,4 +6,5 @@ __pycache__ .wheels .vendor .python3-deb -storage/devices/ \ No newline at end of file +storage/subnets/ +storage/wifi/ \ No newline at end of file diff --git a/SRV/api/v1/settings.py b/SRV/api/v1/settings.py index 94cbdb6..a6d9f23 100644 --- a/SRV/api/v1/settings.py +++ b/SRV/api/v1/settings.py @@ -1,11 +1,12 @@ import os import logging from typing import Optional -from fastapi import APIRouter, HTTPException, Depends, Response, Request +from fastapi import APIRouter, HTTPException, Depends, Response, Request, Body from starlette.responses import FileResponse from services.settings_service import SettingsService from utils.i18n import get_translations from babel.support import Translations +from models.subnet import SubnetScanRequest # Предполагается, что модель определена logging.basicConfig(level=logging.DEBUG) logger = logging.getLogger(__name__) @@ -96,13 +97,13 @@ def clear_all_data(translations: Translations = Depends(get_translations())): DEVICE_PATH = "storage/devices/devices.json" WIFI_PATH = "storage/wifi/wifi.json" -@router.get("/export_devices", response_class=FileResponse) -async def export_devices(subnet: str, translations: Translations = Depends(get_translations())): +@router.post("/export_devices", response_class=FileResponse) +async def export_devices(request: SubnetScanRequest = Body(...), translations: Translations = Depends(get_translations())): """ Экспортирует файл с данными устройств в формате JSON для указанной подсети. Args: - subnet (str): Подсеть в формате CIDR (например, "10.1.1.0/24"). + request (SubnetScanRequest): Объект с полем subnet в формате CIDR. translations: Объект переводов для текущего языка. Returns: @@ -111,10 +112,11 @@ async def export_devices(subnet: str, translations: Translations = Depends(get_t Raises: HTTPException: Если файл не найден (status_code=404). """ + subnet = request.subnet file_path = f"storage/subnets/{subnet.replace('/', '_')}.json" if not os.path.exists(file_path): logger.warning(f"Export file not found: {file_path}") - raise HTTPException(status_code=404, detail=translations.gettext("Файл не найден")) + raise HTTPException(status_code=404, detail=translations.gettext("Файл для подсети {subnet} не найден").format(subnet=subnet)) logger.info(f"Exporting file: {file_path}") return FileResponse( path=file_path, diff --git a/SRV/locales/en/LC_MESSAGES/messages.mo b/SRV/locales/en/LC_MESSAGES/messages.mo index dcae5aa..1bdfb80 100644 Binary files a/SRV/locales/en/LC_MESSAGES/messages.mo and b/SRV/locales/en/LC_MESSAGES/messages.mo differ diff --git a/SRV/locales/en/LC_MESSAGES/messages.po b/SRV/locales/en/LC_MESSAGES/messages.po index b44ef16..68e1205 100644 --- a/SRV/locales/en/LC_MESSAGES/messages.po +++ b/SRV/locales/en/LC_MESSAGES/messages.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2025-07-16 13:15+0500\n" -"PO-Revision-Date: 2025-07-16 13:15+0500\n" +"POT-Creation-Date: 2025-07-16 13:39+0500\n" +"PO-Revision-Date: 2025-07-16 13:39+0500\n" "Last-Translator: FULL NAME \n" "Language: en\n" "Language-Team: en \n" @@ -96,55 +96,60 @@ msgstr "Failed to update container position: {error}" msgid "Не удалось получить имя хоста" msgstr "Failed to retrieve hostname" -#: api/v1/settings.py:37 +#: api/v1/settings.py:38 #, python-brace-format msgid "Данные узлов подсети {subnet} успешно очищены" msgstr "Subnet node data for {subnet} successfully cleared" -#: api/v1/settings.py:39 +#: api/v1/settings.py:40 msgid "Данные всех подсетей успешно очищены" msgstr "All subnet data successfully cleared" -#: api/v1/settings.py:41 +#: api/v1/settings.py:42 msgid "Не удалось очистить данные узлов подсети" msgstr "Failed to clear subnet node data" -#: api/v1/settings.py:44 api/v1/settings.py:69 api/v1/settings.py:94 +#: api/v1/settings.py:45 api/v1/settings.py:70 api/v1/settings.py:95 #, python-brace-format msgid "Ошибка очистки: {error}" msgstr "Clear error: {error}" -#: api/v1/settings.py:64 +#: api/v1/settings.py:65 msgid "Данные точек доступа Wi-Fi успешно очищены" msgstr "Wi-Fi access point data successfully cleared" -#: api/v1/settings.py:66 +#: api/v1/settings.py:67 msgid "Не удалось очистить данные точек доступа Wi-Fi" msgstr "Failed to clear Wi-Fi access point data" -#: api/v1/settings.py:89 +#: api/v1/settings.py:90 msgid "Все сетевые данные успешно очищены" msgstr "All network data successfully cleared" -#: api/v1/settings.py:91 +#: api/v1/settings.py:92 msgid "Не удалось очистить все сетевые данные" msgstr "Failed to clear all network data" -#: api/v1/settings.py:117 api/v1/settings.py:141 +#: api/v1/settings.py:119 +#, python-brace-format +msgid "Файл для подсети {subnet} не найден" +msgstr "File for subnet {subnet} not found" + +#: api/v1/settings.py:143 msgid "Файл не найден" msgstr "File not found" -#: api/v1/settings.py:166 +#: api/v1/settings.py:168 #, python-brace-format msgid "Язык '{locale}' не поддерживается." msgstr "Language '{locale}' is not supported." -#: api/v1/settings.py:172 +#: api/v1/settings.py:174 #, python-brace-format msgid "Язык '{locale}' не поддерживается (нет файлов переводов)." msgstr "Language '{locale}' is not supported (no translation files)." -#: api/v1/settings.py:175 +#: api/v1/settings.py:177 #, python-brace-format msgid "Язык успешно установлен: {locale}" msgstr "Language successfully set: {locale}" @@ -421,24 +426,24 @@ msgstr "Wi-Fi access point clear error: {error}" msgid "Ошибка очистки всех сетевых данных: {error}" msgstr "All network data clear error: {error}" -#: services/subnet_service.py:75 services/wifi_service.py:115 +#: services/subnet_service.py:151 services/wifi_service.py:115 msgid "Неизвестный" msgstr "Unknown" -#: services/subnet_service.py:185 +#: services/subnet_service.py:327 #, python-brace-format msgid "Ошибка при сохранении устройств: {error}" msgstr "Error saving devices: {error}" -#: services/subnet_service.py:268 +#: services/subnet_service.py:441 msgid "Недопустимая подсеть по умолчанию" msgstr "Invalid default subnet" -#: services/subnet_service.py:288 +#: services/subnet_service.py:461 msgid "В данной подсети не обнаружено устройств" msgstr "No devices found in this subnet" -#: services/subnet_service.py:345 +#: services/subnet_service.py:518 #, python-brace-format msgid "Ошибка сканирования: {error}" msgstr "Scan error: {error}" diff --git a/SRV/locales/messages.pot b/SRV/locales/messages.pot index d24418d..d30c15c 100644 --- a/SRV/locales/messages.pot +++ b/SRV/locales/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2025-07-16 13:15+0500\n" +"POT-Creation-Date: 2025-07-16 13:39+0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -95,55 +95,60 @@ msgstr "" msgid "Не удалось получить имя хоста" msgstr "" -#: api/v1/settings.py:37 +#: api/v1/settings.py:38 #, python-brace-format msgid "Данные узлов подсети {subnet} успешно очищены" msgstr "" -#: api/v1/settings.py:39 +#: api/v1/settings.py:40 msgid "Данные всех подсетей успешно очищены" msgstr "" -#: api/v1/settings.py:41 +#: api/v1/settings.py:42 msgid "Не удалось очистить данные узлов подсети" msgstr "" -#: api/v1/settings.py:44 api/v1/settings.py:69 api/v1/settings.py:94 +#: api/v1/settings.py:45 api/v1/settings.py:70 api/v1/settings.py:95 #, python-brace-format msgid "Ошибка очистки: {error}" msgstr "" -#: api/v1/settings.py:64 +#: api/v1/settings.py:65 msgid "Данные точек доступа Wi-Fi успешно очищены" msgstr "" -#: api/v1/settings.py:66 +#: api/v1/settings.py:67 msgid "Не удалось очистить данные точек доступа Wi-Fi" msgstr "" -#: api/v1/settings.py:89 +#: api/v1/settings.py:90 msgid "Все сетевые данные успешно очищены" msgstr "" -#: api/v1/settings.py:91 +#: api/v1/settings.py:92 msgid "Не удалось очистить все сетевые данные" msgstr "" -#: api/v1/settings.py:117 api/v1/settings.py:141 +#: api/v1/settings.py:119 +#, python-brace-format +msgid "Файл для подсети {subnet} не найден" +msgstr "" + +#: api/v1/settings.py:143 msgid "Файл не найден" msgstr "" -#: api/v1/settings.py:166 +#: api/v1/settings.py:168 #, python-brace-format msgid "Язык '{locale}' не поддерживается." msgstr "" -#: api/v1/settings.py:172 +#: api/v1/settings.py:174 #, python-brace-format msgid "Язык '{locale}' не поддерживается (нет файлов переводов)." msgstr "" -#: api/v1/settings.py:175 +#: api/v1/settings.py:177 #, python-brace-format msgid "Язык успешно установлен: {locale}" msgstr "" @@ -420,24 +425,24 @@ msgstr "" msgid "Ошибка очистки всех сетевых данных: {error}" msgstr "" -#: services/subnet_service.py:75 services/wifi_service.py:115 +#: services/subnet_service.py:151 services/wifi_service.py:115 msgid "Неизвестный" msgstr "" -#: services/subnet_service.py:185 +#: services/subnet_service.py:327 #, python-brace-format msgid "Ошибка при сохранении устройств: {error}" msgstr "" -#: services/subnet_service.py:268 +#: services/subnet_service.py:441 msgid "Недопустимая подсеть по умолчанию" msgstr "" -#: services/subnet_service.py:288 +#: services/subnet_service.py:461 msgid "В данной подсети не обнаружено устройств" msgstr "" -#: services/subnet_service.py:345 +#: services/subnet_service.py:518 #, python-brace-format msgid "Ошибка сканирования: {error}" msgstr "" diff --git a/SRV/locales/ru/LC_MESSAGES/messages.mo b/SRV/locales/ru/LC_MESSAGES/messages.mo index d1ae31a..05cd8e7 100644 Binary files a/SRV/locales/ru/LC_MESSAGES/messages.mo and b/SRV/locales/ru/LC_MESSAGES/messages.mo differ diff --git a/SRV/locales/ru/LC_MESSAGES/messages.po b/SRV/locales/ru/LC_MESSAGES/messages.po index 519a662..ad43a1a 100644 --- a/SRV/locales/ru/LC_MESSAGES/messages.po +++ b/SRV/locales/ru/LC_MESSAGES/messages.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2025-07-16 13:15+0500\n" -"PO-Revision-Date: 2025-07-16 13:15+0500\n" +"POT-Creation-Date: 2025-07-16 13:39+0500\n" +"PO-Revision-Date: 2025-07-16 13:39+0500\n" "Last-Translator: FULL NAME \n" "Language: ru\n" "Language-Team: ru \n" @@ -99,55 +99,60 @@ msgstr "Не удалось обновить положение контейне msgid "Не удалось получить имя хоста" msgstr "Не удалось получить имя хоста" -#: api/v1/settings.py:37 +#: api/v1/settings.py:38 #, python-brace-format msgid "Данные узлов подсети {subnet} успешно очищены" msgstr "Данные узлов подсети {subnet} успешно очищены" -#: api/v1/settings.py:39 +#: api/v1/settings.py:40 msgid "Данные всех подсетей успешно очищены" msgstr "Данные всех подсетей успешно очищены" -#: api/v1/settings.py:41 +#: api/v1/settings.py:42 msgid "Не удалось очистить данные узлов подсети" msgstr "Не удалось очистить данные узлов подсети" -#: api/v1/settings.py:44 api/v1/settings.py:69 api/v1/settings.py:94 +#: api/v1/settings.py:45 api/v1/settings.py:70 api/v1/settings.py:95 #, python-brace-format msgid "Ошибка очистки: {error}" msgstr "Ошибка очистки: {error}" -#: api/v1/settings.py:64 +#: api/v1/settings.py:65 msgid "Данные точек доступа Wi-Fi успешно очищены" msgstr "Данные точек доступа Wi-Fi успешно очищены" -#: api/v1/settings.py:66 +#: api/v1/settings.py:67 msgid "Не удалось очистить данные точек доступа Wi-Fi" msgstr "Не удалось очистить данные точек доступа Wi-Fi" -#: api/v1/settings.py:89 +#: api/v1/settings.py:90 msgid "Все сетевые данные успешно очищены" msgstr "Все сетевые данные успешно очищены" -#: api/v1/settings.py:91 +#: api/v1/settings.py:92 msgid "Не удалось очистить все сетевые данные" msgstr "Не удалось очистить все сетевые данные" -#: api/v1/settings.py:117 api/v1/settings.py:141 +#: api/v1/settings.py:119 +#, python-brace-format +msgid "Файл для подсети {subnet} не найден" +msgstr "Файл для подсети {subnet} не найден" + +#: api/v1/settings.py:143 msgid "Файл не найден" msgstr "Файл не найден" -#: api/v1/settings.py:166 +#: api/v1/settings.py:168 #, python-brace-format msgid "Язык '{locale}' не поддерживается." msgstr "Язык '{locale}' не поддерживается." -#: api/v1/settings.py:172 +#: api/v1/settings.py:174 #, python-brace-format msgid "Язык '{locale}' не поддерживается (нет файлов переводов)." msgstr "Язык '{locale}' не поддерживается (нет файлов переводов)." -#: api/v1/settings.py:175 +#: api/v1/settings.py:177 #, python-brace-format msgid "Язык успешно установлен: {locale}" msgstr "Язык успешно установлен: {locale}" @@ -426,24 +431,24 @@ msgstr "Ошибка очистки точек доступа Wi-Fi: {error}" msgid "Ошибка очистки всех сетевых данных: {error}" msgstr "Ошибка очистки всех сетевых данных: {error}" -#: services/subnet_service.py:75 services/wifi_service.py:115 +#: services/subnet_service.py:151 services/wifi_service.py:115 msgid "Неизвестный" msgstr "Неизвестный" -#: services/subnet_service.py:185 +#: services/subnet_service.py:327 #, python-brace-format msgid "Ошибка при сохранении устройств: {error}" msgstr "Ошибка при сохранении устройств: {error}" -#: services/subnet_service.py:268 +#: services/subnet_service.py:441 msgid "Недопустимая подсеть по умолчанию" msgstr "Недопустимая подсеть по умолчанию" -#: services/subnet_service.py:288 +#: services/subnet_service.py:461 msgid "В данной подсети не обнаружено устройств" msgstr "В данной подсети не обнаружено устройств" -#: services/subnet_service.py:345 +#: services/subnet_service.py:518 #, python-brace-format msgid "Ошибка сканирования: {error}" msgstr "Ошибка сканирования: {error}"