diff --git a/SRV/api/router.py b/SRV/api/router.py index 167c19d..9c1061f 100644 --- a/SRV/api/router.py +++ b/SRV/api/router.py @@ -1,5 +1,5 @@ from fastapi import APIRouter -from .v1 import ufw, websocket, ip, network, auth, subnet +from .v1 import ufw, websocket, ip, network, auth, subnet, settings router = APIRouter() @@ -10,3 +10,5 @@ router.include_router(network.router, prefix="/network", tags=["Network"]) router.include_router(auth.router, prefix="/auth", tags=["Auth"]) router.include_router(subnet.router, prefix="/subnet", tags=["Subnet"]) + +router.include_router(settings.router, prefix="/settings", tags=["Settings"]) diff --git a/SRV/api/v1/settings.py b/SRV/api/v1/settings.py new file mode 100644 index 0000000..ea370bf --- /dev/null +++ b/SRV/api/v1/settings.py @@ -0,0 +1,62 @@ +from fastapi import APIRouter, HTTPException +from services.settings_service import SettingsService + +router = APIRouter() +settings_service = SettingsService() + +@router.post("/clear_subnet") +def clear_subnet(): + """Очищает данные узлов подсети, сохранённые в devices.json. + + Удаляет все записи об узлах подсети, оставляя файл пустым. + + Returns: + dict: Словарь с сообщением об успешной очистке. + + Raises: + HTTPException: Если произошла ошибка очистки (status_code=500). + """ + try: + success = settings_service.clear_subnet() + if success: + return {"message": "Данные узлов подсети успешно очищены"} + except Exception as e: + raise HTTPException(status_code=500, detail=f"Ошибка очистки: {str(e)}") + +@router.post("/clear_wifi") +def clear_wifi(): + """Очищает данные точек доступа Wi-Fi, сохранённые в wifi.json. + + Удаляет все записи о точках доступа, оставляя файл пустым. + + Returns: + dict: Словарь с сообщением об успешной очистке. + + Raises: + HTTPException: Если произошла ошибка очистки (status_code=500). + """ + try: + success = settings_service.clear_wifi() + if success: + return {"message": "Данные точек доступа Wi-Fi успешно очищены"} + except Exception as e: + raise HTTPException(status_code=500, detail=f"Ошибка очистки: {str(e)}") + +@router.post("/clear_all_data") +def clear_all_data(): + """Очищает данные узлов подсети и точек доступа Wi-Fi в обоих файлах. + + Удаляет все записи из devices.json и wifi.json. + + Returns: + dict: Словарь с сообщением об успешной очистке. + + Raises: + HTTPException: Если произошла ошибка очистки (status_code=500). + """ + try: + success = settings_service.clear_all_data() + if success: + return {"message": "Все сетевые данные успешно очищены"} + except Exception as e: + raise HTTPException(status_code=500, detail=f"Ошибка очистки: {str(e)}") \ No newline at end of file diff --git a/SRV/services/auth_service.py b/SRV/services/auth_service.py index 8675f1b..818fba0 100644 --- a/SRV/services/auth_service.py +++ b/SRV/services/auth_service.py @@ -75,32 +75,21 @@ class AuthService: db_user = self.storage.get_user_by_username(user.username) if not db_user: logger.error(f"Пользователь {user.username} не найден") - raise HTTPException(status_code=401, - detail="Неверный логин или пароль") - if not self.storage.verify_password(user.password, - db_user["password_hash"]): + raise HTTPException(status_code=401, detail="Неверный логин или пароль") + if not self.storage.verify_password(user.password, db_user["password_hash"]): logger.error( f"Неверный пароль для пользователя {user.username}") - raise HTTPException(status_code=401, - detail="Неверный логин или пароль") + raise HTTPException(status_code=401, detail="Неверный логин или пароль") access_token = self.create_access_token( data={"sub": user.username}) session_id = self.session_storage.create_session( user.username, access_token, client_id) logger.info(f"Пользователь {user.username} успешно авторизован") return { - "access_token": - access_token, - "token_type": - "bearer", - "session_id": - session_id, - "user": - UserResponse( - id=db_user["id"], - username=db_user["username"], - is_admin=db_user["is_admin"], - ), + "access_token": access_token, + "token_type": "bearer", + "session_id": session_id, + "user": UserResponse(id=db_user["id"], username=db_user["username"], is_admin=db_user["is_admin"]), } except Exception as e: logger.error( @@ -119,11 +108,8 @@ class AuthService: db_user = self.storage.get_user_by_username(username) if not db_user: logger.error(f"Пользователь {username} не найден") - raise HTTPException(status_code=401, - detail="Пользователь не найден") - return UserResponse(id=db_user["id"], - username=db_user["username"], - is_admin=db_user["is_admin"]) + raise HTTPException(status_code=401, detail="Пользователь не найден") + return UserResponse(id=db_user["id"], username=db_user["username"], is_admin=db_user["is_admin"]) def get_user_by_session(self, client_id: str) -> dict: """Получает пользователя и токен по client_id""" @@ -131,24 +117,17 @@ class AuthService: if not session: logger.error( f"Сессия для client_id {client_id} не найдена или истекла") - raise HTTPException(status_code=401, - detail="Сессия недействительна") + raise HTTPException(status_code=401, detail="Сессия недействительна") username = session["username"] token = session["token"] db_user = self.storage.get_user_by_username(username) if not db_user: logger.error(f"Пользователь {username} не найден") - raise HTTPException(status_code=401, - detail="Пользователь не найден") + raise HTTPException(status_code=401, detail="Пользователь не найден") return { "user": - UserResponse( - id=db_user["id"], - username=db_user["username"], - is_admin=db_user["is_admin"], - ), - "access_token": - token, + UserResponse(id=db_user["id"], username=db_user["username"], is_admin=db_user["is_admin"]), + "access_token": token } def logout(self, client_id: str): @@ -164,5 +143,4 @@ class AuthService: except Exception as e: logger.error( f"Ошибка при выходе из системы: {type(e).__name__} - {str(e)}") - raise HTTPException(status_code=500, - detail="Ошибка при выходе из системы") + raise HTTPException(status_code=500, detail="Ошибка при выходе из системы") diff --git a/SRV/services/settings_service.py b/SRV/services/settings_service.py new file mode 100644 index 0000000..4b6d9cc --- /dev/null +++ b/SRV/services/settings_service.py @@ -0,0 +1,68 @@ +import json +import logging + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +class SettingsService: + """Сервис для управления настройками и очистки данных сети.""" + + def __init__(self): + self.subnet_file = "storage/devices/devices.json" + self.wifi_file = "storage/wifi/wifi.json" + + def clear_subnet(self) -> bool: + """Очищает данные узлов подсети в файле devices.json. + + Returns: + bool: True, если очистка успешна. + + Raises: + Exception: Если произошла ошибка при записи в файл. + """ + try: + with open(self.subnet_file, "w") as f: + json.dump([], f) + logger.info("Данные узлов подсети успешно очищены") + return True + except Exception as e: + logger.error(f"Ошибка очистки узлов подсети: {str(e)}") + raise + + 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 успешно очищены") + return True + except Exception as e: + logger.error(f"Ошибка очистки точек доступа Wi-Fi: {str(e)}") + raise + + def clear_all_data(self) -> bool: + """Очищает данные узлов подсети и точек доступа Wi-Fi в обоих файлах. + + Returns: + bool: True, если очистка успешна. + + Raises: + Exception: Если произошла ошибка при записи в один из файлов. + """ + try: + with open(self.subnet_file, "w") as f: + json.dump([], f) + with open(self.wifi_file, "w") as f: + json.dump([], f) + logger.info("Все сетевые данные успешно очищены") + return True + except Exception as e: + logger.error(f"Ошибка очистки всех сетевых данных: {str(e)}") + raise \ No newline at end of file diff --git a/SRV/services/subnet_service.py b/SRV/services/subnet_service.py index 1733533..5384343 100644 --- a/SRV/services/subnet_service.py +++ b/SRV/services/subnet_service.py @@ -230,12 +230,12 @@ class DeviceStorage: Хранит устройства в JSON-файле и удаляет устаревшие записи. """ - def __init__(self, storage_path: str = "etc/gonets/SRV/storage/devices/devices.json"): + def __init__(self, storage_path: str = "storage/devices/devices.json"): """Инициализирует хранилище устройств с указанным путём. Args: storage_path (str, optional): Путь к файлу хранения. - По умолчанию "etc/gonets/SRV/storage/devices/devices.json". + По умолчанию "storage/devices/devices.json". Создаёт родительские директории, если они не существуют. """ diff --git a/SRV/services/wifi_service.py b/SRV/services/wifi_service.py index 9745b82..d82dccb 100644 --- a/SRV/services/wifi_service.py +++ b/SRV/services/wifi_service.py @@ -22,12 +22,12 @@ class WifiStorage: в JSON-файле на диске. """ - def __init__(self, storage_path: str = "etc/gonets/SRV/storage/wifi/wifi.json"): + def __init__(self, storage_path: str = "storage/wifi/wifi.json"): """Инициализирует объект хранилища Wi-Fi с указанным путём к файлу. Args: storage_path (str, optional): Путь к файлу для хранения заметок. - По умолчанию "etc/gonets/SRV/storage/wifi/wifi.json". + По умолчанию "storage/wifi/wifi.json". Создаёт родительские директории, если они не существуют. """