2025-06-23 15:19:56 +05:00
|
|
|
import json
|
|
|
|
|
import logging
|
2025-07-16 13:27:49 +05:00
|
|
|
from typing import Optional
|
|
|
|
|
|
|
|
|
|
from utils.i18n import get_translations
|
2025-07-08 15:57:42 +05:00
|
|
|
from babel.support import Translations
|
2025-07-16 13:27:49 +05:00
|
|
|
from pathlib import Path
|
2025-06-23 15:19:56 +05:00
|
|
|
|
|
|
|
|
logging.basicConfig(level=logging.INFO)
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
class SettingsService:
|
|
|
|
|
"""Сервис для управления настройками и очистки данных сети."""
|
|
|
|
|
|
2025-11-17 12:05:43 +05:00
|
|
|
def __init__(self, translations: Translations = None):
|
2025-07-16 13:27:49 +05:00
|
|
|
self.subnet_base_path = "storage/subnets"
|
2025-06-23 15:19:56 +05:00
|
|
|
self.wifi_file = "storage/wifi/wifi.json"
|
2025-11-17 12:05:43 +05:00
|
|
|
self.translations = translations or get_translations()()
|
2025-06-23 15:19:56 +05:00
|
|
|
|
2025-07-16 13:27:49 +05:00
|
|
|
def clear_subnet(self, subnet: Optional[str] = None) -> bool:
|
|
|
|
|
"""Очищает данные узлов подсети в указанном файле или во всех файлах.
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
subnet (Optional[str]): Подсеть в формате CIDR (например, "10.1.1.0/24").
|
|
|
|
|
Если None, очищает все подсети.
|
2025-06-23 15:19:56 +05:00
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
bool: True, если очистка успешна.
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
Exception: Если произошла ошибка при записи в файл.
|
|
|
|
|
"""
|
|
|
|
|
try:
|
2025-07-16 13:27:49 +05:00
|
|
|
if subnet:
|
|
|
|
|
file_path = Path(self.subnet_base_path) / f"{subnet.replace('/', '_')}.json"
|
|
|
|
|
if file_path.exists():
|
|
|
|
|
with open(file_path, "w") as f:
|
|
|
|
|
json.dump([], f)
|
|
|
|
|
logger.info(f"Subnet nodes data cleared for {subnet}")
|
|
|
|
|
else:
|
|
|
|
|
logger.info(f"Subnet file not found for {subnet}, clearing considered successful")
|
|
|
|
|
return True
|
|
|
|
|
else:
|
|
|
|
|
for file_path in Path(self.subnet_base_path).glob("*.json"):
|
|
|
|
|
with open(file_path, "w") as f:
|
|
|
|
|
json.dump([], f)
|
|
|
|
|
logger.info(f"Cleared subnet data in {file_path}")
|
|
|
|
|
return True
|
2025-07-04 13:48:38 +05:00
|
|
|
except FileNotFoundError:
|
2025-07-16 13:27:49 +05:00
|
|
|
logger.info("No subnet files found, clearing considered successful")
|
2025-07-04 13:48:38 +05:00
|
|
|
return True
|
2025-06-23 15:19:56 +05:00
|
|
|
except Exception as e:
|
2025-07-08 15:57:42 +05:00
|
|
|
logger.error(f"Error clearing subnet nodes: {str(e)}")
|
|
|
|
|
raise Exception(self.translations.gettext("Ошибка очистки узлов подсети: {error}").format(error=str(e)))
|
2025-06-23 15:19:56 +05:00
|
|
|
|
|
|
|
|
def clear_wifi(self) -> bool:
|
|
|
|
|
"""Очищает данные точек доступа Wi-Fi в файле wifi.json.
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
bool: True, если очистка успешна.
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
Exception: Если произошла ошибка при записи в файл.
|
|
|
|
|
"""
|
|
|
|
|
try:
|
|
|
|
|
with open(self.wifi_file, "w") as f:
|
|
|
|
|
json.dump([], f)
|
2025-07-08 15:57:42 +05:00
|
|
|
logger.info("Wi-Fi access points data successfully cleared")
|
2025-06-23 15:19:56 +05:00
|
|
|
return True
|
2025-07-04 13:48:38 +05:00
|
|
|
except FileNotFoundError:
|
2025-07-08 15:57:42 +05:00
|
|
|
logger.info("Wi-Fi file not found, clearing considered successful")
|
2025-07-04 13:48:38 +05:00
|
|
|
return True
|
2025-06-23 15:19:56 +05:00
|
|
|
except Exception as e:
|
2025-07-08 15:57:42 +05:00
|
|
|
logger.error(f"Error clearing Wi-Fi access points: {str(e)}")
|
|
|
|
|
raise Exception(self.translations.gettext("Ошибка очистки точек доступа Wi-Fi: {error}").format(error=str(e)))
|
2025-06-23 15:19:56 +05:00
|
|
|
|
|
|
|
|
def clear_all_data(self) -> bool:
|
2025-07-16 13:27:49 +05:00
|
|
|
"""Очищает данные узлов всех подсетей и точек доступа Wi-Fi.
|
2025-06-23 15:19:56 +05:00
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
bool: True, если очистка успешна.
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
Exception: Если произошла ошибка при записи в один из файлов.
|
|
|
|
|
"""
|
|
|
|
|
try:
|
2025-07-04 13:48:38 +05:00
|
|
|
try:
|
2025-07-16 13:27:49 +05:00
|
|
|
for file_path in Path(self.subnet_base_path).glob("*.json"):
|
|
|
|
|
with open(file_path, "w") as f:
|
|
|
|
|
json.dump([], f)
|
|
|
|
|
logger.info(f"Cleared subnet data in {file_path}")
|
2025-07-04 13:48:38 +05:00
|
|
|
except FileNotFoundError:
|
2025-07-16 13:27:49 +05:00
|
|
|
logger.info("No subnet files found, clearing considered successful")
|
2025-07-04 13:48:38 +05:00
|
|
|
try:
|
|
|
|
|
with open(self.wifi_file, "w") as f:
|
|
|
|
|
json.dump([], f)
|
|
|
|
|
except FileNotFoundError:
|
2025-07-08 15:57:42 +05:00
|
|
|
logger.info("Wi-Fi file not found, clearing considered successful")
|
|
|
|
|
logger.info("All network data successfully cleared")
|
2025-06-23 15:19:56 +05:00
|
|
|
return True
|
|
|
|
|
except Exception as e:
|
2025-07-08 15:57:42 +05:00
|
|
|
logger.error(f"Error clearing all network data: {str(e)}")
|
2025-11-17 12:05:43 +05:00
|
|
|
raise Exception(self.translations.gettext("Ошибка очистки всех сетевых данных: {error}").format(error=str(e)))
|