Generate Sphinx docs in markdown

This commit is contained in:
Merelden 2025-10-14 16:11:12 +05:00
parent bc4e9caacb
commit 81ff7959f7
84 changed files with 2873 additions and 29 deletions

View file

@ -0,0 +1,5 @@
# Конфигурация
* [config.cors](config/cors.md)
* [config.init_config](config/init_config.md)
* [config.ports](config/ports.md)

View file

@ -0,0 +1,27 @@
# config.cors
Конфигурация CORS для FastAPI-приложения GONETS.
Модуль инкапсулирует добавление middleware CORSMiddleware со списком
разрешённых источников (origins), характерных для локальной разработки и
типовых портов фронтенда (например, Vite/React на 5173/5174, dev‑серверы).
Использование:
: cors_config = CORSMiddlewareConfig(app)
cors_config.add_cors_middleware()
Поведение:
: - Разрешены все методы (allow_methods=[“\*”]) и заголовки (allow_headers=[“\*”]).
- Разрешены креденшлы (allow_credentials=True) для работы с куками (локаль и др.).
- При необходимости список origins можно расширить или параметризовать
на основе конфигурационного файла окружения.
### *class* config.cors.CORSMiddlewareConfig(app: FastAPI)
Bases: `object`
Класс для настройки CORS политики в FastAPI
#### add_cors_middleware() → None
Добавляем CORS в приложение FastAPI

View file

@ -0,0 +1 @@
# config.init_config

View file

@ -0,0 +1,28 @@
# config.ports
### *class* config.ports.PortConfig(custom_ports: Dict[int, str] = None)
Bases: `object`
Конфигурация известных портов для сетевого анализа.
Назначение:
: Предоставляет сопоставление распространённых портов с человекочитаемыми
названиями сервисов для отображения в UI и логах. Поддерживает расширение
пользовательским словарём.
#### get_port_name(port: int) → str
Возвращает название сервиса для указанного порта.
* **Parameters:**
**port** – Номер порта.
* **Returns:**
Название сервиса или строка вида ‘Port-<port>’.
#### get_ports() → List[int]
Возвращает список всех номеров портов.
* **Returns:**
Список номеров портов.

3
SRV/docs/_build/markdown/api/core.md vendored Normal file
View file

@ -0,0 +1,3 @@
# Core
* [core.cli_executor](core/cli_executor.md)

View file

@ -0,0 +1,22 @@
# core.cli_executor
### *class* core.cli_executor.CLIExecutor
Bases: `object`
Утилита для безопасного выполнения CLI‑команд.
Назначение:
: Инкапсулирует вызов subprocess.run и приводит результат к удобному
кортежу (код возврата, stdout) без генерации исключений при ошибках.
#### *static* run(command: list) → Tuple[int, str]
Выполняет команду в системе и возвращает код и вывод.
* **Parameters:**
**command** (*list*) – Список аргументов команды для выполнения.
* **Returns:**
Код возврата и вывод команды.
* **Return type:**
tuple

View file

@ -0,0 +1,9 @@
# API эндпоинты
* [api.v1.auth](endpoints/auth.md)
* [api.v1.ip](endpoints/ip.md)
* [api.v1.network](endpoints/network.md)
* [api.v1.settings](endpoints/settings.md)
* [api.v1.subnet](endpoints/subnet.md)
* [api.v1.ufw](endpoints/ufw.md)
* [api.v1.websocket](endpoints/websocket.md)

View file

@ -0,0 +1,90 @@
# api.v1.auth
### *async* api.v1.auth.check_users_file(translations: Translations = Depends(translations_dependency))
Проверяет, существует ли файл users.json и содержит ли он пользователей.
Возвращает информацию о состоянии файла и наличии пользователей.
* **Returns:**
Словарь с ключами:
: - ”exists” (bool): Существует ли файл.
- ”has_users” (bool): Содержит ли файл пользователей.
- ”message” (str): Сообщение с описанием результата.
* **Return type:**
dict
* **Raises:**
**HTTPException** – Если произошла ошибка при проверке файла (status_code=500).
### *async* api.v1.auth.get_current_user(request: Request, translations: Translations = Depends(translations_dependency))
Возвращает данные текущего пользователя и токен.
Проверяет активную сессию по client_id и возвращает информацию о пользователе
и токен для дальнейшего использования.
* **Parameters:**
* **request** (*Request*) – Объект запроса для получения client_id (IP-адрес клиента).
* **translations** – Объект переводов для текущего языка.
* **Returns:**
Словарь с ключами “user” (UserResponse), “access_token” (str) и
: ”token_type” (str, всегда “bearer”).
* **Return type:**
dict
* **Raises:**
**HTTPException** – Если сессия не найдена или истекла (status_code=401) или
произошла внутренняя ошибка (status_code=500).
### *async* api.v1.auth.login(user: UserLogin, request: Request, translations: Translations = Depends(translations_dependency))
Авторизует пользователя и создаёт сессию.
Проверяет учетные данные пользователя и возвращает токен и session_id для
последующей авторизации.
* **Parameters:**
* **user** (*UserLogin*) – Объект с данными для входа (username, password).
* **request** (*Request*) – Объект запроса для получения client_id (IP-адрес клиента).
* **translations** – Объект переводов для текущего языка.
* **Returns:**
Объект с access_token и session_id для авторизации.
* **Return type:**
Token
* **Raises:**
**HTTPException** – Если учетные данные неверны (status_code=401) или произошла
внутренняя ошибка (status_code=500).
### *async* api.v1.auth.logout(request: Request, translations: Translations = Depends(translations_dependency))
Выход из системы, удаление сессии.
Удаляет активную сессию пользователя по client_id.
* **Parameters:**
* **request** (*Request*) – Объект запроса для получения client_id (IP-адрес клиента).
* **translations** – Объект переводов для текущего языка.
* **Returns:**
Пустой словарь или сообщение об успешном выходе.
* **Return type:**
dict
* **Raises:**
**HTTPException** – Если сессия не найдена (status_code=401) или произошла
внутренняя ошибка (status_code=500).
### *async* api.v1.auth.register(user: UserCreate, translations: Translations = Depends(translations_dependency))
Регистрирует нового пользователя.
Создаёт нового пользователя на основе предоставленных данных и возвращает
информацию о зарегистрированном пользователе.
* **Parameters:**
* **user** (*UserCreate*) – Объект с данными нового пользователя (username, password, is_admin).
* **translations** – Объект переводов для текущего языка.
* **Returns:**
Объект с данными зарегистрированного пользователя (id, username, is_admin).
* **Return type:**
UserResponse
* **Raises:**
**HTTPException** – Если пользователь уже существует (status_code=400) или произошла
внутренняя ошибка (status_code=500).

View file

@ -0,0 +1,63 @@
# api.v1.ip
### *async* api.v1.ip.apply_ip_config(data: Dict[str, Any] = Body(PydanticUndefined), translations: Translations = Depends(translations_dependency))
Применяет проверенные IP-настройки к указанному сетевому профилю.
Обновляет настройки соединения через NetworkManager, отключает и
переподключает устройство к сети.
* **Parameters:**
* **data** (*Dict* *[**str* *,* *Any* *]*) – Словарь с данными конфигурации, включая
“connection_id” и “ipv4_updates” с обновлениями IP-настроек.
* **translations** – Объект переводов для текущего языка.
* **Returns:**
Словарь с ключами:
: - ”success” (bool): Успешность операции.
- ”message” (str): Сообщение об успешном применении настроек.
* **Return type:**
dict
* **Raises:**
**HTTPException** – Если подключение не найдено (status_code=404) или
произошла внутренняя ошибка (status_code=500).
### *async* api.v1.ip.check_ip_config(data: Dict[str, Any] = Body(PydanticUndefined), translations: Translations = Depends(translations_dependency))
Проверяет доступность IP-адреса перед его применением.
Выполняет ARP-сканирование для проверки, занят ли указанный IP-адрес,
и возвращает результат проверки.
* **Parameters:**
* **data** (*Dict* *[**str* *,* *Any* *]*) – Словарь с данными конфигурации, включая
“ipv4_updates” с полем “ipv4.address-data” для нового IP-адреса.
* **translations** – Объект переводов для текущего языка.
* **Returns:**
Словарь с ключами:
: - ”available” (bool): Доступен ли IP-адрес.
- ”message” (str): Сообщение о результате проверки.
* **Return type:**
Dict[str, Any]
* **Raises:**
**HTTPException** – Если произошла внутренняя ошибка (status_code=500).
### *async* api.v1.ip.save_ip_config(data: Dict[str, Any] = Body(PydanticUndefined), translations: Translations = Depends(translations_dependency))
Применяет проверенные IP-настройки для отката сетевого профиля.
Используется для сохранения и отката настроек сетевого профиля к предыдущему
состоянию через NetworkManager.
* **Parameters:**
* **data** (*Dict* *[**str* *,* *Any* *]*) – Словарь с данными конфигурации, включая
“connection_id” и “ipv4_updates” с обновлениями IP-настроек.
* **translations** – Объект переводов для текущего языка.
* **Returns:**
Словарь с ключами:
: - ”success” (bool): Успешность операции.
- ”message” (str): Сообщение об успешном применении настроек.
* **Return type:**
dict
* **Raises:**
**HTTPException** – Если подключение не найдено (status_code=404) или
произошла внутренняя ошибка (status_code=500).

View file

@ -0,0 +1,93 @@
# api.v1.network
### *class* api.v1.network.ContainerPositionManager
Bases: `object`
Класс для управления позициями и состоянием контейнеров.
Хранит и обновляет координаты (x, y) и состояние (isOpen) для контейнеров
активации и деактивации.
#### get_position_and_state(container_name: str, translations: Translations = Depends(translations_dependency)) → Tuple[int, int, bool]
Получает текущие координаты и состояние указанного контейнера.
* **Parameters:**
* **container_name** (*str*) – Имя контейнера (“activation” или “deactivation”).
* **translations** – Объект переводов для текущего языка.
* **Returns:**
Кортеж с координатами (x, y) и состоянием (isOpen).
* **Return type:**
Tuple[int, int, bool]
* **Raises:**
**ValueError** – Если указан неверный идентификатор контейнера.
#### update_position(container_id: int, x: int, y: int, isOpen: bool) → None
Обновляет позицию и состояние контейнера по его идентификатору.
* **Parameters:**
* **container_id** (*int*) – Идентификатор контейнера (1 для “activation”, 2 для “deactivation”).
* **x** (*int*) – Новая координата X.
* **y** (*int*) – Новая координата Y.
* **isOpen** (*bool*) – Новое состояние контейнера (открыт/закрыт).
* **Raises:**
**ValueError** – Если container_id не соответствует ни одному контейнеру.
### *async* api.v1.network.get_hostname(translations: Translations = Depends(translations_dependency))
Возвращает имя хоста системы.
Выполняет запрос к сервису для получения имени хоста.
* **Parameters:**
**translations** – Объект переводов для текущего языка.
* **Returns:**
Словарь с ключом “hostname” и значением имени хоста.
* **Return type:**
dict
* **Raises:**
**HTTPException** – Если произошла ошибка при получении имени хоста (status_code=500).
### *async* api.v1.network.get_network_data(translations: Translations = Depends(translations_dependency)) → Dict[str, Dict]
Возвращает текущие сетевые данные в виде словаря.
Получает данные о сетевых интерфейсах, разделяет их на активные и неактивные,
и возвращает их в формате Activation и Deactivation с учётом позиций и состояний
контейнеров.
* **Parameters:**
**translations** – Объект переводов для текущего языка.
* **Returns:**
Словарь с ключами “activation” и “deactivation”, содержащими
: данные о соответствующих контейнерах.
* **Return type:**
Dict[str, Dict]
* **Raises:**
**HTTPException** – Если произошла ошибка при получении данных (status_code=500).
### *async* api.v1.network.update_container_position(data: Dict[str, int | bool] = Body(PydanticUndefined), translations: Translations = Depends(translations_dependency))
Обновляет позицию и состояние контейнера.
Принимает данные о новом положении и состоянии контейнера и обновляет их
в менеджере позиций.
* **Parameters:**
* **data** (*Dict* *[**str* *,* *Union* *[**int* *,* *bool* *]* *]*) – Словарь с ключами:
- “container_id” (int): Идентификатор контейнера (1 или 2).
- “container_x” (int): Новая координата X.
- “container_y” (int): Новая координата Y.
- “isOpen” (bool): Новое состояние контейнера (открыт/закрыт).
* **translations** – Объект переводов для текущего языка.
* **Returns:**
Словарь с ключами:
: - ”success” (bool): Успешность операции.
- ”message” (str): Сообщение об успешном обновлении.
* **Return type:**
dict
* **Raises:**
**HTTPException** – Если отсутствуют обязательные поля (status_code=400) или
типы данных неверны.

View file

@ -0,0 +1,104 @@
# api.v1.settings
### api.v1.settings.clear_all_data(translations: Translations = Depends(translations_dependency))
Очищает данные узлов подсети и точек доступа Wi-Fi в обоих файлах.
Удаляет все записи из devices.json и wifi.json.
* **Parameters:**
**translations** – Объект переводов для текущего языка.
* **Returns:**
Словарь с сообщением об успешной очистке.
* **Return type:**
dict
* **Raises:**
**HTTPException** – Если произошла ошибка очистки (status_code=500).
### api.v1.settings.clear_subnet(subnet: str | None = None, translations: Translations = Depends(translations_dependency))
Очищает данные узлов подсети, сохранённые в devices.json.
Удаляет все записи об узлах подсети, оставляя файл пустым.
* **Parameters:**
* **subnet** (*Optional* *[**str* *]*) – Подсеть в формате CIDR (например, “10.1.1.0/24”).
Если None, очищает все подсети.
* **translations** – Объект переводов для текущего языка.
* **Returns:**
Словарь с сообщением об успешной очистке.
* **Return type:**
dict
* **Raises:**
**HTTPException** – Если произошла ошибка очистки (status_code=500).
### api.v1.settings.clear_wifi(translations: Translations = Depends(translations_dependency))
Очищает данные точек доступа Wi-Fi, сохранённые в wifi.json.
Удаляет все записи о точках доступа, оставляя файл пустым.
* **Parameters:**
**translations** – Объект переводов для текущего языка.
* **Returns:**
Словарь с сообщением об успешной очистке.
* **Return type:**
dict
* **Raises:**
**HTTPException** – Если произошла ошибка очистки (status_code=500).
### *async* api.v1.settings.export_devices(request: SubnetScanRequest = Body(PydanticUndefined), translations: Translations = Depends(translations_dependency))
Экспортирует файл с данными устройств в формате JSON для указанной подсети.
* **Parameters:**
* **request** (*SubnetScanRequest*) – Объект с полем subnet в формате CIDR.
* **translations** – Объект переводов для текущего языка.
* **Returns:**
Файл <subnet>.json для скачивания.
* **Return type:**
FileResponse
* **Raises:**
**HTTPException** – Если файл не найден (status_code=404).
### *async* api.v1.settings.export_wifi(translations: Translations = Depends(translations_dependency))
Экспортирует файл с данными устройств в формате JSON.
* **Parameters:**
**translations** – Объект переводов для текущего языка.
* **Returns:**
Файл wifi.json для скачивания.
* **Return type:**
FileResponse
* **Raises:**
**HTTPException** – Если файл не найден (status_code=404).
### *async* api.v1.settings.get_system_language(request: Request, translations: Translations = Depends(translations_dependency))
Выводит текущий язык, установленный в системе на основе locale.
Выполняет команду ‘locale’ в системе и извлекает параметры LANG
* **Parameters:**
* **request** (*Request*) – Объект запроса для доступа к параметрам.
* **translations** – Объект переводов текущего языка.
* **Returns:**
Словарь с текущим языком системы.
* **Return type:**
dict
* **Raises:**
**HTTPException** – Если не удалось извлечь системный язык (status_code=500).
### api.v1.settings.set_language(locale: str, response: Response, translations: Translations = Depends(translations_dependency))
Устанавливает куку locale для смены языка пользователя.
* **Parameters:**
* **locale** (*str*) – Используемый язык.
* **response** (*Response*) – Запрос.
* **translations** – Объект переводов текущего языка.
* **Returns:**
Сообщение об успешной установке языка.
* **Return type:**
dict

View file

@ -0,0 +1,193 @@
# api.v1.subnet
### api.v1.subnet.add_note(mac: str, request: NoteRequest, subnet_service: SubnetService = Depends(get_subnet_service), translations: Translations = Depends(translations_dependency))
Добавляет заметку для устройства по MAC-адресу.
Привязывает заметку к устройству, идентифицируемому по MAC-адресу.
* **Parameters:**
* **mac** (*str*) – MAC-адрес устройства.
* **request** (*NoteRequest*) – Объект с полем “note” для текста заметки.
* **subnet_service** – Сервис сканирования подсети.
* **translations** – Объект переводов для текущего языка.
* **Returns:**
Словарь с сообщением об успешном добавлении заметки.
* **Return type:**
dict
* **Raises:**
**HTTPException** – Если устройство не найдено (status_code=404), заметка уже
существует (status_code=400), или произошла внутренняя ошибка (status_code=500).
### api.v1.subnet.add_wifi_note(ssid: str, request: NoteRequest, translations: Translations = Depends(translations_dependency))
Добавляет заметку для сети Wi-Fi по SSID.
Привязывает заметку к Wi-Fi сети, идентифицируемой по SSID.
* **Parameters:**
* **ssid** (*str*) – Идентификатор Wi-Fi сети.
* **request** (*NoteRequest*) – Объект с полем “note” для текста заметки.
* **translations** – Объект переводов для текущего языка.
* **Returns:**
Словарь с сообщением об успешном добавлении заметки.
* **Return type:**
dict
* **Raises:**
**HTTPException** – Если сеть не найдена (status_code=404), заметка уже
существует (status_code=400), или произошла внутренняя ошибка (status_code=500).
### api.v1.subnet.connect_to_wifi(request: WifiConnectRequest, translations: Translations = Depends(translations_dependency))
Подключается к Wi-Fi сети по SSID и паролю.
Выполняет подключение к указанной Wi-Fi сети с использованием предоставленных
учетных данных.
* **Parameters:**
* **request** (*WifiConnectRequest*) – Объект с полями “ssid” и “password”.
* **translations** – Объект переводов для текущего языка.
* **Returns:**
Словарь с сообщением об успешном подключении.
* **Return type:**
dict
* **Raises:**
**HTTPException** – Если подключение не удалось (status_code=400).
### api.v1.subnet.delete_note(mac: str, subnet_service: SubnetService = Depends(get_subnet_service), translations: Translations = Depends(translations_dependency))
Удаляет заметку для устройства по MAC-адресу.
Удаляет привязанную заметку для указанного устройства.
* **Parameters:**
* **mac** (*str*) – MAC-адрес устройства.
* **subnet_service** – Сервис сканирования подсети.
* **translations** – Объект переводов для текущего языка.
* **Returns:**
Словарь с сообщением об успешном удалении заметки.
* **Return type:**
dict
* **Raises:**
**HTTPException** – Если устройство не найдено (status_code=404), заметка не
существует (status_code=400), или произошла внутренняя ошибка (status_code=500).
### api.v1.subnet.delete_wifi_note(ssid: str, translations: Translations = Depends(translations_dependency))
Удаляет заметку для сети Wi-Fi по SSID.
Удаляет привязанную заметку для указанной Wi-Fi сети.
* **Parameters:**
* **ssid** (*str*) – Идентификатор Wi-Fi сети.
* **translations** – Объект переводов для текущего языка.
* **Returns:**
Словарь с сообщением об успешном удалении заметки.
* **Return type:**
dict
* **Raises:**
**HTTPException** – Если сеть не найдена (status_code=404), заметка не
существует (status_code=400), или произошла внутренняя ошибка (status_code=500).
### api.v1.subnet.disconnect_from_wifi(request: WifiDisconnectRequest, translations: Translations = Depends(translations_dependency))
Отключается от Wi-Fi сети по указанному SSID.
Выполняет отключение от указанной Wi-Fi сети.
* **Parameters:**
* **request** (*WifiDisconnectRequest*) – Объект с полем “ssid”.
* **translations** – Объект переводов для текущего языка.
* **Returns:**
Словарь с сообщением об успешном отключении.
* **Return type:**
dict
* **Raises:**
**HTTPException** – Если отключение не удалось (status_code=400).
### api.v1.subnet.get_wifi_status(translations: Translations = Depends(translations_dependency))
Проверяет статус текущего подключения к Wi-Fi.
Возвращает информацию о текущем состоянии подключения и SSID, если подключение активно.
* **Parameters:**
**translations** – Объект переводов для текущего языка.
* **Returns:**
Словарь с ключами:
: - ”status” (str): Состояние (“connected” или другое).
- ”ssid” (str, optional): SSID текущей сети, если подключено.
* **Return type:**
dict
* **Raises:**
**HTTPException** – Если проверка статуса не удалась (status_code=400).
### api.v1.subnet.scan_subnet(request: SubnetScanRequest = Body(PydanticUndefined), subnet_service: SubnetService = Depends(get_subnet_service), translations: Translations = Depends(translations_dependency))
Сканирует локальную подсеть и возвращает данные об устройствах.
Выполняет сканирование указанной подсети для обнаружения активных устройств.
* **Parameters:**
* **request** (*SubnetScanRequest*) – Объект с полем subnet.
* **subnet_service** – Сервис сканирования подсети.
* **translations** – Объект переводов для текущего языка.
* **Returns:**
Объект с результатами сканирования (устройства и их данные).
* **Return type:**
SubnetScanResult
* **Raises:**
**HTTPException** – Если произошла ошибка сканирования (status_code=500).
### api.v1.subnet.scan_wifi(timeout: int = 30, translations: Translations = Depends(translations_dependency))
Сканирует Wi-Fi точки доступа и возвращает данные о них.
Выполняет сканирование доступных Wi-Fi сетей с указанным таймаутом.
* **Parameters:**
* **timeout** (*int* *,* *optional*) – Таймаут сканирования в секундах. По умолчанию 30.
* **translations** – Объект переводов для текущего языка.
* **Returns:**
Объект с результатами сканирования (список Wi-Fi сетей).
* **Return type:**
WifiScanResult
* **Raises:**
**HTTPException** – Если произошла ошибка сканирования Wi-Fi (status_code=500).
### api.v1.subnet.update_note(mac: str, request: NoteRequest, subnet_service: SubnetService = Depends(get_subnet_service), translations: Translations = Depends(translations_dependency))
Обновляет заметку для устройства по MAC-адресу.
Изменяет существующую заметку, привязанную к устройству.
* **Parameters:**
* **mac** (*str*) – MAC-адрес устройства.
* **request** (*NoteRequest*) – Объект с полем “note” для нового текста заметки.
* **subnet_service** – Сервис сканирования подсети.
* **translations** – Объект переводов для текущего языка.
* **Returns:**
Словарь с сообщением об успешном обновлении заметки.
* **Return type:**
dict
* **Raises:**
**HTTPException** – Если устройство не найдено (status_code=404), заметка не
существует (status_code=400), или произошла внутренняя ошибка (status_code=500).
### api.v1.subnet.update_wifi_note(ssid: str, request: NoteRequest, translations: Translations = Depends(translations_dependency))
Обновляет заметку для сети Wi-Fi по SSID.
Изменяет существующую заметку, привязанную к Wi-Fi сети.
* **Parameters:**
* **ssid** (*str*) – Идентификатор Wi-Fi сети.
* **request** (*NoteRequest*) – Объект с полем “note” для нового текста заметки.
* **translations** – Объект переводов для текущего языка.
* **Returns:**
Словарь с сообщением об успешном обновлении заметки.
* **Return type:**
dict
* **Raises:**
**HTTPException** – Если сеть не найдена (status_code=404), заметка не
существует (status_code=400), или произошла внутренняя ошибка (status_code=500).

View file

@ -0,0 +1,104 @@
# api.v1.ufw
### *class* api.v1.ufw.RuleNumbers(, numbers: List[int])
Bases: `BaseModel`
#### model_config *: ClassVar[ConfigDict]* *= {}*
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
#### numbers *: List[int]*
### *async* api.v1.ufw.add_ufw_in_rules(rules: List[UFWRule])
Добавляет входящие (in) правила UFW.
* **Parameters:**
**rules** (*List* *[**UFWRule* *]*) – Список правил, определяющих направления,
порты/диапазоны/протоколы и действия (allow/deny/reject).
* **Returns:**
Итог выполнения с количеством успешно добавленных правил и деталями
по каждому правилу.
* **Return type:**
dict
* **Raises:**
* **HTTPException** – Если UFW отключен (status_code=400) или при внутренних
* **ошибках** **(****status_code=500****)****.** –
### *async* api.v1.ufw.add_ufw_out_rules(rules: List[UFWRule])
Добавляет исходящие (out) правила UFW.
* **Parameters:**
**rules** (*List* *[**UFWRule* *]*) – Список правил исходящего трафика для добавления.
* **Returns:**
Объект статуса с сообщением об успешном добавлении.
* **Return type:**
dict
* **Raises:**
* **HTTPException** – Если UFW отключен (status_code=400) или при внутренних
* **ошибках** **(****status_code=500****)****.** –
### *async* api.v1.ufw.delete_ufw_rules(rule_numbers: RuleNumbers)
Удаляет правила UFW по их номерам.
* **Parameters:**
**rule_numbers** (*RuleNumbers*) – Номера правил, подлежащих удалению (как в
выводе ufw status numbered).
* **Returns:**
Информация об общем количестве удаляемых правил, числе успешных и
возможной ошибке.
* **Return type:**
dict
* **Raises:**
**HTTPException** – При ошибках удаления (status_code=500).
### *async* api.v1.ufw.disable_ufw()
Выключает UFW.
* **Returns:**
Словарь с ключами status и message при успешном выполнении.
* **Return type:**
dict
* **Raises:**
**HTTPException** – Если выключение завершилось неуспешно (status_code=500).
### *async* api.v1.ufw.enable_ufw()
Включает UFW.
* **Returns:**
Словарь с ключами status и message при успешном выполнении.
* **Return type:**
dict
* **Raises:**
**HTTPException** – Если включение завершилось неуспешно (status_code=500).
### *async* api.v1.ufw.get_ufw_rules()
Возвращает все правила UFW.
Осуществляет обращение к сервису UFWService для чтения текущего списка
правил брандмауэра и возвращает результат в сериализованном виде для клиента.
* **Returns:**
Структура с коллекцией правил и сопутствующей
информацией о состоянии.
* **Return type:**
UFWRulesResponse
* **Raises:**
**HTTPException** – В случае ошибок взаимодействия с UFW (status_code=500).
### *async* api.v1.ufw.get_ufw_status()
Возвращает текущий статус UFW.
* **Returns:**
Объект со сведениями о включенности UFW и деталями статуса.
* **Return type:**
UFWStatus
* **Raises:**
**HTTPException** – Если не удалось получить статус (status_code=500).

View file

@ -0,0 +1,78 @@
# api.v1.websocket
### *class* api.v1.websocket.WebSocketManager
Bases: `object`
Класс для управления подключениями к WebSocket-серверу.
Обрабатывает подключение, отключение и трансляцию сообщений для клиентов,
подключённых через WebSocket.
#### *async* broadcast(message: dict)
Транслирует сообщения всем подключённым клиентам.
Отправляет JSON-данные всем активным соединениям, обрабатывая
отключения клиентов.
* **Parameters:**
**message** (*dict*) – Сообщение для трансляции в формате JSON.
* **Raises:**
* **WebSocketDisconnect** – Если клиент неожиданно отключился.
* **Exception** – Если произошла другая ошибка при отправке.
#### *async* connect(websocket: WebSocket)
Подключает клиента к WebSocket-серверу.
Принимает подключение и добавляет WebSocket в список активных соединений.
* **Parameters:**
**websocket** (*WebSocket*) – Объект WebSocket для подключения.
* **Raises:**
**Exception** – Если произошла ошибка при принятии подключения.
#### disconnect(websocket: WebSocket)
Отключает клиента от WebSocket-серверу.
Удаляет WebSocket из списка активных соединений.
* **Parameters:**
**websocket** (*WebSocket*) – Объект WebSocket для отключения.
### *async* api.v1.websocket.broadcast_data(translations: Translations = Depends(translations_dependency))
Таск для периодической трансляции сетевых данных.
Выполняет сканирование сети и отправляет данные всем подключённым клиентам
с интервалом в 2 секунды.
* **Parameters:**
**translations** – Объект переводов для текущего языка.
* **Raises:**
**Exception** – Если произошла ошибка при получении данных или трансляции.
### *async* api.v1.websocket.startup_event()
Запуск таска для трансляции сетевых данных при старте приложения.
Создаёт асинхронную задачу для периодической трансляции данных.
* **Raises:**
**Exception** – Если произошла ошибка при запуске таска.
### *async* api.v1.websocket.websocket_endpoint(websocket: WebSocket, translations: Translations = Depends(translations_dependency))
Обработчик WebSocket-соединения.
Управляет соединением клиента, принимает данные для обновления позиций
контейнеров и транслирует сетевые данные.
* **Parameters:**
* **websocket** (*WebSocket*) – Объект WebSocket для обработки соединения.
* **translations** – Объект переводов для текущего языка.
* **Raises:**
* **WebSocketDisconnect** – Если клиент отключился.
* **Exception** – Если произошла ошибка при обработке данных.

View file

@ -0,0 +1,8 @@
# Модели
* [models.auth](models/auth.md)
* [models.network](models/network.md)
* [models.request](models/request.md)
* [models.subnet](models/subnet.md)
* [models.ufw](models/ufw.md)
* [models.wifi](models/wifi.md)

View file

@ -0,0 +1,85 @@
# models.auth
### *class* models.auth.Token(, access_token: str, token_type: str, session_id: str | None = None, user: UserResponse | None = None)
Bases: `BaseModel`
Токен пользователя
Атрибуты:
: access_token (str): Токен пользователя (захэширован)
token_type (str): Тип токена
session_id (Optional[str]): Идентификатор сессии
user (Optional[UserResponse]): Пользователь на основе проверки наличия пользователя
#### access_token *: str*
#### model_config *: ClassVar[ConfigDict]* *= {}*
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
#### session_id *: str | None*
#### token_type *: str*
#### user *: UserResponse | None*
### *class* models.auth.UserCreate(, username: str, password: str, is_admin: bool = False)
Bases: `BaseModel`
Модель созданного пользователя
Атрибуты:
: username (str): Имя пользователя
password (str): Пароль пользователя
is_admin (bool): Административный доступ
#### is_admin *: bool*
#### model_config *: ClassVar[ConfigDict]* *= {}*
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
#### password *: str*
#### username *: str*
### *class* models.auth.UserLogin(, username: str, password: str)
Bases: `BaseModel`
Модель авторизации пользователя
Атрибуты:
: username (str): Имя пользователя
password (str): Пароль пользователя
#### model_config *: ClassVar[ConfigDict]* *= {}*
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
#### password *: str*
#### username *: str*
### *class* models.auth.UserResponse(, id: int, username: str, is_admin: bool)
Bases: `BaseModel`
Модель проверки наличия пользователя
Атрибуты:
: id (int): Идентификатор
username (str): Имя пользователя
is_admin (bool): Административный доступ
#### id *: int*
#### is_admin *: bool*
#### model_config *: ClassVar[ConfigDict]* *= {}*
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
#### username *: str*

View file

@ -0,0 +1,238 @@
# models.network
### *class* models.network.Activation(, id: int, interfaces: List[NetworkInterface | WiFiDevice], container_x: int, container_y: int, isOpen: bool = True)
Bases: `BaseModel`
Модель активированных интерфейсов
Атрибуты:
: id (int): Идентификатор ноды активированных интерфейсов
interfaces (List[Union[NetworkInterface, WiFiDevice]]): Активированные интерфейсы
container_x (int): Положение по X на холсте
container_y (int): Положение по Y на холсте
isOpen (bool): Флаг скрытия ноды на холсте
#### container_x *: int*
#### container_y *: int*
#### id *: int*
#### interfaces *: List[NetworkInterface | WiFiDevice]*
#### isOpen *: bool*
#### model_config *: ClassVar[ConfigDict]* *= {}*
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
### *class* models.network.Deactivation(, id: int, interfaces: List[NetworkInterface | WiFiDevice], container_x: int, container_y: int, isOpen: bool = True)
Bases: `BaseModel`
Модель отключенных интерфейсов
Атрибуты:
: id (int): Идентификатор ноды отключенных интерфейсов
interfaces (List[Union[NetworkInterface, WiFiDevice]]): Отключенные интерфейсы
container_x (int): Положение по X на холсте
container_y (int): Положение по Y на холсте
isOpen (bool): Флаг скрытия ноды на холсте
#### container_x *: int*
#### container_y *: int*
#### id *: int*
#### interfaces *: List[NetworkInterface | WiFiDevice]*
#### isOpen *: bool*
#### model_config *: ClassVar[ConfigDict]* *= {}*
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
### *class* models.network.IPConfig(, configurations: List[IndividualIPConfig])
Bases: `BaseModel`
Модель конфигурации IP (IPv4/IPv6)
Атрибуты:
: configurations (List[IndividualIPConfig]): Список индивидуальных IP-конфигураций
#### configurations *: List[IndividualIPConfig]*
#### model_config *: ClassVar[ConfigDict]* *= {}*
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
### *class* models.network.IPv4Route(, destination: str, prefix: int, next_hop: str, metric: int)
Bases: `BaseModel`
Модель маршрута IPv4
Атрибуты:
: destination (str): IP-адрес назначения
prefix (int): Префикс подсети в формате CIDR
next_hop (str): Адрес следующего узла (маршрутизатор)
metric (int): Метрика маршрута
#### destination *: str*
#### metric *: int*
#### model_config *: ClassVar[ConfigDict]* *= {}*
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
#### next_hop *: str*
#### prefix *: int*
### *class* models.network.IPv6Route(, destination: str, prefix: int, next_hop: str, metric: int)
Bases: `BaseModel`
Модель маршрута IPv6
Атрибуты:
: destination (str): IP-адрес назначения
prefix (int): Префикс подсети (CIDR)
next_hop (str): Адрес следующего узла (маршрутизатор)
metric (int): Метрика маршрута
#### destination *: str*
#### metric *: int*
#### model_config *: ClassVar[ConfigDict]* *= {}*
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
#### next_hop *: str*
#### prefix *: int*
### *class* models.network.IndividualIPConfig(, address: str, routes: List[IPv4Route | IPv6Route], method: str | None, gateway: str, dns: List[str])
Bases: `BaseModel`
Модель индивидуальной конфигурации IP-адреса
Атрибуты:
: address (str): IP-адрес интерфейса
routes (List[Union[IPv4Route, IPv6Route]]): Список маршрутов (IPv4/IPv6)
method (Optional[str]): Метод назначения IP
gateway (str): Основной шлюз по умолчанию
dns (List[str]): Список DNS-серверов
#### address *: str*
#### dns *: List[str]*
#### gateway *: str*
#### method *: str | None*
#### model_config *: ClassVar[ConfigDict]* *= {}*
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
#### routes *: List[IPv4Route | IPv6Route]*
### *class* models.network.NetworkInterface(, name: str, type: str, mac_address: str, device_state: str, active_connection: str, device_mtu: str, ipv4: IPConfig, ipv6: IPConfig, container_x: int = 0, container_y: int = 0)
Bases: `BaseModel`
Модель базового сетевого интерфейса
Атрибуты:
: name (str): Название интерфейса
type (str): Тип интерфейса
mac_address (str): MAC-адрес устройства
device_state (str): Состояние устройства
active_connection (str): Название активного соединения
device_mtu (str): MTU устройства
ipv4 (IPConfig): Конфигурация IPv4
ipv6 (IPConfig): Конфигурация IPv6
container_x (int): Положение по X на холсте
container_y (int): Положение по Y на холсте
#### active_connection *: str*
#### container_x *: int*
#### container_y *: int*
#### device_mtu *: str*
#### device_state *: str*
#### ipv4 *: IPConfig*
#### ipv6 *: IPConfig*
#### mac_address *: str*
#### model_config *: ClassVar[ConfigDict]* *= {}*
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
#### name *: str*
#### type *: str*
### *class* models.network.NetworkInterfacesContainer(, interfaces: List[NetworkInterface | WiFiDevice], container_x: int, container_y: int)
Bases: `BaseModel`
Контейнер для группы сетевых интерфейсов с координатами
Атрибуты:
: interfaces (List[Union[NetworkInterface, WiFiDevice]]): Список интерфейсов
container_x (int): Положение по оси X
container_y (int): Положение по оси Y
#### container_x *: int*
#### container_y *: int*
#### interfaces *: List[NetworkInterface | WiFiDevice]*
#### model_config *: ClassVar[ConfigDict]* *= {}*
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
### *class* models.network.WiFiDevice(, name: str, type: str, mac_address: str, device_state: str, active_connection: str, device_mtu: str, ipv4: IPConfig, ipv6: IPConfig, container_x: int = 0, container_y: int = 0, ssid: str | None = None, bssid: str | None = None, bitrate: int | None = None, strength: int | None = None, frequency: float | None = None, mode: str | int = None)
Bases: `NetworkInterface`
Модель Wi-Fi устройства (наследуется от NetworkInterface)
Атрибуты:
: ssid (Optional[str]): Название Wi-Fi сети
bssid (Optional[str]): MAC-адрес точки доступа
bitrate (Optional[int]): Скорость соединения
strength (Optional[int]): Уровень сигнала
frequency (Optional[float]): Частота
mode (Union[str, int]): Режим работы
#### bitrate *: int | None*
#### bssid *: str | None*
#### frequency *: float | None*
#### mode *: str | int*
#### model_config *: ClassVar[ConfigDict]* *= {}*
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
#### ssid *: str | None*
#### strength *: int | None*

View file

@ -0,0 +1,49 @@
# models.request
### *class* models.request.NoteRequest(, note: str)
Bases: `BaseModel`
Модель добавления заметки к просканированному устройству
Атрибуты:
: note (str): Заметка устройства
#### model_config *: ClassVar[ConfigDict]* *= {}*
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
#### note *: str*
### *class* models.request.WifiConnectRequest(, ssid: str, password: str)
Bases: `BaseModel`
Модель для подключения к точке доступа Wi-Fi
Атрибуты:
: ssid (str): Название точки доступа Wi-Fi
password (str): Пароль точки доступа Wi-Fi
#### model_config *: ClassVar[ConfigDict]* *= {}*
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
#### password *: str*
#### ssid *: str*
### *class* models.request.WifiDisconnectRequest(, ssid: str)
Bases: `BaseModel`
Модель для отключения от точки доступа Wi-Fi
Атрибуты:
: ssid (str): Название точки доступа Wi-Fi
#### model_config *: ClassVar[ConfigDict]* *= {}*
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
#### ssid *: str*

View file

@ -0,0 +1,70 @@
# models.subnet
### *class* models.subnet.Device(, ip: str, mac: str | None = None, hostname: str | None = None, vendor: str | None = None, open_ports: List[str] = [], status: str, last_seen: str | None = None, note: str | None = None)
Bases: `BaseModel`
Сканируемое устройство в подсети
Атрибуты:
: ip (str): IP-адрес устройства
mac (Optional[str]): MAC-адрес устройства
hostname (Optional[str]): Имя хоста
vendor (Optional[str]): Название производителя устройства (По MAC-адресу)
open_ports (List[str]): Открытые порты устройства
status (str): Статус устройства (онлайн/оффлайн)
last_seen (Optional[str]): Последняя активность устройства
note (Optional[str]): Заметка устройства
#### hostname *: str | None*
#### ip *: str*
#### last_seen *: str | None*
#### mac *: str | None*
#### model_config *: ClassVar[ConfigDict]* *= {}*
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
#### note *: str | None*
#### open_ports *: List[str]*
#### status *: str*
#### vendor *: str | None*
### *class* models.subnet.SubnetScanRequest(, subnet: str | None = None)
Bases: `BaseModel`
Параметры для сканирования подсети
Атрибуты:
: subnet (Optional[str]): Подсеть для сканирования (например 192.168.1.0/24), опционально
#### model_config *: ClassVar[ConfigDict]* *= {}*
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
#### subnet *: str | None*
### *class* models.subnet.SubnetScanResult(, devices: List[Device] = [], error: str | None = None)
Bases: `BaseModel`
Результат сканирования устройств в подсети
Атрибуты:
: devices (List[Device]): Список просканированных устройств
error (Optional[str]): Сообщение об ошибке, если сканирование не удалось
#### devices *: List[Device]*
#### error *: str | None*
#### model_config *: ClassVar[ConfigDict]* *= {}*
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

View file

@ -0,0 +1,195 @@
# models.ufw
### *class* models.ufw.Action(\*values)
Bases: `str`, `Enum`
Enum для действий UFW.
#### ALLOW
Разрешить трафик
#### DENY
Запретить трафик без уведомления
#### REJECT
Запретить трафик с уведомлением отправителю
#### ALLOW *= 'allow'*
#### DENY *= 'deny'*
#### REJECT *= 'reject'*
### *class* models.ufw.Direction(\*values)
Bases: `str`, `Enum`
Enum для направления трафика UFW.
#### IN
Входящий трафик
#### OUT
Исходящий трафик
#### IN *= 'in'*
#### OUT *= 'out'*
### *class* models.ufw.Protocol(\*values)
Bases: `str`, `Enum`
Enum для сетевых протоколов UFW.
#### BOTH *= 'both'*
#### TCP *= 'tcp'*
#### UDP *= 'udp'*
#### *property* protocols *: List[str]*
Возвращает список протоколов для использования в команде UFW.
### *class* models.ufw.UFWRule(, action: Action, direction: Direction, from_ip: str, to_ip: str, port: int | str, protocol: Protocol, comment: str | None = None)
Bases: `BaseModel`
Модель правила UFW
#### action *: Action*
#### comment *: str | None*
#### direction *: Direction*
#### from_ip *: str*
#### *classmethod* from_ufw_output(line: str) → UFWRule
Создает экземпляр UFWRule из строки вывода команды ‘ufw status numbered’.
* **Parameters:**
**line** – Строка вывода UFW (например, “[1] 80/tcp ALLOW IN 192.168.1.0/24 # Web Server”)
* **Returns:**
Новый экземпляр правила
* **Return type:**
UFWRule
#### model_config *: ClassVar[ConfigDict]* *= {}*
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
#### port *: int | str*
#### protocol *: Protocol*
#### to_ip *: str*
#### to_ufw_command() → str
Преобразует правило в команду UFW.
#### *classmethod* validate_action(v)
Приводит значение action к нижнему регистру перед валидацией
#### *classmethod* validate_ip(v)
Проверяет корректность IP адреса
#### *classmethod* validate_ip_version_compatibility(v, values)
Проверяет совместимость версий IP адресов
#### *classmethod* validate_port(v)
Проверяет корректность порта или диапазона портов.
* **Parameters:**
**v** – Порт (число) или диапазон портов (строка вида “3000:3999”)
* **Returns:**
Валидированное значение порта
* **Return type:**
Union[int, str]
* **Raises:**
**ValueError** – Если порт или диапазон портов некорректен
#### *classmethod* validate_protocol(v)
Приводит значение protocol к нижнему регистру перед валидацией
### *class* models.ufw.UFWRulesResponse(\*, enabled: bool, rules: ~typing.List[~models.ufw.UFWRule] = <factory>)
Bases: `BaseModel`
Модель для представления списка правил UFW.
#### enabled
Включен ли UFW
* **Type:**
bool
#### rules
Список правил UFW
* **Type:**
List[models.ufw.UFWRule]
#### total_rules
Общее количество правил
#### enabled *: bool*
#### model_config *: ClassVar[ConfigDict]* *= {}*
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
#### rules *: List[UFWRule]*
#### *property* total_rules *: int*
Возвращает общее количество правил.
### *class* models.ufw.UFWStatus(, enabled: bool, message: str)
Bases: `BaseModel`
Модель для представления статуса UFW.
#### enabled
Включен ли UFW
* **Type:**
bool
#### message
Сообщение о статусе
* **Type:**
str
#### last_checked
Время последней проверки статуса
#### enabled *: bool*
#### message *: str*
#### model_config *: ClassVar[ConfigDict]* *= {}*
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

View file

@ -0,0 +1,55 @@
# models.wifi
### *class* models.wifi.WifiAccessPoint(, ssid: str | None = None, bssid: str, channel: int | None = None, signal: int | None = None, encryption: str | None = None, frequency: str | None = None, vendor: str | None = None, hidden: bool = False, note: str | None = None)
Bases: `BaseModel`
Модель точки доступа Wi-Fi
Атрибуты:
: ssid (Optional[str]): Название точки доступа. Может быть скрытым
bssid (str): Уникальный идентификатор точки доступа (по типу MAC-адреса)
channel (Optional[int]): Канал, на котором работает точка доступа
signal (Optional[int]): Уровень сигнала (dBm)
encryption (Optional[str]): Тип шифрования (WPA2, WPA3, открытая и т.д.)
frequency (Optional[str]): Частота вещания (2.4GHz/5GHz)
vendor (Optional[str]): Производитель точки доступа (определяется по MAC-адресу)
hidden (bool): Флаг скрытия названия точки доступа (ssid)
note (Optional[str]): Заметка для точки доступа
#### bssid *: str*
#### channel *: int | None*
#### encryption *: str | None*
#### frequency *: str | None*
#### hidden *: bool*
#### model_config *: ClassVar[ConfigDict]* *= {}*
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
#### note *: str | None*
#### signal *: int | None*
#### ssid *: str | None*
#### vendor *: str | None*
### *class* models.wifi.WifiScanResult(, access_points: List[WifiAccessPoint])
Bases: `BaseModel`
Результат сканирования Wi-Fi
Атрибуты:
: access_points (List[WifiAccessPoint]): Список найденных Wi-Fi точек доступа
#### access_points *: List[WifiAccessPoint]*
#### model_config *: ClassVar[ConfigDict]* *= {}*
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

View file

@ -0,0 +1,12 @@
# Сервисы
* [ARP Service](services/arp_service.md)
* [Auth Service](services/auth_service.md)
* [Connect Service](services/connect_service.md)
* [Firewalld Service](services/firewalld_service.md)
* [IP Service](services/ip_service.md)
* [Network Service](services/network_service.md)
* [Settings Service](services/settings_service.md)
* [Subnet Service](services/subnet_service.md)
* [UFW Service](services/ufw_service.md)
* [Wifi Service](services/wifi_service.md)

View file

@ -0,0 +1,55 @@
# ARP Service
Сервис низкоуровневого ARP-сканирования локальной сети.
Назначение:
- Обнаружение активных узлов в пределах сетей хоста путём широковещательных ARP‑запросов от имени выбранного интерфейса.
- Помощь сервисам более высокого уровня (например, IPService) при проверке занятости адресов перед применением конфигураций.
Особенности реализации:
- Определяет подключённые сети интерфейса через netifaces и строит CIDR для сканирования.
- Формирует ARP‑пакеты с помощью scapy (Ether/ARP) и отправляет их с таймаутом.
- Добавляет локальный адрес интерфейса в результирующий список клиентов.
Требования/ограничения:
- Для отправки ARP‑кадров могут потребоваться повышенные привилегии или capability на сырой сокет.
### *class* services.arp_service.NetworkScanner(interface=None, translations: Translations = Depends(translations_dependency))
Bases: `object`
Инициализация сетевого сканера.
Предоставляет методы для сканирования сети с использованием ARP-запросов и
вывода информации о клиентах.
#### print_clients(clients)
Выводит список адресов клиентов в формате таблицы.
* **Parameters:**
**clients** (*List* *[**dict* *]*) – Список словарей с ключами “ip” и “mac”,
представляющих клиентов.
Выводит IP-адреса и MAC-адреса в отсортированном по IP порядке.
#### scan_network(attempts=3, timeout=2)
Сканирует сеть для обнаружения активных клиентов.
* **Parameters:**
* **attempts** (*int* *,* *optional*) – Количество попыток отправки ARP-запросов.
По умолчанию 3.
* **timeout** (*int* *,* *optional*) – Таймаут ожидания ответа в секундах.
По умолчанию 2.
* **Returns:**
Список словарей с ключами “ip” и “mac”, представляющих
: обнаруженных клиентов, включая локальные IP-адреса.
* **Return type:**
List[dict]
#### NOTE
Учитывает локальные IP-адреса интерфейса и удаляет дубликаты.

View file

@ -0,0 +1,35 @@
# Auth Service
### *class* services.auth_service.AuthService(translations: Translations = Depends(translations_dependency))
Bases: `object`
Сервис для регистрации, авторизации и управления сессиями
#### create_access_token(data: dict) → str
Создаёт токен
#### get_current_user(token: str = Depends(OAuth2PasswordBearer)) → UserResponse
Получает текущего пользователя по токену
#### get_user_by_session(client_id: str) → dict
Получает пользователя и токен по client_id
#### login(user: UserLogin, client_id: str) → dict
Авторизует пользователя, создаёт сессию и возвращает токен
#### logout(client_id: str)
Выполняет выход из системы, удаляя последнюю сессию для client_id
#### register(user: UserCreate) → UserResponse
Регистрирует нового пользователя
#### verify_token(token: str) → dict | None
Проверяет токен

View file

@ -0,0 +1,71 @@
# Connect Service
Сервис управления подключениями Wi‑Fi через nmcli.
Назначение:
- Предоставляет операции подключения/отключения к точкам доступа и проверки текущего статуса, ориентируясь на системный NetworkManager.
Поведение:
- Автоматически определяет активный Wi‑Fi‑интерфейс.
- Валидирует наличие SSID в листинге перед подключением и интерпретирует частые ошибки nmcli (неверный пароль, отсутствующая сеть и т.п.).
Ограничения:
- Требуются права для управления сетевыми соединениями в системе.
- В окружениях без NetworkManager команды nmcli будут недоступны.
### *class* services.connect_service.WifiConnectionService(translations: Translations = Depends(translations_dependency))
Bases: `object`
Сервис для управления подключением к Wi-Fi сетям с использованием nmcli.
Предоставляет методы для подключения, отключения и проверки статуса Wi-Fi соединений.
#### connect(ssid: str, password: str) → Tuple[bool, str | None]
Подключается к Wi-Fi сети по SSID и паролю.
* **Parameters:**
* **ssid** (*str*) – Идентификатор сети Wi-Fi.
* **password** (*str*) – Пароль для подключения.
* **Returns:**
Кортеж (успех, сообщение об ошибке).
: - Успех: (True, None).
- Ошибка: (False, сообщение об ошибке).
* **Return type:**
Tuple[bool, Optional[str]]
* **Raises:**
* **subprocess.CalledProcessError** – Если команда nmcli завершилась с ошибкой.
* **Exception** – Если произошла неизвестная ошибка при выполнении.
#### disconnect(ssid: str) → Tuple[bool, str | None]
Отключается от Wi-Fi сети по указанному SSID.
* **Parameters:**
**ssid** (*str*) – Идентификатор сети Wi-Fi для отключения.
* **Returns:**
Кортеж (успех, сообщение об ошибке).
: - Успех: (True, None или сообщение, если подключение не найдено).
- Ошибка: (False, сообщение об ошибке).
* **Return type:**
Tuple[bool, Optional[str]]
* **Raises:**
* **subprocess.CalledProcessError** – Если команда nmcli завершилась с ошибкой.
* **Exception** – Если произошла неизвестная ошибка при выполнении.
#### get_status() → Tuple[bool, str | None]
Проверяет статус текущего подключения к Wi-Fi.
* **Returns:**
Кортеж (успех, SSID или сообщение об ошибке).
: - Успех: (True, SSID текущей сети).
- Ошибка или отсутствие подключения: (False, сообщение об ошибке).
* **Return type:**
Tuple[bool, Optional[str]]
* **Raises:**
**Exception** – Если произошла ошибка при выполнении команды nmcli.

View file

@ -0,0 +1,72 @@
# Firewalld Service
Сервис для управления firewalld через D‑Bus.
Назначение:
- Обёртка над интерфейсами org.fedoraproject.FirewallD1 для выполнения типовых операций по зонам: просмотр/изменение дефолтной зоны, добавление и удаление сервисов, портов, источников, перезагрузка конфигурации.
Примечания:
- Используется pydbus.SystemBus для доступа к системной шине.
- Методы генерируют дружелюбные исключения при ошибках, содержащие контекст операции.
### *class* services.firewalld_service.FirewalldService
Bases: `object`
#### add_port(zone: str, port: int, protocol: str, timeout: int | None = 0) → None
Add a port to a zone.
#### add_service(zone: str, service: str, timeout: int | None = 0) → None
Add a service to a zone.
#### add_source(zone: str, source: str) → None
Add a source to a zone.
#### get_default_zone() → str
Get the default zone.
#### get_ports(zone: str) → List[str]
Get list of ports in a zone.
#### get_services(zone: str) → List[str]
Get list of services in a zone.
#### get_sources(zone: str) → List[str]
Get list of sources in a zone.
#### get_zone_settings(zone: str) → Dict
Get all settings for a zone.
#### get_zones() → List[str]
Get list of all zones.
#### reload() → None
Reload firewall rules.
#### remove_port(zone: str, port: int, protocol: str) → None
Remove a port from a zone.
#### remove_service(zone: str, service: str) → None
Remove a service from a zone.
#### remove_source(zone: str, source: str) → None
Remove a source from a zone.
#### set_default_zone(zone: str) → None
Set the default zone.

View file

@ -0,0 +1,61 @@
# IP Service
Сервис проверки и применения IP‑настроек через NetworkManager (D‑Bus).
Назначение:
- Перед применением конфигурации проверяет занятость IP адреса, сканируя сегмент сети средствами ARP (через NetworkScanner).
- Применяет изменения профиля подключения через sdbus_async.networkmanager и выполняет переподключение интерфейса.
Требования/ограничения:
- Доступ к системной шине D‑Bus и права на изменения сетевых профилей.
- Структура входных данных должна соответствовать схеме ipv4_updates для корректного обновления вложенных полей у профиля.
### *class* services.ip_service.IPService
Bases: `object`
Сервис проверки доступности IP-адреса и применения настроек сети.
Предоставляет асинхронные методы для проверки занятости IP-адреса с использованием
ARP-сканирования и применения настроек через NetworkManager.
#### *async* apply_ip_config(args: Dict[str, Any], translations: Translations = Depends(translations_dependency)) → None
Применяет проверенные настройки IP к указанному соединению.
Перезапускает шину D-Bus, обновляет настройки соединения через NetworkManager,
отключает и переподключает устройство к сети.
* **Parameters:**
* **args** (*Dict* *[**str* *,* *Any* *]*) – Словарь с данными, включая:
- “connection_id” (str): Идентификатор соединения.
- “ipv4_updates” (Dict): Обновления настроек IPv4.
* **translations** (*Translations*) – Объект переводов.
* **Raises:**
* **ValueError** – Если соединение с указанным ID не найдено.
* **RuntimeError** – Если устройство для интерфейса не найдено.
#### NOTE
Требуются права для изменения настроек через NetworkManager.
#### *async* check_ip_config(args: Dict[str, Any], translations: Translations = Depends(translations_dependency)) → Dict[str, Any]
Проверяет доступность IP-адреса перед его применением.
Выполняет ARP-сканирование сети для проверки, занят ли указанный IP-адрес.
Перезапускает шину D-Bus перед выполнением.
* **Parameters:**
* **args** (*Dict* *[**str* *,* *Any* *]*) – Словарь с данными, включая “ipv4_updates”
с полем “ipv4.address-data” для нового IP-адреса.
* **translations** (*Translations*) – Объект переводов.
* **Returns:**
Словарь с ключами:
: - ”available” (bool): Доступен ли IP-адрес.
- ”message” (str): Сообщение о результате проверки.
* **Return type:**
Dict[str, Any]
* **Raises:**
**Exception** – Если произошла ошибка при сканировании ARP.

View file

@ -0,0 +1,195 @@
# Network Service
Сервис чтения сетевого состояния через NetworkManager (D‑Bus).
Назначение:
- Предоставляет асинхронные методы для сборки унифицированных моделей сетевых интерфейсов (Ethernet/Wi‑Fi), их IP‑конфигураций, а также получения имени хоста. Используется API‑слоем для визуализации и управления.
Особенности:
- Фильтрация loopback и явно неактивных интерфейсов.
- Адаптация данных D‑Bus в pydantic‑модели (NetworkInterface, WiFiDevice, NetworkInterfacesContainer).
### *class* services.network_service.NetworkService(translations: Translations = Depends(translations_dependency))
Bases: `object`
Сервис для взаимодействия с NetworkManager через D-Bus.
Предоставляет асинхронные методы для получения информации о сетевых интерфейсах,
их конфигурациях IP, Wi-Fi и состояниях.
#### *async* get_activated_interfaces(initial_positions: Dict[str, Tuple[int, int]] = None) → List[NetworkInterface]
Получает список активных сетевых интерфейсов.
* **Parameters:**
**initial_positions** (*Dict* *[**str* *,* *Tuple* *[**int* *,* *int* *]* *]* *,* *optional*) – Словарь начальных
координат (x, y) для интерфейсов. По умолчанию None.
* **Returns:**
Список активных интерфейсов (state == “100”).
* **Return type:**
List[NetworkInterface]
#### *async* get_activated_interfaces_container(initial_positions: Dict[str, Tuple[int, int]] = None, container_x: int = 0, container_y: int = 0) → NetworkInterfacesContainer
Получает объект, содержащий список активных интерфейсов и координаты контейнера.
* **Parameters:**
* **initial_positions** (*Dict* *[**str* *,* *Tuple* *[**int* *,* *int* *]* *]* *,* *optional*) – Словарь начальных
координат (x, y) для интерфейсов. По умолчанию None.
* **container_x** (*int* *,* *optional*) – Координата X контейнера. По умолчанию 0.
* **container_y** (*int* *,* *optional*) – Координата Y контейнера. По умолчанию 0.
* **Returns:**
Объект с активными интерфейсами и координатами.
* **Return type:**
NetworkInterfacesContainer
#### *async* get_connection_name(device: sdbus_async.networkmanager.NetworkDeviceGeneric) → str
Извлекает имя соединения (GENERAL.CONNECTION) для устройства.
* **Parameters:**
**device** (*NetworkDeviceGeneric*) – Объект устройства NetworkManager.
* **Returns:**
Имя соединения или “unknown” в случае ошибки.
* **Return type:**
str
* **Raises:**
**Exception** – Если произошла ошибка при получении настроек соединения.
#### *async* get_deactivated_interfaces(initial_positions: Dict[str, Tuple[int, int]] = None) → List[NetworkInterface]
Получает список неактивных сетевых интерфейсов.
* **Parameters:**
**initial_positions** (*Dict* *[**str* *,* *Tuple* *[**int* *,* *int* *]* *]* *,* *optional*) – Словарь начальных
координат (x, y) для интерфейсов. По умолчанию None.
* **Returns:**
Список интерфейсов с state != “100”.
* **Return type:**
List[NetworkInterface]
#### *async* get_deactivated_interfaces_container(initial_positions: Dict[str, Tuple[int, int]] = None, container_x: int = 0, container_y: int = 0) → NetworkInterfacesContainer
Получает объект, содержащий список неактивных интерфейсов и координаты контейнера.
* **Parameters:**
* **initial_positions** (*Dict* *[**str* *,* *Tuple* *[**int* *,* *int* *]* *]* *,* *optional*) – Словарь начальных
координат (x, y) для интерфейсов. По умолчанию None.
* **container_x** (*int* *,* *optional*) – Координата X контейнера. По умолчанию 0.
* **container_y** (*int* *,* *optional*) – Координата Y контейнера. По умолчанию 0.
* **Returns:**
Объект с неактивными интерфейсами и координатами.
* **Return type:**
NetworkInterfacesContainer
#### *async* get_hostname() → Dict[str, str]
Возвращает имя хоста из команды hostname в формате JSON.
* **Returns:**
Словарь с ключом “hostname” и значением имени хоста.
* **Return type:**
Dict[str, str]
* **Raises:**
**RuntimeError** – Если произошла ошибка при выполнении команды hostname
или обработке вывода.
#### *async* get_interfaces_by_state(state: str, initial_positions: Dict[str, Tuple[int, int]] = None) → List[NetworkInterface]
Получает список интерфейсов по указанному состоянию.
* **Parameters:**
* **state** (*str*) – Состояние интерфейса (например, “100” для активных).
* **initial_positions** (*Dict* *[**str* *,* *Tuple* *[**int* *,* *int* *]* *]* *,* *optional*) – Словарь начальных
координат (x, y) для интерфейсов. По умолчанию None.
* **Returns:**
Список интерфейсов с указанным состоянием.
* **Return type:**
List[NetworkInterface]
#### *async* get_interfaces_container(state: str | None = None, initial_positions: Dict[str, Tuple[int, int]] = None, container_x: int = 0, container_y: int = 0) → NetworkInterfacesContainer
Получает объект, содержащий список интерфейсов и координаты контейнера.
* **Parameters:**
* **state** (*Optional* *[**str* *]* *,* *optional*) – Состояние интерфейсов (например, “100”).
По умолчанию None (все интерфейсы).
* **initial_positions** (*Dict* *[**str* *,* *Tuple* *[**int* *,* *int* *]* *]* *,* *optional*) – Словарь начальных
координат (x, y) для интерфейсов. По умолчанию None.
* **container_x** (*int* *,* *optional*) – Координата X контейнера. По умолчанию 0.
* **container_y** (*int* *,* *optional*) – Координата Y контейнера. По умолчанию 0.
* **Returns:**
Объект с интерфейсами и координатами контейнера.
* **Return type:**
NetworkInterfacesContainer
#### *async* get_ip_config(device: sdbus_async.networkmanager.NetworkDeviceGeneric, ip_version: str) → List[IndividualIPConfig]
Получает конфигурацию IP для устройства.
* **Parameters:**
* **device** (*NetworkDeviceGeneric*) – Объект устройства NetworkManager.
* **ip_version** (*str*) – Версия IP (“4” или “6”).
* **Returns:**
Список конфигураций IP, включая адреса и маршруты.
* **Return type:**
List[IndividualIPConfig]
* **Raises:**
**Exception** – Если произошла ошибка при получении данных IP.
#### *async* get_ip_method(device: sdbus_async.networkmanager.NetworkDeviceGeneric, ip_type: str) → str
Получает метод IP (например, “auto”, “manual”) для указанного устройства.
* **Parameters:**
* **device** (*NetworkDeviceGeneric*) – Объект устройства NetworkManager.
* **ip_type** (*str*) – Тип IP (например, “ipv4” или “ipv6”).
* **Returns:**
Метод IP или “unknown” в случае ошибки.
* **Return type:**
str
* **Raises:**
**Exception** – Если произошла ошибка при получении настроек соединения.
#### *async* get_network_interfaces(initial_positions: Dict[str, Tuple[int, int]] = None) → List[NetworkInterface | WiFiDevice]
Получает список сетевых интерфейсов.
* **Parameters:**
**initial_positions** (*Dict* *[**str* *,* *Tuple* *[**int* *,* *int* *]* *]* *,* *optional*) – Словарь начальных
координат (x, y) для интерфейсов. По умолчанию None (используются (100, 100)).
* **Returns:**
Список объектов интерфейсов,
: включая Wi-Fi устройства.
* **Return type:**
List[Union[NetworkInterface, WiFiDevice]]
Исключает интерфейсы типа LOOPBACK и неактивные состояния (state == “10”).
#### *async* get_network_interfaces_container(initial_positions: Dict[str, Tuple[int, int]] | None = None) → NetworkInterfacesContainer
Получает контейнер с сетевыми интерфейсами и координатами контейнера.
* **Parameters:**
**initial_positions** (*Optional* *[**Dict* *[**str* *,* *Tuple* *[**int* *,* *int* *]* *]* *]* *,* *optional*) – Словарь начальных координат (x, y) для интерфейсов. По умолчанию None.
* **Returns:**
Объект с интерфейсами и координатами (0, 0).
* **Return type:**
NetworkInterfacesContainer
#### *async* get_wifi_info(wifi_device: sdbus_async.networkmanager.NetworkDeviceWireless) → Dict[str, str | int | None]
Получает информацию о Wi-Fi устройстве.
* **Parameters:**
**wifi_device** (*NetworkDeviceWireless*) – Объект Wi-Fi устройства NetworkManager.
* **Returns:**
Словарь с данными Wi-Fi (SSID, BSSID,
: bitrate, strength, frequency, mode), где значения могут быть None.
* **Return type:**
Dict[str, Optional[Union[str, int]]]
* **Raises:**
**Exception** – Если произошла ошибка при получении данных точки доступа.

View file

@ -0,0 +1,43 @@
# Settings Service
### *class* services.settings_service.SettingsService(translations: Translations = Depends(translations_dependency))
Bases: `object`
Сервис для управления настройками и очистки данных сети.
#### clear_all_data() → bool
Очищает данные узлов всех подсетей и точек доступа Wi-Fi.
* **Returns:**
True, если очистка успешна.
* **Return type:**
bool
* **Raises:**
**Exception** – Если произошла ошибка при записи в один из файлов.
#### clear_subnet(subnet: str | None = None) → bool
Очищает данные узлов подсети в указанном файле или во всех файлах.
* **Parameters:**
**subnet** (*Optional* *[**str* *]*) – Подсеть в формате CIDR (например, “10.1.1.0/24”).
Если None, очищает все подсети.
* **Returns:**
True, если очистка успешна.
* **Return type:**
bool
* **Raises:**
**Exception** – Если произошла ошибка при записи в файл.
#### clear_wifi() → bool
Очищает данные точек доступа Wi-Fi в файле wifi.json.
* **Returns:**
True, если очистка успешна.
* **Return type:**
bool
* **Raises:**
**Exception** – Если произошла ошибка при записи в файл.

View file

@ -0,0 +1,272 @@
# Subnet Service
### *class* services.subnet_service.DeviceInfoCollector(translations: Translations)
Bases: `object`
Класс для сбора информации об устройствах, включая вендоров и хостнеймы.
Источники данных:
: - MacLookup: сопоставление префикса MAC (OUI) с названием производителя.
- DNS: gethostbyaddr с малым таймаутом для обратного разрешения имени.
- NetBIOS (nbtscan): опрос сегмента сети для извлечения NetBIOS‑имён.
Политика кэширования:
: - Результаты get_vendor кэшируются с помощью functools.lru_cache.
- Результаты nbtscan аккумулируются в словарях nbtscan_cache/nbtscan_results
на время жизни экземпляра.
#### get_hostname(ip: str) → str | None
Получает хостнейм для указанного IP-адреса.
Пробует сначала DNS, затем NetBIOS.
* **Parameters:**
**ip** (*str*) – IP-адрес устройства.
* **Returns:**
Хостнейм или None, если не удалось определить.
* **Return type:**
Optional[str]
#### get_vendor(mac: str) → str
Получает вендора устройства по MAC-адресу.
Использует кэширование для повышения производительности.
* **Parameters:**
**mac** (*str*) – MAC-адрес устройства.
* **Returns:**
Название вендора или “Неизвестный” в случае ошибки.
* **Return type:**
str
#### scan_nbtscan(subnet: str) → None
Сканирует подсеть с помощью nbtscan для получения хостнеймов.
Сохраняет результаты в кэш и логирует процесс.
* **Parameters:**
**subnet** (*str*) – Подсеть в формате CIDR.
### *class* services.subnet_service.DeviceStorage(base_path: str = 'storage/subnets', translations: Translations = None)
Bases: `object`
Класс для хранения и управления данными об устройствах.
Формат файла подсети:
```default
{
"devices": [Device, ...]
}
```
Политика очистки:
- Метод \_clean_old_devices удаляет оффлайн‑устройства, не наблюдавшиеся более 7 дней,
чтобы поддерживать актуальность списка.
#### get_subnet_file(subnet: str) → Path
Возвращает путь к файлу для конкретной подсети.
Заменяет символы ‘/’ на ‘_’ для корректного имени файла.
* **Parameters:**
**subnet** (*str*) – Подсеть в формате CIDR.
* **Returns:**
Путь к файлу.
* **Return type:**
Path
#### load_devices(subnet: str) → Dict[str, Device]
Загружает устройства для указанной подсети.
Читает данные из JSON-файла и фильтрует устаревшие устройства.
* **Parameters:**
**subnet** (*str*) – Подсеть в формате CIDR.
* **Returns:**
Словарь устройств с MAC как ключом.
* **Return type:**
Dict[str, Device]
#### save_devices(subnet: str, devices: List[Device]) → None
Сохраняет устройства для указанной подсети.
Записывает данные в JSON-файл.
* **Parameters:**
* **subnet** (*str*) – Подсеть в формате CIDR.
* **devices** (*List* *[**Device* *]*) – Список устройств для сохранения.
* **Raises:**
**Exception** – Если произошла ошибка при сохранении.
### *class* services.subnet_service.NetworkScanner(interface: str, translations: Translations)
Bases: `object`
Класс для сканирования подсети с использованием ARP-запросов.
Назначение:
: Обнаруживает активные устройства в локальной сети, отправляя широковещательные
ARP‑запросы по указанной подсети и собирая ответы (IP, MAC).
Детали реализации:
: - Использует scapy (Ether + ARP) для генерации пакетов и srp для
отправки/получения на канальном уровне от имени заданного интерфейса.
- Таймаут ожидания ответа короткий (2 секунды), ориентирован на интерактивные
сценарии UI.
Ограничения и замечания:
: - Требуются права для отправки низкоуровневых пакетов (capabilities/root).
- В сетях с фильтрацией широковещания количество обнаруженных устройств
может быть ограничено.
#### scan(subnet: str) → List[Tuple[str, str]]
Сканирует подсеть с использованием ARP-запросов.
Отправляет ARP-пакеты для обнаружения активных устройств и возвращает
список кортежей (IP, MAC).
* **Parameters:**
**subnet** (*str*) – Подсеть в формате CIDR (например, “10.1.1.0/24”).
* **Returns:**
Список кортежей (IP-адрес, MAC-адрес) обнаруженных устройств.
* **Return type:**
List[Tuple[str, str]]
* **Raises:**
**Exception** – Если произошла ошибка сканирования.
### *class* services.subnet_service.PortScanner(interface: str, translations: Translations)
Bases: `object`
Класс для сканирования открытых портов на устройствах.
Назначение:
: Плейсхолдер для будущего функционала активного сканирования TCP/UDP‑портов
у обнаруженных узлов. В текущей версии возвращает пустой список.
План развития:
: - Добавить неблокирующее сканирование наиболее распространённых портов
(22, 80, 443 и т.д.) с ограничением по времени.
- Настраиваемые профили глубины и скорости сканирования.
#### scan(ip: str) → List[str]
Сканирует открытые порты на указанном IP-адресе.
Пока возвращает пустой список, так как функциональность не реализована.
* **Parameters:**
**ip** (*str*) – IP-адрес устройства для сканирования.
* **Returns:**
Список открытых портов (пока пустой).
* **Return type:**
List[str]
### *class* services.subnet_service.SubnetService(translations: Translations)
Bases: `object`
Сервис для сканирования подсетей и управления устройствами.
Роль сервиса:
: Объединяет сетевое сканирование (ARP), сбор дополнительной информации
(вендор, хостнейм), слияние с кэшем предыдущих результатов и персистентное
хранение данных по подсетям. Предоставляет вспомогательные операции для
локального узла и работы с заметками устройств.
Поток выполнения скана (scan_subnet):
: 1. Определение подсети (вручную или авто по интерфейсу).
2. Загрузка ранее сохранённых устройств подсети.
3. Добавление локального устройства (если принадлежит подсети).
4. ARP‑сканирование и параллельная обработка узлов (обогащение данных).
5. Маркировка оффлайн‑узлов из кэша, не встреченных в текущем скане.
6. Сортировка по IP и сохранение объединённого списка в JSON.
#### add_note(mac: str, note: str, translations: Translations) → Tuple[bool, Tuple[str, Dict] | None]
Добавляет заметку для устройства по MAC-адресу.
Привязывает заметку к устройству, если оно существует.
* **Parameters:**
* **mac** (*str*) – MAC-адрес устройства.
* **note** (*str*) – Текст заметки.
* **translations** (*Translations*) – Объект переводов для текущего языка.
* **Returns:**
Кортеж (успех, результат),
: где результат содержит код ошибки/успеха и данные.
* **Return type:**
Tuple[bool, Optional[Tuple[str, Dict]]]
#### delete_note(mac: str, translations: Translations) → Tuple[bool, Tuple[str, Dict] | None]
Удаляет заметку для устройства по MAC-адресу.
Удаляет привязанную заметку, если она существует.
* **Parameters:**
* **mac** (*str*) – MAC-адрес устройства.
* **translations** (*Translations*) – Объект переводов для текущего языка.
* **Returns:**
Кортеж (успех, результат),
: где результат содержит код ошибки/успеха и данные.
* **Return type:**
Tuple[bool, Optional[Tuple[str, Dict]]]
#### scan_subnet(subnet: str | None = None) → SubnetScanResult
Сканирует указанную подсеть и возвращает результаты.
Выполняет ARP-сканирование, собирает информацию о устройствах и сохраняет данные.
* **Parameters:**
**subnet** (*Optional* *[**str* *]*) – Подсеть в формате CIDR (например, “10.1.1.0/24”).
Если None или пустая строка, определяется автоматически.
* **Returns:**
Объект с результатами сканирования, содержащий список
: устройств или сообщение об ошибке.
* **Return type:**
SubnetScanResult
* **Raises:**
**Exception** – Если произошла ошибка сканирования.
#### update_note(mac: str, note: str, translations: Translations) → Tuple[bool, Tuple[str, Dict] | None]
Обновляет заметку для устройства по MAC-адресу.
Изменяет существующую заметку, если она есть.
* **Parameters:**
* **mac** (*str*) – MAC-адрес устройства.
* **note** (*str*) – Новый текст заметки.
* **translations** (*Translations*) – Объект переводов для текущего языка.
* **Returns:**
Кортеж (успех, результат),
: где результат содержит код ошибки/успеха и данные.
* **Return type:**
Tuple[bool, Optional[Tuple[str, Dict]]]
### services.subnet_service.get_subnet_service(translations: Translations = Depends(translations_dependency))
Фабричная функция для создания экземпляра SubnetService.
Использует зависимости FastAPI для получения объекта переводов и возвращает
экземпляр SubnetService с текущей локализацией.
* **Parameters:**
**translations** (*Translations*) – Объект переводов для текущего языка.
* **Returns:**
Экземпляр сервиса для работы с подсетями.
* **Return type:**
SubnetService

View file

@ -0,0 +1,108 @@
# UFW Service
### *class* services.ufw_service.UFWService
Bases: `object`
Сервис взаимодействия с UFW (Uncomplicated Firewall).
Назначение:
: - Чтение статуса и списка правил брандмауэра.
- Добавление, удаление и массовая обработка правил с поддержкой диапазонов портов,
комментариев и выбором протоколов.
Детали реализации:
: - Команды выполняются через sudo ufw …; вывод парсится в модели pydantic.
- Для операций удаления соблюдается порядок с конца, чтобы не нарушать нумерацию.
#### add_rules(rules: List[UFWRule]) → dict
Добавляет правила UFW.
* **Parameters:**
**rules** – Список правил для добавления
* **Returns:**
Результат добавления правил
* **Return type:**
dict
#### add_rules_base(rules: List[UFWRule], direction: str = '') → bool
Базовый метод для добавления правил UFW.
* **Parameters:**
* **rules** – Список правил для добавления
* **direction** – Направление трафика (“in” или “out”)
* **Returns:**
True если все правила были успешно добавлены, False в противном случае
* **Return type:**
bool
#### add_ufw_in_rules(rules: List[UFWRule]) → bool
Добавляет входящие (in) правила UFW.
* **Parameters:**
**rules** (*List* *[**UFWRule* *]*) – Список правил для добавления
* **Returns:**
True если все правила были успешно добавлены, False в противном случае
* **Return type:**
bool
#### add_ufw_out_rules(rules: List[UFWRule]) → bool
Добавляет исходящие (out) правила UFW.
* **Parameters:**
**rules** (*List* *[**UFWRule* *]*) – Список правил для добавления
* **Returns:**
True если все правила были успешно добавлены, False в противном случае
* **Return type:**
bool
#### delete_rules(rule_numbers: List[int]) → dict
Удаляет правила UFW по их номерам.
* **Parameters:**
**rule_numbers** (*List* *[**int* *]*) – Список номеров правил для удаления
* **Returns:**
Результат операции удаления
* **Return type:**
dict
#### disable_ufw() → bool
Выключает UFW.
* **Returns:**
True если успешно выключен, False в противном случае
* **Return type:**
bool
#### enable_ufw() → bool
Включает UFW.
* **Returns:**
True если успешно включен, False в противном случае
* **Return type:**
bool
#### get_ufw_rules() → UFWRulesResponse
Получает список правил UFW.
* **Returns:**
Объект, содержащий статус UFW и список правил
* **Return type:**
UFWRulesResponse
#### get_ufw_status() → UFWStatus
Проверяет статус UFW.
* **Returns:**
Объект с информацией о статусе UFW
* **Return type:**
UFWStatus

View file

@ -0,0 +1,61 @@
# Wifi Service
### *class* services.wifi_service.WifiService(translations: Translations = Depends(translations_dependency))
Bases: `object`
Сервис для сканирования текущих Wi‑Fi точек доступа и заметок.
Источники данных:
: - pywifi для базового сканирования и получения списка AP.
- iw dev <iface> scan для уточнения частоты, сигнала и безопасности.
- MacLookup для определения вендора по BSSID.
Политики:
: - Выбор лучшего AP по SSID по уровню сигнала.
- Кэширование определения вендора.
- Сохранение SSID даже без заметок для будущих операций.
#### add_note(ssid: str, note: str) → Tuple[bool, str | None]
Добавляет заметку к сети Wi-Fi по SSID.
#### delete_note(ssid: str) → Tuple[bool, str | None]
Удаляет заметку сети Wi-Fi по SSID.
#### get_vendor(mac: str) → str
Определяет вендора по MAC-адресу с использованием кэширования.
#### scan_wifi(timeout: int = 30) → WifiScanResult
Сканирует текущие Wi-Fi точки доступа.
#### update_note(ssid: str, note: str) → Tuple[bool, str | None]
Обновляет заметку сети Wi-Fi по SSID.
### *class* services.wifi_service.WifiStorage(storage_path: str = 'storage/wifi/wifi.json', translations: Translations = Depends(translations_dependency))
Bases: `object`
Класс для хранения данных о Wi‑Fi сетях и их заметках по SSID.
Формат:
: {
: “networks”: [{“ssid”: str, “note”: Optional[str]}]
<br/>
}
Поведение:
: - Создаёт директорию хранения при инициализации, ведёт логирование путей.
- Валидация структуры при чтении, безопасная запись с Unicode и отступами.
#### load_notes() → Dict[str, str | None]
Загружает заметки по SSID из файла хранения.
#### save_notes(notes: Dict[str, str | None]) → None
Сохраняет заметки по SSID в файл.

View file

@ -0,0 +1,4 @@
# Хранилища
* [storage.json_storage](storage/json_storage.md)
* [storage.session_storage](storage/session_storage.md)

View file

@ -0,0 +1,75 @@
# storage.json_storage
### *class* storage.json_storage.JsonStorage(file_path: str = '/etc/gonets/users.json')
Bases: `object`
Хранилище пользователей в JSON-файле.
Назначение:
: Обеспечивает простое файловое хранилище для учетных записей пользователей
без полноценной СУБД. Подходит для встраиваемых окружений и сценариев,
где важна минимальная зависимость от внешних сервисов.
Формат данных:
: JSON‑структура вида:
{
<br/>
> “users”: [
> : {“id”: int, “username”: str, “password_hash”: str, “is_admin”: bool},
> …
<br/>
> ],
> “next_id”: int
<br/>
}
Безопасность:
: Пароли никогда не сохраняются в открытом виде. Для хеширования используется
passlib.context.CryptContext со схемой bcrypt. Файл создаётся с правами
доступа 0o600 (только владелец).
Ограничения и замечания:
: - Отсутствует конкурентный доступ/блокировки файла — при использовании в
многопроцессной среде может потребоваться внешняя синхронизация.
- Имя файла и каталог по умолчанию /etc/gonets/users.json предполагают
наличие прав на запись и предварительную подготовку окружения.
#### create_user(user: UserCreate) → UserResponse
Создаёт нового пользователя с хешированием пароля.
* **Parameters:**
**user** (*UserCreate*) – Объект с данными нового пользователя (username, password, is_admin).
* **Returns:**
Объект с данными созданного пользователя (id, username, is_admin).
* **Return type:**
UserResponse
* **Raises:**
* **ValueError** – Если пользователь с таким именем уже существует.
* **Exception** – Если произошла ошибка при записи данных.
#### get_user_by_username(username: str) → dict | None
Получает данные пользователя по имени.
* **Parameters:**
**username** (*str*) – Имя пользователя для поиска.
* **Returns:**
Словарь с данными пользователя или None, если пользователь не найден.
* **Return type:**
Optional[dict]
* **Raises:**
**Exception** – Если произошла ошибка при чтении файла.
#### verify_password(plain_password: str, hashed_password: str) → bool
Проверяет соответствие введённого пароля хэшированному.
* **Parameters:**
* **plain_password** (*str*) – Введённый пользователем пароль.
* **hashed_password** (*str*) – Хэшированный пароль из хранилища.
* **Returns:**
True, если пароль верен, False в противном случае.
* **Return type:**
bool

View file

@ -0,0 +1,95 @@
# storage.session_storage
### *class* storage.session_storage.SessionStorage(file_path: str = '/etc/gonets/sessions.json')
Bases: `object`
Хранилище сессий пользователей в JSON-файле.
Назначение:
: Лёгкое файловое хранилище для сессионных токенов, сопоставленных с
client_id (например, IP клиента). Предназначено для сред без БД и
persistent‑кэшей. Обеспечивает базовые операции и авто‑очистку протухших
сессий.
Формат данных:
: {
: “sessions”: {
: “<session_id>”: {
: “username”: str,
“token”: str,
“client_id”: str,
“created_at”: ISO8601 str,
“expiry”: ISO8601 str
<br/>
}
<br/>
}
Политика TTL:
: Каждая сессия действует 30 минут. При создании/чтении/удалении вызывается
clean_expired_sessions() для удаления протухших записей.
Ограничения:
: - Нет файловых блокировок: в многопроцессных конфигурациях возможны гонки.
- Размещение по умолчанию /etc/gonets/sessions.json требует прав на запись.
#### clean_expired_sessions()
Удаляет все истекшие сессии из хранилища.
* **Raises:**
**Exception** – Если произошла ошибка при чтении или записи данных.
#### NOTE
Проверяет срок действия каждой сессии и удаляет те, что истекли,
записывая обновлённые данные.
#### create_session(username: str, token: str, client_id: str) → str
Создаёт новую сессию и возвращает уникальный session_id.
* **Parameters:**
* **username** (*str*) – Имя пользователя, для которого создаётся сессия.
* **token** (*str*) – Токен аутентификации.
* **client_id** (*str*) – Идентификатор клиента.
* **Returns:**
Уникальный идентификатор сессии (session_id).
* **Return type:**
str
* **Raises:**
**Exception** – Если произошла ошибка при создании или записи сессии.
#### NOTE
Удаляет истекшие сессии перед созданием новой и устанавливает срок
действия 30 минут.
#### delete_session(session_id: str)
Удаляет сессию по указанному session_id.
* **Parameters:**
**session_id** (*str*) – Уникальный идентификатор сессии.
* **Raises:**
**Exception** – Если произошла ошибка при чтении или записи данных.
#### NOTE
Очищает истекшие сессии перед удалением.
#### get_latest_session(client_id: str) → Dict | None
Получает последнюю активную сессию для указанного client_id.
* **Parameters:**
**client_id** (*str*) – Идентификатор клиента.
* **Returns:**
Словарь с данными последней активной сессии, включая
: ”session_id”, или None, если сессия не найдена.
* **Return type:**
Optional[Dict]
* **Raises:**
**Exception** – Если произошла ошибка при чтении или обработке данных.
#### NOTE
Очищает истекшие сессии перед поиском и возвращает сессию с самым
поздним временем создания.

3
SRV/docs/_build/markdown/api/utils.md vendored Normal file
View file

@ -0,0 +1,3 @@
# Утилиты
* [utils.i18n](utils/i18n.md)

View file

@ -0,0 +1,23 @@
# utils.i18n
Утилиты локализации и зависимости переводов для FastAPI.
Содержимое модуля:
: - get_translations(): фабрика зависимости FastAPI, считывающая локаль из
query‑параметра locale, cookie locale или заголовка Accept-Language
(по приоритету), с дефолтом ru. Возвращает функцию‑зависимость, которая
подгружает babel.support.Translations из каталога SRV/locales.
- \_(): удобная обёртка для получения перевода строки с использованием
текущей локали (или дефолтного ru, если контекст запроса не передан).
Особенности:
: - При отсутствии словаря перевода для выбранной локали выполняется fallback на
русскую локаль, что гарантирует наличие строк интерфейса.
- Локаль определяется только по первому языку из Accept-Language (без
региональных суффиксов) для упрощения.
- Модуль ведёт отладочное логирование выбора и загрузки локали.
### utils.i18n.get_translations() → callable
Создаёт зависимость для загрузки переводов на основе заголовка Accept-Language
или параметра запроса ‘locale’. По умолчанию используется русский язык.