import json import logging from typing import Optional from utils.i18n import get_translations from babel.support import Translations from fastapi import Depends from pathlib import Path logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) class SettingsService: """Сервис для управления настройками и очистки данных сети.""" def __init__(self, translations: Translations = Depends(get_translations())): self.subnet_base_path = "storage/subnets" self.wifi_file = "storage/wifi/wifi.json" self.translations = translations def clear_subnet(self, subnet: Optional[str] = None) -> bool: """Очищает данные узлов подсети в указанном файле или во всех файлах. Args: subnet (Optional[str]): Подсеть в формате CIDR (например, "10.1.1.0/24"). Если None, очищает все подсети. Returns: bool: True, если очистка успешна. Raises: Exception: Если произошла ошибка при записи в файл. """ try: 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 except FileNotFoundError: logger.info("No subnet files found, clearing considered successful") return True except Exception as e: logger.error(f"Error clearing subnet nodes: {str(e)}") raise Exception(self.translations.gettext("Ошибка очистки узлов подсети: {error}").format(error=str(e))) 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) logger.info("Wi-Fi access points data successfully cleared") return True except FileNotFoundError: logger.info("Wi-Fi file not found, clearing considered successful") return True except Exception as e: logger.error(f"Error clearing Wi-Fi access points: {str(e)}") raise Exception(self.translations.gettext("Ошибка очистки точек доступа Wi-Fi: {error}").format(error=str(e))) def clear_all_data(self) -> bool: """Очищает данные узлов всех подсетей и точек доступа Wi-Fi. Returns: bool: True, если очистка успешна. Raises: Exception: Если произошла ошибка при записи в один из файлов. """ try: try: 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}") except FileNotFoundError: logger.info("No subnet files found, clearing considered successful") try: with open(self.wifi_file, "w") as f: json.dump([], f) except FileNotFoundError: logger.info("Wi-Fi file not found, clearing considered successful") logger.info("All network data successfully cleared") return True except Exception as e: logger.error(f"Error clearing all network data: {str(e)}") raise Exception(self.translations.gettext("Ошибка очистки всех сетевых данных: {error}").format(error=str(e)))