Tech docs for API Gonets
This commit is contained in:
parent
c35201043c
commit
c55acba709
77 changed files with 2750 additions and 0 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
5
Документация/Техническая-документация-api/api/config.md
Normal file
5
Документация/Техническая-документация-api/api/config.md
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
# Конфигурация
|
||||||
|
|
||||||
|
* [config.cors](cors.md)
|
||||||
|
* [config.init_config](init_config.md)
|
||||||
|
* [config.ports](ports.md)
|
||||||
27
Документация/Техническая-документация-api/api/config/cors.md
Normal file
27
Документация/Техническая-документация-api/api/config/cors.md
Normal 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
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
# config.init_config
|
||||||
|
|
@ -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
Документация/Техническая-документация-api/api/core.md
Normal file
3
Документация/Техническая-документация-api/api/core.md
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
# Core
|
||||||
|
|
||||||
|
* [core.cli_executor](cli_executor.md)
|
||||||
|
|
@ -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
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
# API эндпоинты
|
||||||
|
|
||||||
|
* [api.v1.auth](Техническая-документация-api/api/endpoints/auth.md)
|
||||||
|
* [api.v1.ip](ip.md)
|
||||||
|
* [api.v1.network](Техническая-документация-api/api/endpoints/network.md)
|
||||||
|
* [api.v1.settings](settings.md)
|
||||||
|
* [api.v1.subnet](Техническая-документация-api/api/endpoints/subnet.md)
|
||||||
|
* [api.v1.ufw](Техническая-документация-api/api/endpoints/ufw.md)
|
||||||
|
* [api.v1.websocket](websocket.md)
|
||||||
|
|
@ -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).
|
||||||
|
|
@ -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).
|
||||||
|
|
@ -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) или
|
||||||
|
типы данных неверны.
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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).
|
||||||
104
Документация/Техническая-документация-api/api/endpoints/ufw.md
Normal file
104
Документация/Техническая-документация-api/api/endpoints/ufw.md
Normal 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).
|
||||||
|
|
@ -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** – Если произошла ошибка при обработке данных.
|
||||||
8
Документация/Техническая-документация-api/api/models.md
Normal file
8
Документация/Техническая-документация-api/api/models.md
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
# Модели
|
||||||
|
|
||||||
|
* [models.auth](Техническая-документация-api/api/models/auth.md)
|
||||||
|
* [models.network](Техническая-документация-api/api/models/network.md)
|
||||||
|
* [models.request](request.md)
|
||||||
|
* [models.subnet](Техническая-документация-api/api/models/subnet.md)
|
||||||
|
* [models.ufw](Техническая-документация-api/api/models/ufw.md)
|
||||||
|
* [models.wifi](wifi.md)
|
||||||
85
Документация/Техническая-документация-api/api/models/auth.md
Normal file
85
Документация/Техническая-документация-api/api/models/auth.md
Normal 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*
|
||||||
238
Документация/Техническая-документация-api/api/models/network.md
Normal file
238
Документация/Техническая-документация-api/api/models/network.md
Normal 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*
|
||||||
|
|
@ -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*
|
||||||
|
|
@ -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].
|
||||||
195
Документация/Техническая-документация-api/api/models/ufw.md
Normal file
195
Документация/Техническая-документация-api/api/models/ufw.md
Normal 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].
|
||||||
55
Документация/Техническая-документация-api/api/models/wifi.md
Normal file
55
Документация/Техническая-документация-api/api/models/wifi.md
Normal 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].
|
||||||
12
Документация/Техническая-документация-api/api/services.md
Normal file
12
Документация/Техническая-документация-api/api/services.md
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
# Сервисы
|
||||||
|
|
||||||
|
* [ARP Service](arp_service.md)
|
||||||
|
* [Auth Service](auth_service.md)
|
||||||
|
* [Connect Service](connect_service.md)
|
||||||
|
* [Firewalld Service](firewalld_service.md)
|
||||||
|
* [IP Service](ip_service.md)
|
||||||
|
* [Network Service](network_service.md)
|
||||||
|
* [Settings Service](settings_service.md)
|
||||||
|
* [Subnet Service](subnet_service.md)
|
||||||
|
* [UFW Service](ufw_service.md)
|
||||||
|
* [Wifi Service](wifi_service.md)
|
||||||
|
|
@ -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-адреса интерфейса и удаляет дубликаты.
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
Проверяет токен
|
||||||
|
|
@ -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.
|
||||||
|
|
@ -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.
|
||||||
|
|
@ -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.
|
||||||
|
|
@ -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** – Если произошла ошибка при получении данных точки доступа.
|
||||||
|
|
@ -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** – Если произошла ошибка при записи в файл.
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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 в файл.
|
||||||
4
Документация/Техническая-документация-api/api/storage.md
Normal file
4
Документация/Техническая-документация-api/api/storage.md
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
# Хранилища
|
||||||
|
|
||||||
|
* [storage.json_storage](json_storage.md)
|
||||||
|
* [storage.session_storage](session_storage.md)
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
Документация/Техническая-документация-api/api/utils.md
Normal file
3
Документация/Техническая-документация-api/api/utils.md
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
# Утилиты
|
||||||
|
|
||||||
|
* [utils.i18n](i18n.md)
|
||||||
23
Документация/Техническая-документация-api/api/utils/i18n.md
Normal file
23
Документация/Техническая-документация-api/api/utils/i18n.md
Normal 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’. По умолчанию используется русский язык.
|
||||||
45
Документация/Техническая-документация-api/index.md
Normal file
45
Документация/Техническая-документация-api/index.md
Normal file
|
|
@ -0,0 +1,45 @@
|
||||||
|
# GONETS SRV Documentation
|
||||||
|
|
||||||
|
Добро пожаловать в документацию серверной части GONETS (SRV).
|
||||||
|
|
||||||
|
## Содержание
|
||||||
|
|
||||||
|
## Разделы
|
||||||
|
|
||||||
|
* [Сервисы](services.md)
|
||||||
|
* [ARP Service](arp_service.md)
|
||||||
|
* [Auth Service](auth_service.md)
|
||||||
|
* [Connect Service](connect_service.md)
|
||||||
|
* [Firewalld Service](firewalld_service.md)
|
||||||
|
* [IP Service](ip_service.md)
|
||||||
|
* [Network Service](network_service.md)
|
||||||
|
* [Settings Service](settings_service.md)
|
||||||
|
* [Subnet Service](subnet_service.md)
|
||||||
|
* [UFW Service](ufw_service.md)
|
||||||
|
* [Wifi Service](wifi_service.md)
|
||||||
|
* [Модели](models.md)
|
||||||
|
* [models.auth](Техническая-документация-api/api/models/auth.md)
|
||||||
|
* [models.network](Техническая-документация-api/api/models/network.md)
|
||||||
|
* [models.request](request.md)
|
||||||
|
* [models.subnet](Техническая-документация-api/api/models/subnet.md)
|
||||||
|
* [models.ufw](Техническая-документация-api/api/models/ufw.md)
|
||||||
|
* [models.wifi](wifi.md)
|
||||||
|
* [API эндпоинты](endpoints.md)
|
||||||
|
* [api.v1.auth](Техническая-документация-api/api/endpoints/auth.md)
|
||||||
|
* [api.v1.ip](ip.md)
|
||||||
|
* [api.v1.network](Техническая-документация-api/api/endpoints/network.md)
|
||||||
|
* [api.v1.settings](settings.md)
|
||||||
|
* [api.v1.subnet](Техническая-документация-api/api/endpoints/subnet.md)
|
||||||
|
* [api.v1.ufw](Техническая-документация-api/api/endpoints/ufw.md)
|
||||||
|
* [api.v1.websocket](websocket.md)
|
||||||
|
* [Конфигурация](config.md)
|
||||||
|
* [config.cors](cors.md)
|
||||||
|
* [config.init_config](init_config.md)
|
||||||
|
* [config.ports](ports.md)
|
||||||
|
* [Core](core.md)
|
||||||
|
* [core.cli_executor](cli_executor.md)
|
||||||
|
* [Хранилища](storage.md)
|
||||||
|
* [storage.json_storage](json_storage.md)
|
||||||
|
* [storage.session_storage](session_storage.md)
|
||||||
|
* [Утилиты](utils.md)
|
||||||
|
* [utils.i18n](i18n.md)
|
||||||
Loading…
Add table
Add a link
Reference in a new issue