Rename directories
This commit is contained in:
parent
c55acba709
commit
ca047c4248
95 changed files with 77 additions and 77 deletions
44
Documentation/API.md
Normal file
44
Documentation/API.md
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
# API
|
||||
|
||||
Клиентская часть приложения взаимодействует с сервером через HTTPS-запросы и WebSocket-соединение. Большинство запросов могут выполняться с любого подключённого узла (например, https://192.168.1.147:8001/ip/check_ip), за исключением запроса /network/get_hostname, который ограничен локальным хостом (localhost:8001), так как возвращает hostname корневого устройства, с которого запущен клиент.
|
||||
|
||||
Все HTTPS-запросы реализованы в файле /src/api/request.ts. WebSocket-соединение для работы с сетевыми интерфейсами настроено в файле /src/components/workSpace/modules/workModules/networkInterfaces.tsx.
|
||||
|
||||
(По-хорошему настройку WebSocket подключения нужно будет переносить тоже в /src/api, так будет лучше, когда будет писаться больше модулей рабочего пространства)
|
||||
|
||||
Список API-запросов
|
||||
|
||||
1. Проверка доступности IP-адреса
|
||||
- Эндпоинт: https://<host>:8001/ip/check_ip
|
||||
- Описание: Проверяет доступность указанного IP-адреса.
|
||||
2. Сохранение изменений IP-адреса
|
||||
- Эндпоинт: https://<host>:8001/ip/apply_ip
|
||||
- Описание: Применяет изменения конфигурации IP-адреса.
|
||||
3. Получение hostname корневого устройства
|
||||
- Эндпоинт: https://localhost:8001/network/get_hostname
|
||||
- Описание: Возвращает hostname устройства, с которого запущен клиент. Запрос ограничен локальным хостом.
|
||||
4. Регистрация пользователя
|
||||
- Эндпоинт: https://<host>:8001/auth/register
|
||||
- Описание: Создаёт нового пользователя (устанавливает пароль оператора).
|
||||
5. Авторизация пользователя
|
||||
- Эндпоинт: https://<host>:8001/auth/login
|
||||
- Описание: Выполняет вход пользователя, повышая его права до уровня оператора.
|
||||
6. Выход пользователя
|
||||
- Эндпоинт: https://<host>:8001/auth/logout
|
||||
- Описание: Выполняет выход пользователя, снижая его права.
|
||||
7. Проверка прав пользователя
|
||||
- Эндпоинт: https://<host>:8001/auth/me
|
||||
- Описание: Проверяет текущие права авторизованного пользователя.
|
||||
8. Проверка наличия пользователя
|
||||
- Эндпоинт: https://<host>:8001/auth/check_json
|
||||
- Описание: Проверяет, существует ли пользователь на устройстве.
|
||||
|
||||
WebSocket-соединение
|
||||
|
||||
- Эндпоинт: wss://<host>:8001/api/v1
|
||||
- Описание: Устанавливает WebSocket-соединение для получения данных о сетевых интерфейсах в реальном времени. Реализовано в файле /src/components/workSpace/modules/workModules/networkInterfaces.tsx.
|
||||
|
||||
Замечания для разработки и тестирования
|
||||
|
||||
- В режиме разработки (npm run dev) можно переключать протоколы с https на http и с wss на ws, если сервер настроен на поддержку HTTP-запросов.
|
||||
- Убедитесь, что сервер работает в соответствующем режиме (HTTP или HTTPS), чтобы избежать ошибок подключения.
|
||||
BIN
Documentation/Tech-docs/.doctrees/api/config.doctree
Normal file
BIN
Documentation/Tech-docs/.doctrees/api/config.doctree
Normal file
Binary file not shown.
BIN
Documentation/Tech-docs/.doctrees/api/config/cors.doctree
Normal file
BIN
Documentation/Tech-docs/.doctrees/api/config/cors.doctree
Normal file
Binary file not shown.
BIN
Documentation/Tech-docs/.doctrees/api/config/init_config.doctree
Normal file
BIN
Documentation/Tech-docs/.doctrees/api/config/init_config.doctree
Normal file
Binary file not shown.
BIN
Documentation/Tech-docs/.doctrees/api/config/ports.doctree
Normal file
BIN
Documentation/Tech-docs/.doctrees/api/config/ports.doctree
Normal file
Binary file not shown.
BIN
Documentation/Tech-docs/.doctrees/api/core.doctree
Normal file
BIN
Documentation/Tech-docs/.doctrees/api/core.doctree
Normal file
Binary file not shown.
BIN
Documentation/Tech-docs/.doctrees/api/core/cli_executor.doctree
Normal file
BIN
Documentation/Tech-docs/.doctrees/api/core/cli_executor.doctree
Normal file
Binary file not shown.
BIN
Documentation/Tech-docs/.doctrees/api/endpoints.doctree
Normal file
BIN
Documentation/Tech-docs/.doctrees/api/endpoints.doctree
Normal file
Binary file not shown.
BIN
Documentation/Tech-docs/.doctrees/api/endpoints/auth.doctree
Normal file
BIN
Documentation/Tech-docs/.doctrees/api/endpoints/auth.doctree
Normal file
Binary file not shown.
BIN
Documentation/Tech-docs/.doctrees/api/endpoints/ip.doctree
Normal file
BIN
Documentation/Tech-docs/.doctrees/api/endpoints/ip.doctree
Normal file
Binary file not shown.
BIN
Documentation/Tech-docs/.doctrees/api/endpoints/network.doctree
Normal file
BIN
Documentation/Tech-docs/.doctrees/api/endpoints/network.doctree
Normal file
Binary file not shown.
BIN
Documentation/Tech-docs/.doctrees/api/endpoints/settings.doctree
Normal file
BIN
Documentation/Tech-docs/.doctrees/api/endpoints/settings.doctree
Normal file
Binary file not shown.
BIN
Documentation/Tech-docs/.doctrees/api/endpoints/subnet.doctree
Normal file
BIN
Documentation/Tech-docs/.doctrees/api/endpoints/subnet.doctree
Normal file
Binary file not shown.
BIN
Documentation/Tech-docs/.doctrees/api/endpoints/ufw.doctree
Normal file
BIN
Documentation/Tech-docs/.doctrees/api/endpoints/ufw.doctree
Normal file
Binary file not shown.
Binary file not shown.
BIN
Documentation/Tech-docs/.doctrees/api/models.doctree
Normal file
BIN
Documentation/Tech-docs/.doctrees/api/models.doctree
Normal file
Binary file not shown.
BIN
Documentation/Tech-docs/.doctrees/api/models/auth.doctree
Normal file
BIN
Documentation/Tech-docs/.doctrees/api/models/auth.doctree
Normal file
Binary file not shown.
BIN
Documentation/Tech-docs/.doctrees/api/models/network.doctree
Normal file
BIN
Documentation/Tech-docs/.doctrees/api/models/network.doctree
Normal file
Binary file not shown.
BIN
Documentation/Tech-docs/.doctrees/api/models/request.doctree
Normal file
BIN
Documentation/Tech-docs/.doctrees/api/models/request.doctree
Normal file
Binary file not shown.
BIN
Documentation/Tech-docs/.doctrees/api/models/subnet.doctree
Normal file
BIN
Documentation/Tech-docs/.doctrees/api/models/subnet.doctree
Normal file
Binary file not shown.
BIN
Documentation/Tech-docs/.doctrees/api/models/ufw.doctree
Normal file
BIN
Documentation/Tech-docs/.doctrees/api/models/ufw.doctree
Normal file
Binary file not shown.
BIN
Documentation/Tech-docs/.doctrees/api/models/wifi.doctree
Normal file
BIN
Documentation/Tech-docs/.doctrees/api/models/wifi.doctree
Normal file
Binary file not shown.
BIN
Documentation/Tech-docs/.doctrees/api/services.doctree
Normal file
BIN
Documentation/Tech-docs/.doctrees/api/services.doctree
Normal file
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.
BIN
Documentation/Tech-docs/.doctrees/api/storage.doctree
Normal file
BIN
Documentation/Tech-docs/.doctrees/api/storage.doctree
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Documentation/Tech-docs/.doctrees/api/utils.doctree
Normal file
BIN
Documentation/Tech-docs/.doctrees/api/utils.doctree
Normal file
Binary file not shown.
BIN
Documentation/Tech-docs/.doctrees/api/utils/i18n.doctree
Normal file
BIN
Documentation/Tech-docs/.doctrees/api/utils/i18n.doctree
Normal file
Binary file not shown.
BIN
Documentation/Tech-docs/.doctrees/environment.pickle
Normal file
BIN
Documentation/Tech-docs/.doctrees/environment.pickle
Normal file
Binary file not shown.
BIN
Documentation/Tech-docs/.doctrees/index.doctree
Normal file
BIN
Documentation/Tech-docs/.doctrees/index.doctree
Normal file
Binary file not shown.
5
Documentation/Tech-docs/api/config.md
Normal file
5
Documentation/Tech-docs/api/config.md
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
# Конфигурация
|
||||
|
||||
* [config.cors](GonetsDocs/Documentation/Tech-docs/api/config/cors.md)
|
||||
* [config.init_config](GonetsDocs/Documentation/Tech-docs/api/config/init_config.md)
|
||||
* [config.ports](GonetsDocs/Documentation/Tech-docs/api/config/ports.md)
|
||||
27
Documentation/Tech-docs/api/config/cors.md
Normal file
27
Documentation/Tech-docs/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
|
||||
1
Documentation/Tech-docs/api/config/init_config.md
Normal file
1
Documentation/Tech-docs/api/config/init_config.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
# config.init_config
|
||||
28
Documentation/Tech-docs/api/config/ports.md
Normal file
28
Documentation/Tech-docs/api/config/ports.md
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
# config.ports
|
||||
|
||||
### *class* config.ports.PortConfig(custom_ports: Dict[int, str] = None)
|
||||
|
||||
Bases: `object`
|
||||
|
||||
Конфигурация известных портов для сетевого анализа.
|
||||
|
||||
Назначение:
|
||||
: Предоставляет сопоставление распространённых портов с человекочитаемыми
|
||||
названиями сервисов для отображения в UI и логах. Поддерживает расширение
|
||||
пользовательским словарём.
|
||||
|
||||
#### get_port_name(port: int) → str
|
||||
|
||||
Возвращает название сервиса для указанного порта.
|
||||
|
||||
* **Parameters:**
|
||||
**port** – Номер порта.
|
||||
* **Returns:**
|
||||
Название сервиса или строка вида ‘Port-<port>’.
|
||||
|
||||
#### get_ports() → List[int]
|
||||
|
||||
Возвращает список всех номеров портов.
|
||||
|
||||
* **Returns:**
|
||||
Список номеров портов.
|
||||
3
Documentation/Tech-docs/api/core.md
Normal file
3
Documentation/Tech-docs/api/core.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
# Core
|
||||
|
||||
* [core.cli_executor](GonetsDocs/Documentation/Tech-docs/api/core/cli_executor.md)
|
||||
22
Documentation/Tech-docs/api/core/cli_executor.md
Normal file
22
Documentation/Tech-docs/api/core/cli_executor.md
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
# core.cli_executor
|
||||
|
||||
### *class* core.cli_executor.CLIExecutor
|
||||
|
||||
Bases: `object`
|
||||
|
||||
Утилита для безопасного выполнения CLI‑команд.
|
||||
|
||||
Назначение:
|
||||
: Инкапсулирует вызов subprocess.run и приводит результат к удобному
|
||||
кортежу (код возврата, stdout) без генерации исключений при ошибках.
|
||||
|
||||
#### *static* run(command: list) → Tuple[int, str]
|
||||
|
||||
Выполняет команду в системе и возвращает код и вывод.
|
||||
|
||||
* **Parameters:**
|
||||
**command** (*list*) – Список аргументов команды для выполнения.
|
||||
* **Returns:**
|
||||
Код возврата и вывод команды.
|
||||
* **Return type:**
|
||||
tuple
|
||||
9
Documentation/Tech-docs/api/endpoints.md
Normal file
9
Documentation/Tech-docs/api/endpoints.md
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
# API эндпоинты
|
||||
|
||||
* [api.v1.auth](Техническая-документация-api/api/endpoints/auth.md)
|
||||
* [api.v1.ip](GonetsDocs/Documentation/Tech-docs/api/endpoints/ip.md)
|
||||
* [api.v1.network](Техническая-документация-api/api/endpoints/network.md)
|
||||
* [api.v1.settings](GonetsDocs/Documentation/Tech-docs/api/endpoints/settings.md)
|
||||
* [api.v1.subnet](Техническая-документация-api/api/endpoints/subnet.md)
|
||||
* [api.v1.ufw](Техническая-документация-api/api/endpoints/ufw.md)
|
||||
* [api.v1.websocket](GonetsDocs/Documentation/Tech-docs/api/endpoints/websocket.md)
|
||||
90
Documentation/Tech-docs/api/endpoints/auth.md
Normal file
90
Documentation/Tech-docs/api/endpoints/auth.md
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
# api.v1.auth
|
||||
|
||||
### *async* api.v1.auth.check_users_file(translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Проверяет, существует ли файл users.json и содержит ли он пользователей.
|
||||
|
||||
Возвращает информацию о состоянии файла и наличии пользователей.
|
||||
|
||||
* **Returns:**
|
||||
Словарь с ключами:
|
||||
: - ”exists” (bool): Существует ли файл.
|
||||
- ”has_users” (bool): Содержит ли файл пользователей.
|
||||
- ”message” (str): Сообщение с описанием результата.
|
||||
* **Return type:**
|
||||
dict
|
||||
* **Raises:**
|
||||
**HTTPException** – Если произошла ошибка при проверке файла (status_code=500).
|
||||
|
||||
### *async* api.v1.auth.get_current_user(request: Request, translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Возвращает данные текущего пользователя и токен.
|
||||
|
||||
Проверяет активную сессию по client_id и возвращает информацию о пользователе
|
||||
и токен для дальнейшего использования.
|
||||
|
||||
* **Parameters:**
|
||||
* **request** (*Request*) – Объект запроса для получения client_id (IP-адрес клиента).
|
||||
* **translations** – Объект переводов для текущего языка.
|
||||
* **Returns:**
|
||||
Словарь с ключами “user” (UserResponse), “access_token” (str) и
|
||||
: ”token_type” (str, всегда “bearer”).
|
||||
* **Return type:**
|
||||
dict
|
||||
* **Raises:**
|
||||
**HTTPException** – Если сессия не найдена или истекла (status_code=401) или
|
||||
произошла внутренняя ошибка (status_code=500).
|
||||
|
||||
### *async* api.v1.auth.login(user: UserLogin, request: Request, translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Авторизует пользователя и создаёт сессию.
|
||||
|
||||
Проверяет учетные данные пользователя и возвращает токен и session_id для
|
||||
последующей авторизации.
|
||||
|
||||
* **Parameters:**
|
||||
* **user** (*UserLogin*) – Объект с данными для входа (username, password).
|
||||
* **request** (*Request*) – Объект запроса для получения client_id (IP-адрес клиента).
|
||||
* **translations** – Объект переводов для текущего языка.
|
||||
* **Returns:**
|
||||
Объект с access_token и session_id для авторизации.
|
||||
* **Return type:**
|
||||
Token
|
||||
* **Raises:**
|
||||
**HTTPException** – Если учетные данные неверны (status_code=401) или произошла
|
||||
внутренняя ошибка (status_code=500).
|
||||
|
||||
### *async* api.v1.auth.logout(request: Request, translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Выход из системы, удаление сессии.
|
||||
|
||||
Удаляет активную сессию пользователя по client_id.
|
||||
|
||||
* **Parameters:**
|
||||
* **request** (*Request*) – Объект запроса для получения client_id (IP-адрес клиента).
|
||||
* **translations** – Объект переводов для текущего языка.
|
||||
* **Returns:**
|
||||
Пустой словарь или сообщение об успешном выходе.
|
||||
* **Return type:**
|
||||
dict
|
||||
* **Raises:**
|
||||
**HTTPException** – Если сессия не найдена (status_code=401) или произошла
|
||||
внутренняя ошибка (status_code=500).
|
||||
|
||||
### *async* api.v1.auth.register(user: UserCreate, translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Регистрирует нового пользователя.
|
||||
|
||||
Создаёт нового пользователя на основе предоставленных данных и возвращает
|
||||
информацию о зарегистрированном пользователе.
|
||||
|
||||
* **Parameters:**
|
||||
* **user** (*UserCreate*) – Объект с данными нового пользователя (username, password, is_admin).
|
||||
* **translations** – Объект переводов для текущего языка.
|
||||
* **Returns:**
|
||||
Объект с данными зарегистрированного пользователя (id, username, is_admin).
|
||||
* **Return type:**
|
||||
UserResponse
|
||||
* **Raises:**
|
||||
**HTTPException** – Если пользователь уже существует (status_code=400) или произошла
|
||||
внутренняя ошибка (status_code=500).
|
||||
63
Documentation/Tech-docs/api/endpoints/ip.md
Normal file
63
Documentation/Tech-docs/api/endpoints/ip.md
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
# api.v1.ip
|
||||
|
||||
### *async* api.v1.ip.apply_ip_config(data: Dict[str, Any] = Body(PydanticUndefined), translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Применяет проверенные IP-настройки к указанному сетевому профилю.
|
||||
|
||||
Обновляет настройки соединения через NetworkManager, отключает и
|
||||
переподключает устройство к сети.
|
||||
|
||||
* **Parameters:**
|
||||
* **data** (*Dict* *[**str* *,* *Any* *]*) – Словарь с данными конфигурации, включая
|
||||
“connection_id” и “ipv4_updates” с обновлениями IP-настроек.
|
||||
* **translations** – Объект переводов для текущего языка.
|
||||
* **Returns:**
|
||||
Словарь с ключами:
|
||||
: - ”success” (bool): Успешность операции.
|
||||
- ”message” (str): Сообщение об успешном применении настроек.
|
||||
* **Return type:**
|
||||
dict
|
||||
* **Raises:**
|
||||
**HTTPException** – Если подключение не найдено (status_code=404) или
|
||||
произошла внутренняя ошибка (status_code=500).
|
||||
|
||||
### *async* api.v1.ip.check_ip_config(data: Dict[str, Any] = Body(PydanticUndefined), translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Проверяет доступность IP-адреса перед его применением.
|
||||
|
||||
Выполняет ARP-сканирование для проверки, занят ли указанный IP-адрес,
|
||||
и возвращает результат проверки.
|
||||
|
||||
* **Parameters:**
|
||||
* **data** (*Dict* *[**str* *,* *Any* *]*) – Словарь с данными конфигурации, включая
|
||||
“ipv4_updates” с полем “ipv4.address-data” для нового IP-адреса.
|
||||
* **translations** – Объект переводов для текущего языка.
|
||||
* **Returns:**
|
||||
Словарь с ключами:
|
||||
: - ”available” (bool): Доступен ли IP-адрес.
|
||||
- ”message” (str): Сообщение о результате проверки.
|
||||
* **Return type:**
|
||||
Dict[str, Any]
|
||||
* **Raises:**
|
||||
**HTTPException** – Если произошла внутренняя ошибка (status_code=500).
|
||||
|
||||
### *async* api.v1.ip.save_ip_config(data: Dict[str, Any] = Body(PydanticUndefined), translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Применяет проверенные IP-настройки для отката сетевого профиля.
|
||||
|
||||
Используется для сохранения и отката настроек сетевого профиля к предыдущему
|
||||
состоянию через NetworkManager.
|
||||
|
||||
* **Parameters:**
|
||||
* **data** (*Dict* *[**str* *,* *Any* *]*) – Словарь с данными конфигурации, включая
|
||||
“connection_id” и “ipv4_updates” с обновлениями IP-настроек.
|
||||
* **translations** – Объект переводов для текущего языка.
|
||||
* **Returns:**
|
||||
Словарь с ключами:
|
||||
: - ”success” (bool): Успешность операции.
|
||||
- ”message” (str): Сообщение об успешном применении настроек.
|
||||
* **Return type:**
|
||||
dict
|
||||
* **Raises:**
|
||||
**HTTPException** – Если подключение не найдено (status_code=404) или
|
||||
произошла внутренняя ошибка (status_code=500).
|
||||
93
Documentation/Tech-docs/api/endpoints/network.md
Normal file
93
Documentation/Tech-docs/api/endpoints/network.md
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
# api.v1.network
|
||||
|
||||
### *class* api.v1.network.ContainerPositionManager
|
||||
|
||||
Bases: `object`
|
||||
|
||||
Класс для управления позициями и состоянием контейнеров.
|
||||
|
||||
Хранит и обновляет координаты (x, y) и состояние (isOpen) для контейнеров
|
||||
активации и деактивации.
|
||||
|
||||
#### get_position_and_state(container_name: str, translations: Translations = Depends(translations_dependency)) → Tuple[int, int, bool]
|
||||
|
||||
Получает текущие координаты и состояние указанного контейнера.
|
||||
|
||||
* **Parameters:**
|
||||
* **container_name** (*str*) – Имя контейнера (“activation” или “deactivation”).
|
||||
* **translations** – Объект переводов для текущего языка.
|
||||
* **Returns:**
|
||||
Кортеж с координатами (x, y) и состоянием (isOpen).
|
||||
* **Return type:**
|
||||
Tuple[int, int, bool]
|
||||
* **Raises:**
|
||||
**ValueError** – Если указан неверный идентификатор контейнера.
|
||||
|
||||
#### update_position(container_id: int, x: int, y: int, isOpen: bool) → None
|
||||
|
||||
Обновляет позицию и состояние контейнера по его идентификатору.
|
||||
|
||||
* **Parameters:**
|
||||
* **container_id** (*int*) – Идентификатор контейнера (1 для “activation”, 2 для “deactivation”).
|
||||
* **x** (*int*) – Новая координата X.
|
||||
* **y** (*int*) – Новая координата Y.
|
||||
* **isOpen** (*bool*) – Новое состояние контейнера (открыт/закрыт).
|
||||
* **Raises:**
|
||||
**ValueError** – Если container_id не соответствует ни одному контейнеру.
|
||||
|
||||
### *async* api.v1.network.get_hostname(translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Возвращает имя хоста системы.
|
||||
|
||||
Выполняет запрос к сервису для получения имени хоста.
|
||||
|
||||
* **Parameters:**
|
||||
**translations** – Объект переводов для текущего языка.
|
||||
* **Returns:**
|
||||
Словарь с ключом “hostname” и значением имени хоста.
|
||||
* **Return type:**
|
||||
dict
|
||||
* **Raises:**
|
||||
**HTTPException** – Если произошла ошибка при получении имени хоста (status_code=500).
|
||||
|
||||
### *async* api.v1.network.get_network_data(translations: Translations = Depends(translations_dependency)) → Dict[str, Dict]
|
||||
|
||||
Возвращает текущие сетевые данные в виде словаря.
|
||||
|
||||
Получает данные о сетевых интерфейсах, разделяет их на активные и неактивные,
|
||||
и возвращает их в формате Activation и Deactivation с учётом позиций и состояний
|
||||
контейнеров.
|
||||
|
||||
* **Parameters:**
|
||||
**translations** – Объект переводов для текущего языка.
|
||||
* **Returns:**
|
||||
Словарь с ключами “activation” и “deactivation”, содержащими
|
||||
: данные о соответствующих контейнерах.
|
||||
* **Return type:**
|
||||
Dict[str, Dict]
|
||||
* **Raises:**
|
||||
**HTTPException** – Если произошла ошибка при получении данных (status_code=500).
|
||||
|
||||
### *async* api.v1.network.update_container_position(data: Dict[str, int | bool] = Body(PydanticUndefined), translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Обновляет позицию и состояние контейнера.
|
||||
|
||||
Принимает данные о новом положении и состоянии контейнера и обновляет их
|
||||
в менеджере позиций.
|
||||
|
||||
* **Parameters:**
|
||||
* **data** (*Dict* *[**str* *,* *Union* *[**int* *,* *bool* *]* *]*) – Словарь с ключами:
|
||||
- “container_id” (int): Идентификатор контейнера (1 или 2).
|
||||
- “container_x” (int): Новая координата X.
|
||||
- “container_y” (int): Новая координата Y.
|
||||
- “isOpen” (bool): Новое состояние контейнера (открыт/закрыт).
|
||||
* **translations** – Объект переводов для текущего языка.
|
||||
* **Returns:**
|
||||
Словарь с ключами:
|
||||
: - ”success” (bool): Успешность операции.
|
||||
- ”message” (str): Сообщение об успешном обновлении.
|
||||
* **Return type:**
|
||||
dict
|
||||
* **Raises:**
|
||||
**HTTPException** – Если отсутствуют обязательные поля (status_code=400) или
|
||||
типы данных неверны.
|
||||
104
Documentation/Tech-docs/api/endpoints/settings.md
Normal file
104
Documentation/Tech-docs/api/endpoints/settings.md
Normal file
|
|
@ -0,0 +1,104 @@
|
|||
# api.v1.settings
|
||||
|
||||
### api.v1.settings.clear_all_data(translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Очищает данные узлов подсети и точек доступа Wi-Fi в обоих файлах.
|
||||
|
||||
Удаляет все записи из devices.json и wifi.json.
|
||||
|
||||
* **Parameters:**
|
||||
**translations** – Объект переводов для текущего языка.
|
||||
* **Returns:**
|
||||
Словарь с сообщением об успешной очистке.
|
||||
* **Return type:**
|
||||
dict
|
||||
* **Raises:**
|
||||
**HTTPException** – Если произошла ошибка очистки (status_code=500).
|
||||
|
||||
### api.v1.settings.clear_subnet(subnet: str | None = None, translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Очищает данные узлов подсети, сохранённые в devices.json.
|
||||
|
||||
Удаляет все записи об узлах подсети, оставляя файл пустым.
|
||||
|
||||
* **Parameters:**
|
||||
* **subnet** (*Optional* *[**str* *]*) – Подсеть в формате CIDR (например, “10.1.1.0/24”).
|
||||
Если None, очищает все подсети.
|
||||
* **translations** – Объект переводов для текущего языка.
|
||||
* **Returns:**
|
||||
Словарь с сообщением об успешной очистке.
|
||||
* **Return type:**
|
||||
dict
|
||||
* **Raises:**
|
||||
**HTTPException** – Если произошла ошибка очистки (status_code=500).
|
||||
|
||||
### api.v1.settings.clear_wifi(translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Очищает данные точек доступа Wi-Fi, сохранённые в wifi.json.
|
||||
|
||||
Удаляет все записи о точках доступа, оставляя файл пустым.
|
||||
|
||||
* **Parameters:**
|
||||
**translations** – Объект переводов для текущего языка.
|
||||
* **Returns:**
|
||||
Словарь с сообщением об успешной очистке.
|
||||
* **Return type:**
|
||||
dict
|
||||
* **Raises:**
|
||||
**HTTPException** – Если произошла ошибка очистки (status_code=500).
|
||||
|
||||
### *async* api.v1.settings.export_devices(request: SubnetScanRequest = Body(PydanticUndefined), translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Экспортирует файл с данными устройств в формате JSON для указанной подсети.
|
||||
|
||||
* **Parameters:**
|
||||
* **request** (*SubnetScanRequest*) – Объект с полем subnet в формате CIDR.
|
||||
* **translations** – Объект переводов для текущего языка.
|
||||
* **Returns:**
|
||||
Файл <subnet>.json для скачивания.
|
||||
* **Return type:**
|
||||
FileResponse
|
||||
* **Raises:**
|
||||
**HTTPException** – Если файл не найден (status_code=404).
|
||||
|
||||
### *async* api.v1.settings.export_wifi(translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Экспортирует файл с данными устройств в формате JSON.
|
||||
|
||||
* **Parameters:**
|
||||
**translations** – Объект переводов для текущего языка.
|
||||
* **Returns:**
|
||||
Файл wifi.json для скачивания.
|
||||
* **Return type:**
|
||||
FileResponse
|
||||
* **Raises:**
|
||||
**HTTPException** – Если файл не найден (status_code=404).
|
||||
|
||||
### *async* api.v1.settings.get_system_language(request: Request, translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Выводит текущий язык, установленный в системе на основе locale.
|
||||
|
||||
Выполняет команду ‘locale’ в системе и извлекает параметры LANG
|
||||
|
||||
* **Parameters:**
|
||||
* **request** (*Request*) – Объект запроса для доступа к параметрам.
|
||||
* **translations** – Объект переводов текущего языка.
|
||||
* **Returns:**
|
||||
Словарь с текущим языком системы.
|
||||
* **Return type:**
|
||||
dict
|
||||
* **Raises:**
|
||||
**HTTPException** – Если не удалось извлечь системный язык (status_code=500).
|
||||
|
||||
### api.v1.settings.set_language(locale: str, response: Response, translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Устанавливает куку locale для смены языка пользователя.
|
||||
|
||||
* **Parameters:**
|
||||
* **locale** (*str*) – Используемый язык.
|
||||
* **response** (*Response*) – Запрос.
|
||||
* **translations** – Объект переводов текущего языка.
|
||||
* **Returns:**
|
||||
Сообщение об успешной установке языка.
|
||||
* **Return type:**
|
||||
dict
|
||||
193
Documentation/Tech-docs/api/endpoints/subnet.md
Normal file
193
Documentation/Tech-docs/api/endpoints/subnet.md
Normal file
|
|
@ -0,0 +1,193 @@
|
|||
# api.v1.subnet
|
||||
|
||||
### api.v1.subnet.add_note(mac: str, request: NoteRequest, subnet_service: SubnetService = Depends(get_subnet_service), translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Добавляет заметку для устройства по MAC-адресу.
|
||||
|
||||
Привязывает заметку к устройству, идентифицируемому по MAC-адресу.
|
||||
|
||||
* **Parameters:**
|
||||
* **mac** (*str*) – MAC-адрес устройства.
|
||||
* **request** (*NoteRequest*) – Объект с полем “note” для текста заметки.
|
||||
* **subnet_service** – Сервис сканирования подсети.
|
||||
* **translations** – Объект переводов для текущего языка.
|
||||
* **Returns:**
|
||||
Словарь с сообщением об успешном добавлении заметки.
|
||||
* **Return type:**
|
||||
dict
|
||||
* **Raises:**
|
||||
**HTTPException** – Если устройство не найдено (status_code=404), заметка уже
|
||||
существует (status_code=400), или произошла внутренняя ошибка (status_code=500).
|
||||
|
||||
### api.v1.subnet.add_wifi_note(ssid: str, request: NoteRequest, translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Добавляет заметку для сети Wi-Fi по SSID.
|
||||
|
||||
Привязывает заметку к Wi-Fi сети, идентифицируемой по SSID.
|
||||
|
||||
* **Parameters:**
|
||||
* **ssid** (*str*) – Идентификатор Wi-Fi сети.
|
||||
* **request** (*NoteRequest*) – Объект с полем “note” для текста заметки.
|
||||
* **translations** – Объект переводов для текущего языка.
|
||||
* **Returns:**
|
||||
Словарь с сообщением об успешном добавлении заметки.
|
||||
* **Return type:**
|
||||
dict
|
||||
* **Raises:**
|
||||
**HTTPException** – Если сеть не найдена (status_code=404), заметка уже
|
||||
существует (status_code=400), или произошла внутренняя ошибка (status_code=500).
|
||||
|
||||
### api.v1.subnet.connect_to_wifi(request: WifiConnectRequest, translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Подключается к Wi-Fi сети по SSID и паролю.
|
||||
|
||||
Выполняет подключение к указанной Wi-Fi сети с использованием предоставленных
|
||||
учетных данных.
|
||||
|
||||
* **Parameters:**
|
||||
* **request** (*WifiConnectRequest*) – Объект с полями “ssid” и “password”.
|
||||
* **translations** – Объект переводов для текущего языка.
|
||||
* **Returns:**
|
||||
Словарь с сообщением об успешном подключении.
|
||||
* **Return type:**
|
||||
dict
|
||||
* **Raises:**
|
||||
**HTTPException** – Если подключение не удалось (status_code=400).
|
||||
|
||||
### api.v1.subnet.delete_note(mac: str, subnet_service: SubnetService = Depends(get_subnet_service), translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Удаляет заметку для устройства по MAC-адресу.
|
||||
|
||||
Удаляет привязанную заметку для указанного устройства.
|
||||
|
||||
* **Parameters:**
|
||||
* **mac** (*str*) – MAC-адрес устройства.
|
||||
* **subnet_service** – Сервис сканирования подсети.
|
||||
* **translations** – Объект переводов для текущего языка.
|
||||
* **Returns:**
|
||||
Словарь с сообщением об успешном удалении заметки.
|
||||
* **Return type:**
|
||||
dict
|
||||
* **Raises:**
|
||||
**HTTPException** – Если устройство не найдено (status_code=404), заметка не
|
||||
существует (status_code=400), или произошла внутренняя ошибка (status_code=500).
|
||||
|
||||
### api.v1.subnet.delete_wifi_note(ssid: str, translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Удаляет заметку для сети Wi-Fi по SSID.
|
||||
|
||||
Удаляет привязанную заметку для указанной Wi-Fi сети.
|
||||
|
||||
* **Parameters:**
|
||||
* **ssid** (*str*) – Идентификатор Wi-Fi сети.
|
||||
* **translations** – Объект переводов для текущего языка.
|
||||
* **Returns:**
|
||||
Словарь с сообщением об успешном удалении заметки.
|
||||
* **Return type:**
|
||||
dict
|
||||
* **Raises:**
|
||||
**HTTPException** – Если сеть не найдена (status_code=404), заметка не
|
||||
существует (status_code=400), или произошла внутренняя ошибка (status_code=500).
|
||||
|
||||
### api.v1.subnet.disconnect_from_wifi(request: WifiDisconnectRequest, translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Отключается от Wi-Fi сети по указанному SSID.
|
||||
|
||||
Выполняет отключение от указанной Wi-Fi сети.
|
||||
|
||||
* **Parameters:**
|
||||
* **request** (*WifiDisconnectRequest*) – Объект с полем “ssid”.
|
||||
* **translations** – Объект переводов для текущего языка.
|
||||
* **Returns:**
|
||||
Словарь с сообщением об успешном отключении.
|
||||
* **Return type:**
|
||||
dict
|
||||
* **Raises:**
|
||||
**HTTPException** – Если отключение не удалось (status_code=400).
|
||||
|
||||
### api.v1.subnet.get_wifi_status(translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Проверяет статус текущего подключения к Wi-Fi.
|
||||
|
||||
Возвращает информацию о текущем состоянии подключения и SSID, если подключение активно.
|
||||
|
||||
* **Parameters:**
|
||||
**translations** – Объект переводов для текущего языка.
|
||||
* **Returns:**
|
||||
Словарь с ключами:
|
||||
: - ”status” (str): Состояние (“connected” или другое).
|
||||
- ”ssid” (str, optional): SSID текущей сети, если подключено.
|
||||
* **Return type:**
|
||||
dict
|
||||
* **Raises:**
|
||||
**HTTPException** – Если проверка статуса не удалась (status_code=400).
|
||||
|
||||
### api.v1.subnet.scan_subnet(request: SubnetScanRequest = Body(PydanticUndefined), subnet_service: SubnetService = Depends(get_subnet_service), translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Сканирует локальную подсеть и возвращает данные об устройствах.
|
||||
|
||||
Выполняет сканирование указанной подсети для обнаружения активных устройств.
|
||||
|
||||
* **Parameters:**
|
||||
* **request** (*SubnetScanRequest*) – Объект с полем subnet.
|
||||
* **subnet_service** – Сервис сканирования подсети.
|
||||
* **translations** – Объект переводов для текущего языка.
|
||||
* **Returns:**
|
||||
Объект с результатами сканирования (устройства и их данные).
|
||||
* **Return type:**
|
||||
SubnetScanResult
|
||||
* **Raises:**
|
||||
**HTTPException** – Если произошла ошибка сканирования (status_code=500).
|
||||
|
||||
### api.v1.subnet.scan_wifi(timeout: int = 30, translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Сканирует Wi-Fi точки доступа и возвращает данные о них.
|
||||
|
||||
Выполняет сканирование доступных Wi-Fi сетей с указанным таймаутом.
|
||||
|
||||
* **Parameters:**
|
||||
* **timeout** (*int* *,* *optional*) – Таймаут сканирования в секундах. По умолчанию 30.
|
||||
* **translations** – Объект переводов для текущего языка.
|
||||
* **Returns:**
|
||||
Объект с результатами сканирования (список Wi-Fi сетей).
|
||||
* **Return type:**
|
||||
WifiScanResult
|
||||
* **Raises:**
|
||||
**HTTPException** – Если произошла ошибка сканирования Wi-Fi (status_code=500).
|
||||
|
||||
### api.v1.subnet.update_note(mac: str, request: NoteRequest, subnet_service: SubnetService = Depends(get_subnet_service), translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Обновляет заметку для устройства по MAC-адресу.
|
||||
|
||||
Изменяет существующую заметку, привязанную к устройству.
|
||||
|
||||
* **Parameters:**
|
||||
* **mac** (*str*) – MAC-адрес устройства.
|
||||
* **request** (*NoteRequest*) – Объект с полем “note” для нового текста заметки.
|
||||
* **subnet_service** – Сервис сканирования подсети.
|
||||
* **translations** – Объект переводов для текущего языка.
|
||||
* **Returns:**
|
||||
Словарь с сообщением об успешном обновлении заметки.
|
||||
* **Return type:**
|
||||
dict
|
||||
* **Raises:**
|
||||
**HTTPException** – Если устройство не найдено (status_code=404), заметка не
|
||||
существует (status_code=400), или произошла внутренняя ошибка (status_code=500).
|
||||
|
||||
### api.v1.subnet.update_wifi_note(ssid: str, request: NoteRequest, translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Обновляет заметку для сети Wi-Fi по SSID.
|
||||
|
||||
Изменяет существующую заметку, привязанную к Wi-Fi сети.
|
||||
|
||||
* **Parameters:**
|
||||
* **ssid** (*str*) – Идентификатор Wi-Fi сети.
|
||||
* **request** (*NoteRequest*) – Объект с полем “note” для нового текста заметки.
|
||||
* **translations** – Объект переводов для текущего языка.
|
||||
* **Returns:**
|
||||
Словарь с сообщением об успешном обновлении заметки.
|
||||
* **Return type:**
|
||||
dict
|
||||
* **Raises:**
|
||||
**HTTPException** – Если сеть не найдена (status_code=404), заметка не
|
||||
существует (status_code=400), или произошла внутренняя ошибка (status_code=500).
|
||||
104
Documentation/Tech-docs/api/endpoints/ufw.md
Normal file
104
Documentation/Tech-docs/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).
|
||||
78
Documentation/Tech-docs/api/endpoints/websocket.md
Normal file
78
Documentation/Tech-docs/api/endpoints/websocket.md
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
# api.v1.websocket
|
||||
|
||||
### *class* api.v1.websocket.WebSocketManager
|
||||
|
||||
Bases: `object`
|
||||
|
||||
Класс для управления подключениями к WebSocket-серверу.
|
||||
|
||||
Обрабатывает подключение, отключение и трансляцию сообщений для клиентов,
|
||||
подключённых через WebSocket.
|
||||
|
||||
#### *async* broadcast(message: dict)
|
||||
|
||||
Транслирует сообщения всем подключённым клиентам.
|
||||
|
||||
Отправляет JSON-данные всем активным соединениям, обрабатывая
|
||||
отключения клиентов.
|
||||
|
||||
* **Parameters:**
|
||||
**message** (*dict*) – Сообщение для трансляции в формате JSON.
|
||||
* **Raises:**
|
||||
* **WebSocketDisconnect** – Если клиент неожиданно отключился.
|
||||
* **Exception** – Если произошла другая ошибка при отправке.
|
||||
|
||||
#### *async* connect(websocket: WebSocket)
|
||||
|
||||
Подключает клиента к WebSocket-серверу.
|
||||
|
||||
Принимает подключение и добавляет WebSocket в список активных соединений.
|
||||
|
||||
* **Parameters:**
|
||||
**websocket** (*WebSocket*) – Объект WebSocket для подключения.
|
||||
* **Raises:**
|
||||
**Exception** – Если произошла ошибка при принятии подключения.
|
||||
|
||||
#### disconnect(websocket: WebSocket)
|
||||
|
||||
Отключает клиента от WebSocket-серверу.
|
||||
|
||||
Удаляет WebSocket из списка активных соединений.
|
||||
|
||||
* **Parameters:**
|
||||
**websocket** (*WebSocket*) – Объект WebSocket для отключения.
|
||||
|
||||
### *async* api.v1.websocket.broadcast_data(translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Таск для периодической трансляции сетевых данных.
|
||||
|
||||
Выполняет сканирование сети и отправляет данные всем подключённым клиентам
|
||||
с интервалом в 2 секунды.
|
||||
|
||||
* **Parameters:**
|
||||
**translations** – Объект переводов для текущего языка.
|
||||
* **Raises:**
|
||||
**Exception** – Если произошла ошибка при получении данных или трансляции.
|
||||
|
||||
### *async* api.v1.websocket.startup_event()
|
||||
|
||||
Запуск таска для трансляции сетевых данных при старте приложения.
|
||||
|
||||
Создаёт асинхронную задачу для периодической трансляции данных.
|
||||
|
||||
* **Raises:**
|
||||
**Exception** – Если произошла ошибка при запуске таска.
|
||||
|
||||
### *async* api.v1.websocket.websocket_endpoint(websocket: WebSocket, translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Обработчик WebSocket-соединения.
|
||||
|
||||
Управляет соединением клиента, принимает данные для обновления позиций
|
||||
контейнеров и транслирует сетевые данные.
|
||||
|
||||
* **Parameters:**
|
||||
* **websocket** (*WebSocket*) – Объект WebSocket для обработки соединения.
|
||||
* **translations** – Объект переводов для текущего языка.
|
||||
* **Raises:**
|
||||
* **WebSocketDisconnect** – Если клиент отключился.
|
||||
* **Exception** – Если произошла ошибка при обработке данных.
|
||||
8
Documentation/Tech-docs/api/models.md
Normal file
8
Documentation/Tech-docs/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](GonetsDocs/Documentation/Tech-docs/api/models/request.md)
|
||||
* [models.subnet](Техническая-документация-api/api/models/subnet.md)
|
||||
* [models.ufw](Техническая-документация-api/api/models/ufw.md)
|
||||
* [models.wifi](GonetsDocs/Documentation/Tech-docs/api/models/wifi.md)
|
||||
85
Documentation/Tech-docs/api/models/auth.md
Normal file
85
Documentation/Tech-docs/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
Documentation/Tech-docs/api/models/network.md
Normal file
238
Documentation/Tech-docs/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*
|
||||
49
Documentation/Tech-docs/api/models/request.md
Normal file
49
Documentation/Tech-docs/api/models/request.md
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
# models.request
|
||||
|
||||
### *class* models.request.NoteRequest(, note: str)
|
||||
|
||||
Bases: `BaseModel`
|
||||
|
||||
Модель добавления заметки к просканированному устройству
|
||||
|
||||
Атрибуты:
|
||||
: note (str): Заметка устройства
|
||||
|
||||
#### model_config *: ClassVar[ConfigDict]* *= {}*
|
||||
|
||||
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
|
||||
|
||||
#### note *: str*
|
||||
|
||||
### *class* models.request.WifiConnectRequest(, ssid: str, password: str)
|
||||
|
||||
Bases: `BaseModel`
|
||||
|
||||
Модель для подключения к точке доступа Wi-Fi
|
||||
|
||||
Атрибуты:
|
||||
: ssid (str): Название точки доступа Wi-Fi
|
||||
password (str): Пароль точки доступа Wi-Fi
|
||||
|
||||
#### model_config *: ClassVar[ConfigDict]* *= {}*
|
||||
|
||||
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
|
||||
|
||||
#### password *: str*
|
||||
|
||||
#### ssid *: str*
|
||||
|
||||
### *class* models.request.WifiDisconnectRequest(, ssid: str)
|
||||
|
||||
Bases: `BaseModel`
|
||||
|
||||
Модель для отключения от точки доступа Wi-Fi
|
||||
|
||||
Атрибуты:
|
||||
: ssid (str): Название точки доступа Wi-Fi
|
||||
|
||||
#### model_config *: ClassVar[ConfigDict]* *= {}*
|
||||
|
||||
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
|
||||
|
||||
#### ssid *: str*
|
||||
70
Documentation/Tech-docs/api/models/subnet.md
Normal file
70
Documentation/Tech-docs/api/models/subnet.md
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
# models.subnet
|
||||
|
||||
### *class* models.subnet.Device(, ip: str, mac: str | None = None, hostname: str | None = None, vendor: str | None = None, open_ports: List[str] = [], status: str, last_seen: str | None = None, note: str | None = None)
|
||||
|
||||
Bases: `BaseModel`
|
||||
|
||||
Сканируемое устройство в подсети
|
||||
|
||||
Атрибуты:
|
||||
: ip (str): IP-адрес устройства
|
||||
mac (Optional[str]): MAC-адрес устройства
|
||||
hostname (Optional[str]): Имя хоста
|
||||
vendor (Optional[str]): Название производителя устройства (По MAC-адресу)
|
||||
open_ports (List[str]): Открытые порты устройства
|
||||
status (str): Статус устройства (онлайн/оффлайн)
|
||||
last_seen (Optional[str]): Последняя активность устройства
|
||||
note (Optional[str]): Заметка устройства
|
||||
|
||||
#### hostname *: str | None*
|
||||
|
||||
#### ip *: str*
|
||||
|
||||
#### last_seen *: str | None*
|
||||
|
||||
#### mac *: str | None*
|
||||
|
||||
#### model_config *: ClassVar[ConfigDict]* *= {}*
|
||||
|
||||
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
|
||||
|
||||
#### note *: str | None*
|
||||
|
||||
#### open_ports *: List[str]*
|
||||
|
||||
#### status *: str*
|
||||
|
||||
#### vendor *: str | None*
|
||||
|
||||
### *class* models.subnet.SubnetScanRequest(, subnet: str | None = None)
|
||||
|
||||
Bases: `BaseModel`
|
||||
|
||||
Параметры для сканирования подсети
|
||||
|
||||
Атрибуты:
|
||||
: subnet (Optional[str]): Подсеть для сканирования (например 192.168.1.0/24), опционально
|
||||
|
||||
#### model_config *: ClassVar[ConfigDict]* *= {}*
|
||||
|
||||
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
|
||||
|
||||
#### subnet *: str | None*
|
||||
|
||||
### *class* models.subnet.SubnetScanResult(, devices: List[Device] = [], error: str | None = None)
|
||||
|
||||
Bases: `BaseModel`
|
||||
|
||||
Результат сканирования устройств в подсети
|
||||
|
||||
Атрибуты:
|
||||
: devices (List[Device]): Список просканированных устройств
|
||||
error (Optional[str]): Сообщение об ошибке, если сканирование не удалось
|
||||
|
||||
#### devices *: List[Device]*
|
||||
|
||||
#### error *: str | None*
|
||||
|
||||
#### model_config *: ClassVar[ConfigDict]* *= {}*
|
||||
|
||||
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
|
||||
195
Documentation/Tech-docs/api/models/ufw.md
Normal file
195
Documentation/Tech-docs/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
Documentation/Tech-docs/api/models/wifi.md
Normal file
55
Documentation/Tech-docs/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
Documentation/Tech-docs/api/services.md
Normal file
12
Documentation/Tech-docs/api/services.md
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
# Сервисы
|
||||
|
||||
* [ARP Service](GonetsDocs/Documentation/Tech-docs/api/services/arp_service.md)
|
||||
* [Auth Service](GonetsDocs/Documentation/Tech-docs/api/services/auth_service.md)
|
||||
* [Connect Service](GonetsDocs/Documentation/Tech-docs/api/services/connect_service.md)
|
||||
* [Firewalld Service](GonetsDocs/Documentation/Tech-docs/api/services/firewalld_service.md)
|
||||
* [IP Service](GonetsDocs/Documentation/Tech-docs/api/services/ip_service.md)
|
||||
* [Network Service](GonetsDocs/Documentation/Tech-docs/api/services/network_service.md)
|
||||
* [Settings Service](GonetsDocs/Documentation/Tech-docs/api/services/settings_service.md)
|
||||
* [Subnet Service](GonetsDocs/Documentation/Tech-docs/api/services/subnet_service.md)
|
||||
* [UFW Service](GonetsDocs/Documentation/Tech-docs/api/services/ufw_service.md)
|
||||
* [Wifi Service](GonetsDocs/Documentation/Tech-docs/api/services/wifi_service.md)
|
||||
55
Documentation/Tech-docs/api/services/arp_service.md
Normal file
55
Documentation/Tech-docs/api/services/arp_service.md
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
# ARP Service
|
||||
|
||||
Сервис низкоуровневого ARP-сканирования локальной сети.
|
||||
|
||||
Назначение:
|
||||
|
||||
- Обнаружение активных узлов в пределах сетей хоста путём широковещательных ARP‑запросов от имени выбранного интерфейса.
|
||||
- Помощь сервисам более высокого уровня (например, IPService) при проверке занятости адресов перед применением конфигураций.
|
||||
|
||||
Особенности реализации:
|
||||
|
||||
- Определяет подключённые сети интерфейса через netifaces и строит CIDR для сканирования.
|
||||
- Формирует ARP‑пакеты с помощью scapy (Ether/ARP) и отправляет их с таймаутом.
|
||||
- Добавляет локальный адрес интерфейса в результирующий список клиентов.
|
||||
|
||||
Требования/ограничения:
|
||||
|
||||
- Для отправки ARP‑кадров могут потребоваться повышенные привилегии или capability на сырой сокет.
|
||||
|
||||
### *class* services.arp_service.NetworkScanner(interface=None, translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Bases: `object`
|
||||
|
||||
Инициализация сетевого сканера.
|
||||
|
||||
Предоставляет методы для сканирования сети с использованием ARP-запросов и
|
||||
вывода информации о клиентах.
|
||||
|
||||
#### print_clients(clients)
|
||||
|
||||
Выводит список адресов клиентов в формате таблицы.
|
||||
|
||||
* **Parameters:**
|
||||
**clients** (*List* *[**dict* *]*) – Список словарей с ключами “ip” и “mac”,
|
||||
представляющих клиентов.
|
||||
|
||||
Выводит IP-адреса и MAC-адреса в отсортированном по IP порядке.
|
||||
|
||||
#### scan_network(attempts=3, timeout=2)
|
||||
|
||||
Сканирует сеть для обнаружения активных клиентов.
|
||||
|
||||
* **Parameters:**
|
||||
* **attempts** (*int* *,* *optional*) – Количество попыток отправки ARP-запросов.
|
||||
По умолчанию 3.
|
||||
* **timeout** (*int* *,* *optional*) – Таймаут ожидания ответа в секундах.
|
||||
По умолчанию 2.
|
||||
* **Returns:**
|
||||
Список словарей с ключами “ip” и “mac”, представляющих
|
||||
: обнаруженных клиентов, включая локальные IP-адреса.
|
||||
* **Return type:**
|
||||
List[dict]
|
||||
|
||||
#### NOTE
|
||||
Учитывает локальные IP-адреса интерфейса и удаляет дубликаты.
|
||||
35
Documentation/Tech-docs/api/services/auth_service.md
Normal file
35
Documentation/Tech-docs/api/services/auth_service.md
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
# Auth Service
|
||||
|
||||
### *class* services.auth_service.AuthService(translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Bases: `object`
|
||||
|
||||
Сервис для регистрации, авторизации и управления сессиями
|
||||
|
||||
#### create_access_token(data: dict) → str
|
||||
|
||||
Создаёт токен
|
||||
|
||||
#### get_current_user(token: str = Depends(OAuth2PasswordBearer)) → UserResponse
|
||||
|
||||
Получает текущего пользователя по токену
|
||||
|
||||
#### get_user_by_session(client_id: str) → dict
|
||||
|
||||
Получает пользователя и токен по client_id
|
||||
|
||||
#### login(user: UserLogin, client_id: str) → dict
|
||||
|
||||
Авторизует пользователя, создаёт сессию и возвращает токен
|
||||
|
||||
#### logout(client_id: str)
|
||||
|
||||
Выполняет выход из системы, удаляя последнюю сессию для client_id
|
||||
|
||||
#### register(user: UserCreate) → UserResponse
|
||||
|
||||
Регистрирует нового пользователя
|
||||
|
||||
#### verify_token(token: str) → dict | None
|
||||
|
||||
Проверяет токен
|
||||
71
Documentation/Tech-docs/api/services/connect_service.md
Normal file
71
Documentation/Tech-docs/api/services/connect_service.md
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
# Connect Service
|
||||
|
||||
Сервис управления подключениями Wi‑Fi через nmcli.
|
||||
|
||||
Назначение:
|
||||
|
||||
- Предоставляет операции подключения/отключения к точкам доступа и проверки текущего статуса, ориентируясь на системный NetworkManager.
|
||||
|
||||
Поведение:
|
||||
|
||||
- Автоматически определяет активный Wi‑Fi‑интерфейс.
|
||||
- Валидирует наличие SSID в листинге перед подключением и интерпретирует частые ошибки nmcli (неверный пароль, отсутствующая сеть и т.п.).
|
||||
|
||||
Ограничения:
|
||||
|
||||
- Требуются права для управления сетевыми соединениями в системе.
|
||||
- В окружениях без NetworkManager команды nmcli будут недоступны.
|
||||
|
||||
### *class* services.connect_service.WifiConnectionService(translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Bases: `object`
|
||||
|
||||
Сервис для управления подключением к Wi-Fi сетям с использованием nmcli.
|
||||
|
||||
Предоставляет методы для подключения, отключения и проверки статуса Wi-Fi соединений.
|
||||
|
||||
#### connect(ssid: str, password: str) → Tuple[bool, str | None]
|
||||
|
||||
Подключается к Wi-Fi сети по SSID и паролю.
|
||||
|
||||
* **Parameters:**
|
||||
* **ssid** (*str*) – Идентификатор сети Wi-Fi.
|
||||
* **password** (*str*) – Пароль для подключения.
|
||||
* **Returns:**
|
||||
Кортеж (успех, сообщение об ошибке).
|
||||
: - Успех: (True, None).
|
||||
- Ошибка: (False, сообщение об ошибке).
|
||||
* **Return type:**
|
||||
Tuple[bool, Optional[str]]
|
||||
* **Raises:**
|
||||
* **subprocess.CalledProcessError** – Если команда nmcli завершилась с ошибкой.
|
||||
* **Exception** – Если произошла неизвестная ошибка при выполнении.
|
||||
|
||||
#### disconnect(ssid: str) → Tuple[bool, str | None]
|
||||
|
||||
Отключается от Wi-Fi сети по указанному SSID.
|
||||
|
||||
* **Parameters:**
|
||||
**ssid** (*str*) – Идентификатор сети Wi-Fi для отключения.
|
||||
* **Returns:**
|
||||
Кортеж (успех, сообщение об ошибке).
|
||||
: - Успех: (True, None или сообщение, если подключение не найдено).
|
||||
- Ошибка: (False, сообщение об ошибке).
|
||||
* **Return type:**
|
||||
Tuple[bool, Optional[str]]
|
||||
* **Raises:**
|
||||
* **subprocess.CalledProcessError** – Если команда nmcli завершилась с ошибкой.
|
||||
* **Exception** – Если произошла неизвестная ошибка при выполнении.
|
||||
|
||||
#### get_status() → Tuple[bool, str | None]
|
||||
|
||||
Проверяет статус текущего подключения к Wi-Fi.
|
||||
|
||||
* **Returns:**
|
||||
Кортеж (успех, SSID или сообщение об ошибке).
|
||||
: - Успех: (True, SSID текущей сети).
|
||||
- Ошибка или отсутствие подключения: (False, сообщение об ошибке).
|
||||
* **Return type:**
|
||||
Tuple[bool, Optional[str]]
|
||||
* **Raises:**
|
||||
**Exception** – Если произошла ошибка при выполнении команды nmcli.
|
||||
72
Documentation/Tech-docs/api/services/firewalld_service.md
Normal file
72
Documentation/Tech-docs/api/services/firewalld_service.md
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
# Firewalld Service
|
||||
|
||||
Сервис для управления firewalld через D‑Bus.
|
||||
|
||||
Назначение:
|
||||
|
||||
- Обёртка над интерфейсами org.fedoraproject.FirewallD1 для выполнения типовых операций по зонам: просмотр/изменение дефолтной зоны, добавление и удаление сервисов, портов, источников, перезагрузка конфигурации.
|
||||
|
||||
Примечания:
|
||||
|
||||
- Используется pydbus.SystemBus для доступа к системной шине.
|
||||
- Методы генерируют дружелюбные исключения при ошибках, содержащие контекст операции.
|
||||
|
||||
### *class* services.firewalld_service.FirewalldService
|
||||
|
||||
Bases: `object`
|
||||
|
||||
#### add_port(zone: str, port: int, protocol: str, timeout: int | None = 0) → None
|
||||
|
||||
Add a port to a zone.
|
||||
|
||||
#### add_service(zone: str, service: str, timeout: int | None = 0) → None
|
||||
|
||||
Add a service to a zone.
|
||||
|
||||
#### add_source(zone: str, source: str) → None
|
||||
|
||||
Add a source to a zone.
|
||||
|
||||
#### get_default_zone() → str
|
||||
|
||||
Get the default zone.
|
||||
|
||||
#### get_ports(zone: str) → List[str]
|
||||
|
||||
Get list of ports in a zone.
|
||||
|
||||
#### get_services(zone: str) → List[str]
|
||||
|
||||
Get list of services in a zone.
|
||||
|
||||
#### get_sources(zone: str) → List[str]
|
||||
|
||||
Get list of sources in a zone.
|
||||
|
||||
#### get_zone_settings(zone: str) → Dict
|
||||
|
||||
Get all settings for a zone.
|
||||
|
||||
#### get_zones() → List[str]
|
||||
|
||||
Get list of all zones.
|
||||
|
||||
#### reload() → None
|
||||
|
||||
Reload firewall rules.
|
||||
|
||||
#### remove_port(zone: str, port: int, protocol: str) → None
|
||||
|
||||
Remove a port from a zone.
|
||||
|
||||
#### remove_service(zone: str, service: str) → None
|
||||
|
||||
Remove a service from a zone.
|
||||
|
||||
#### remove_source(zone: str, source: str) → None
|
||||
|
||||
Remove a source from a zone.
|
||||
|
||||
#### set_default_zone(zone: str) → None
|
||||
|
||||
Set the default zone.
|
||||
61
Documentation/Tech-docs/api/services/ip_service.md
Normal file
61
Documentation/Tech-docs/api/services/ip_service.md
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
# IP Service
|
||||
|
||||
Сервис проверки и применения IP‑настроек через NetworkManager (D‑Bus).
|
||||
|
||||
Назначение:
|
||||
|
||||
- Перед применением конфигурации проверяет занятость IP адреса, сканируя сегмент сети средствами ARP (через NetworkScanner).
|
||||
- Применяет изменения профиля подключения через sdbus_async.networkmanager и выполняет переподключение интерфейса.
|
||||
|
||||
Требования/ограничения:
|
||||
|
||||
- Доступ к системной шине D‑Bus и права на изменения сетевых профилей.
|
||||
- Структура входных данных должна соответствовать схеме ipv4_updates для корректного обновления вложенных полей у профиля.
|
||||
|
||||
### *class* services.ip_service.IPService
|
||||
|
||||
Bases: `object`
|
||||
|
||||
Сервис проверки доступности IP-адреса и применения настроек сети.
|
||||
|
||||
Предоставляет асинхронные методы для проверки занятости IP-адреса с использованием
|
||||
ARP-сканирования и применения настроек через NetworkManager.
|
||||
|
||||
#### *async* apply_ip_config(args: Dict[str, Any], translations: Translations = Depends(translations_dependency)) → None
|
||||
|
||||
Применяет проверенные настройки IP к указанному соединению.
|
||||
|
||||
Перезапускает шину D-Bus, обновляет настройки соединения через NetworkManager,
|
||||
отключает и переподключает устройство к сети.
|
||||
|
||||
* **Parameters:**
|
||||
* **args** (*Dict* *[**str* *,* *Any* *]*) – Словарь с данными, включая:
|
||||
- “connection_id” (str): Идентификатор соединения.
|
||||
- “ipv4_updates” (Dict): Обновления настроек IPv4.
|
||||
* **translations** (*Translations*) – Объект переводов.
|
||||
* **Raises:**
|
||||
* **ValueError** – Если соединение с указанным ID не найдено.
|
||||
* **RuntimeError** – Если устройство для интерфейса не найдено.
|
||||
|
||||
#### NOTE
|
||||
Требуются права для изменения настроек через NetworkManager.
|
||||
|
||||
#### *async* check_ip_config(args: Dict[str, Any], translations: Translations = Depends(translations_dependency)) → Dict[str, Any]
|
||||
|
||||
Проверяет доступность IP-адреса перед его применением.
|
||||
|
||||
Выполняет ARP-сканирование сети для проверки, занят ли указанный IP-адрес.
|
||||
Перезапускает шину D-Bus перед выполнением.
|
||||
|
||||
* **Parameters:**
|
||||
* **args** (*Dict* *[**str* *,* *Any* *]*) – Словарь с данными, включая “ipv4_updates”
|
||||
с полем “ipv4.address-data” для нового IP-адреса.
|
||||
* **translations** (*Translations*) – Объект переводов.
|
||||
* **Returns:**
|
||||
Словарь с ключами:
|
||||
: - ”available” (bool): Доступен ли IP-адрес.
|
||||
- ”message” (str): Сообщение о результате проверки.
|
||||
* **Return type:**
|
||||
Dict[str, Any]
|
||||
* **Raises:**
|
||||
**Exception** – Если произошла ошибка при сканировании ARP.
|
||||
195
Documentation/Tech-docs/api/services/network_service.md
Normal file
195
Documentation/Tech-docs/api/services/network_service.md
Normal file
|
|
@ -0,0 +1,195 @@
|
|||
# Network Service
|
||||
|
||||
Сервис чтения сетевого состояния через NetworkManager (D‑Bus).
|
||||
|
||||
Назначение:
|
||||
|
||||
- Предоставляет асинхронные методы для сборки унифицированных моделей сетевых интерфейсов (Ethernet/Wi‑Fi), их IP‑конфигураций, а также получения имени хоста. Используется API‑слоем для визуализации и управления.
|
||||
|
||||
Особенности:
|
||||
|
||||
- Фильтрация loopback и явно неактивных интерфейсов.
|
||||
- Адаптация данных D‑Bus в pydantic‑модели (NetworkInterface, WiFiDevice, NetworkInterfacesContainer).
|
||||
|
||||
### *class* services.network_service.NetworkService(translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Bases: `object`
|
||||
|
||||
Сервис для взаимодействия с NetworkManager через D-Bus.
|
||||
|
||||
Предоставляет асинхронные методы для получения информации о сетевых интерфейсах,
|
||||
их конфигурациях IP, Wi-Fi и состояниях.
|
||||
|
||||
#### *async* get_activated_interfaces(initial_positions: Dict[str, Tuple[int, int]] = None) → List[NetworkInterface]
|
||||
|
||||
Получает список активных сетевых интерфейсов.
|
||||
|
||||
* **Parameters:**
|
||||
**initial_positions** (*Dict* *[**str* *,* *Tuple* *[**int* *,* *int* *]* *]* *,* *optional*) – Словарь начальных
|
||||
координат (x, y) для интерфейсов. По умолчанию None.
|
||||
* **Returns:**
|
||||
Список активных интерфейсов (state == “100”).
|
||||
* **Return type:**
|
||||
List[NetworkInterface]
|
||||
|
||||
#### *async* get_activated_interfaces_container(initial_positions: Dict[str, Tuple[int, int]] = None, container_x: int = 0, container_y: int = 0) → NetworkInterfacesContainer
|
||||
|
||||
Получает объект, содержащий список активных интерфейсов и координаты контейнера.
|
||||
|
||||
* **Parameters:**
|
||||
* **initial_positions** (*Dict* *[**str* *,* *Tuple* *[**int* *,* *int* *]* *]* *,* *optional*) – Словарь начальных
|
||||
координат (x, y) для интерфейсов. По умолчанию None.
|
||||
* **container_x** (*int* *,* *optional*) – Координата X контейнера. По умолчанию 0.
|
||||
* **container_y** (*int* *,* *optional*) – Координата Y контейнера. По умолчанию 0.
|
||||
* **Returns:**
|
||||
Объект с активными интерфейсами и координатами.
|
||||
* **Return type:**
|
||||
NetworkInterfacesContainer
|
||||
|
||||
#### *async* get_connection_name(device: sdbus_async.networkmanager.NetworkDeviceGeneric) → str
|
||||
|
||||
Извлекает имя соединения (GENERAL.CONNECTION) для устройства.
|
||||
|
||||
* **Parameters:**
|
||||
**device** (*NetworkDeviceGeneric*) – Объект устройства NetworkManager.
|
||||
* **Returns:**
|
||||
Имя соединения или “unknown” в случае ошибки.
|
||||
* **Return type:**
|
||||
str
|
||||
* **Raises:**
|
||||
**Exception** – Если произошла ошибка при получении настроек соединения.
|
||||
|
||||
#### *async* get_deactivated_interfaces(initial_positions: Dict[str, Tuple[int, int]] = None) → List[NetworkInterface]
|
||||
|
||||
Получает список неактивных сетевых интерфейсов.
|
||||
|
||||
* **Parameters:**
|
||||
**initial_positions** (*Dict* *[**str* *,* *Tuple* *[**int* *,* *int* *]* *]* *,* *optional*) – Словарь начальных
|
||||
координат (x, y) для интерфейсов. По умолчанию None.
|
||||
* **Returns:**
|
||||
Список интерфейсов с state != “100”.
|
||||
* **Return type:**
|
||||
List[NetworkInterface]
|
||||
|
||||
#### *async* get_deactivated_interfaces_container(initial_positions: Dict[str, Tuple[int, int]] = None, container_x: int = 0, container_y: int = 0) → NetworkInterfacesContainer
|
||||
|
||||
Получает объект, содержащий список неактивных интерфейсов и координаты контейнера.
|
||||
|
||||
* **Parameters:**
|
||||
* **initial_positions** (*Dict* *[**str* *,* *Tuple* *[**int* *,* *int* *]* *]* *,* *optional*) – Словарь начальных
|
||||
координат (x, y) для интерфейсов. По умолчанию None.
|
||||
* **container_x** (*int* *,* *optional*) – Координата X контейнера. По умолчанию 0.
|
||||
* **container_y** (*int* *,* *optional*) – Координата Y контейнера. По умолчанию 0.
|
||||
* **Returns:**
|
||||
Объект с неактивными интерфейсами и координатами.
|
||||
* **Return type:**
|
||||
NetworkInterfacesContainer
|
||||
|
||||
#### *async* get_hostname() → Dict[str, str]
|
||||
|
||||
Возвращает имя хоста из команды hostname в формате JSON.
|
||||
|
||||
* **Returns:**
|
||||
Словарь с ключом “hostname” и значением имени хоста.
|
||||
* **Return type:**
|
||||
Dict[str, str]
|
||||
* **Raises:**
|
||||
**RuntimeError** – Если произошла ошибка при выполнении команды hostname
|
||||
или обработке вывода.
|
||||
|
||||
#### *async* get_interfaces_by_state(state: str, initial_positions: Dict[str, Tuple[int, int]] = None) → List[NetworkInterface]
|
||||
|
||||
Получает список интерфейсов по указанному состоянию.
|
||||
|
||||
* **Parameters:**
|
||||
* **state** (*str*) – Состояние интерфейса (например, “100” для активных).
|
||||
* **initial_positions** (*Dict* *[**str* *,* *Tuple* *[**int* *,* *int* *]* *]* *,* *optional*) – Словарь начальных
|
||||
координат (x, y) для интерфейсов. По умолчанию None.
|
||||
* **Returns:**
|
||||
Список интерфейсов с указанным состоянием.
|
||||
* **Return type:**
|
||||
List[NetworkInterface]
|
||||
|
||||
#### *async* get_interfaces_container(state: str | None = None, initial_positions: Dict[str, Tuple[int, int]] = None, container_x: int = 0, container_y: int = 0) → NetworkInterfacesContainer
|
||||
|
||||
Получает объект, содержащий список интерфейсов и координаты контейнера.
|
||||
|
||||
* **Parameters:**
|
||||
* **state** (*Optional* *[**str* *]* *,* *optional*) – Состояние интерфейсов (например, “100”).
|
||||
По умолчанию None (все интерфейсы).
|
||||
* **initial_positions** (*Dict* *[**str* *,* *Tuple* *[**int* *,* *int* *]* *]* *,* *optional*) – Словарь начальных
|
||||
координат (x, y) для интерфейсов. По умолчанию None.
|
||||
* **container_x** (*int* *,* *optional*) – Координата X контейнера. По умолчанию 0.
|
||||
* **container_y** (*int* *,* *optional*) – Координата Y контейнера. По умолчанию 0.
|
||||
* **Returns:**
|
||||
Объект с интерфейсами и координатами контейнера.
|
||||
* **Return type:**
|
||||
NetworkInterfacesContainer
|
||||
|
||||
#### *async* get_ip_config(device: sdbus_async.networkmanager.NetworkDeviceGeneric, ip_version: str) → List[IndividualIPConfig]
|
||||
|
||||
Получает конфигурацию IP для устройства.
|
||||
|
||||
* **Parameters:**
|
||||
* **device** (*NetworkDeviceGeneric*) – Объект устройства NetworkManager.
|
||||
* **ip_version** (*str*) – Версия IP (“4” или “6”).
|
||||
* **Returns:**
|
||||
Список конфигураций IP, включая адреса и маршруты.
|
||||
* **Return type:**
|
||||
List[IndividualIPConfig]
|
||||
* **Raises:**
|
||||
**Exception** – Если произошла ошибка при получении данных IP.
|
||||
|
||||
#### *async* get_ip_method(device: sdbus_async.networkmanager.NetworkDeviceGeneric, ip_type: str) → str
|
||||
|
||||
Получает метод IP (например, “auto”, “manual”) для указанного устройства.
|
||||
|
||||
* **Parameters:**
|
||||
* **device** (*NetworkDeviceGeneric*) – Объект устройства NetworkManager.
|
||||
* **ip_type** (*str*) – Тип IP (например, “ipv4” или “ipv6”).
|
||||
* **Returns:**
|
||||
Метод IP или “unknown” в случае ошибки.
|
||||
* **Return type:**
|
||||
str
|
||||
* **Raises:**
|
||||
**Exception** – Если произошла ошибка при получении настроек соединения.
|
||||
|
||||
#### *async* get_network_interfaces(initial_positions: Dict[str, Tuple[int, int]] = None) → List[NetworkInterface | WiFiDevice]
|
||||
|
||||
Получает список сетевых интерфейсов.
|
||||
|
||||
* **Parameters:**
|
||||
**initial_positions** (*Dict* *[**str* *,* *Tuple* *[**int* *,* *int* *]* *]* *,* *optional*) – Словарь начальных
|
||||
координат (x, y) для интерфейсов. По умолчанию None (используются (100, 100)).
|
||||
* **Returns:**
|
||||
Список объектов интерфейсов,
|
||||
: включая Wi-Fi устройства.
|
||||
* **Return type:**
|
||||
List[Union[NetworkInterface, WiFiDevice]]
|
||||
|
||||
Исключает интерфейсы типа LOOPBACK и неактивные состояния (state == “10”).
|
||||
|
||||
#### *async* get_network_interfaces_container(initial_positions: Dict[str, Tuple[int, int]] | None = None) → NetworkInterfacesContainer
|
||||
|
||||
Получает контейнер с сетевыми интерфейсами и координатами контейнера.
|
||||
|
||||
* **Parameters:**
|
||||
**initial_positions** (*Optional* *[**Dict* *[**str* *,* *Tuple* *[**int* *,* *int* *]* *]* *]* *,* *optional*) – Словарь начальных координат (x, y) для интерфейсов. По умолчанию None.
|
||||
* **Returns:**
|
||||
Объект с интерфейсами и координатами (0, 0).
|
||||
* **Return type:**
|
||||
NetworkInterfacesContainer
|
||||
|
||||
#### *async* get_wifi_info(wifi_device: sdbus_async.networkmanager.NetworkDeviceWireless) → Dict[str, str | int | None]
|
||||
|
||||
Получает информацию о Wi-Fi устройстве.
|
||||
|
||||
* **Parameters:**
|
||||
**wifi_device** (*NetworkDeviceWireless*) – Объект Wi-Fi устройства NetworkManager.
|
||||
* **Returns:**
|
||||
Словарь с данными Wi-Fi (SSID, BSSID,
|
||||
: bitrate, strength, frequency, mode), где значения могут быть None.
|
||||
* **Return type:**
|
||||
Dict[str, Optional[Union[str, int]]]
|
||||
* **Raises:**
|
||||
**Exception** – Если произошла ошибка при получении данных точки доступа.
|
||||
43
Documentation/Tech-docs/api/services/settings_service.md
Normal file
43
Documentation/Tech-docs/api/services/settings_service.md
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
# Settings Service
|
||||
|
||||
### *class* services.settings_service.SettingsService(translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Bases: `object`
|
||||
|
||||
Сервис для управления настройками и очистки данных сети.
|
||||
|
||||
#### clear_all_data() → bool
|
||||
|
||||
Очищает данные узлов всех подсетей и точек доступа Wi-Fi.
|
||||
|
||||
* **Returns:**
|
||||
True, если очистка успешна.
|
||||
* **Return type:**
|
||||
bool
|
||||
* **Raises:**
|
||||
**Exception** – Если произошла ошибка при записи в один из файлов.
|
||||
|
||||
#### clear_subnet(subnet: str | None = None) → bool
|
||||
|
||||
Очищает данные узлов подсети в указанном файле или во всех файлах.
|
||||
|
||||
* **Parameters:**
|
||||
**subnet** (*Optional* *[**str* *]*) – Подсеть в формате CIDR (например, “10.1.1.0/24”).
|
||||
Если None, очищает все подсети.
|
||||
* **Returns:**
|
||||
True, если очистка успешна.
|
||||
* **Return type:**
|
||||
bool
|
||||
* **Raises:**
|
||||
**Exception** – Если произошла ошибка при записи в файл.
|
||||
|
||||
#### clear_wifi() → bool
|
||||
|
||||
Очищает данные точек доступа Wi-Fi в файле wifi.json.
|
||||
|
||||
* **Returns:**
|
||||
True, если очистка успешна.
|
||||
* **Return type:**
|
||||
bool
|
||||
* **Raises:**
|
||||
**Exception** – Если произошла ошибка при записи в файл.
|
||||
272
Documentation/Tech-docs/api/services/subnet_service.md
Normal file
272
Documentation/Tech-docs/api/services/subnet_service.md
Normal file
|
|
@ -0,0 +1,272 @@
|
|||
# Subnet Service
|
||||
|
||||
### *class* services.subnet_service.DeviceInfoCollector(translations: Translations)
|
||||
|
||||
Bases: `object`
|
||||
|
||||
Класс для сбора информации об устройствах, включая вендоров и хостнеймы.
|
||||
|
||||
Источники данных:
|
||||
: - MacLookup: сопоставление префикса MAC (OUI) с названием производителя.
|
||||
- DNS: gethostbyaddr с малым таймаутом для обратного разрешения имени.
|
||||
- NetBIOS (nbtscan): опрос сегмента сети для извлечения NetBIOS‑имён.
|
||||
|
||||
Политика кэширования:
|
||||
: - Результаты get_vendor кэшируются с помощью functools.lru_cache.
|
||||
- Результаты nbtscan аккумулируются в словарях nbtscan_cache/nbtscan_results
|
||||
на время жизни экземпляра.
|
||||
|
||||
#### get_hostname(ip: str) → str | None
|
||||
|
||||
Получает хостнейм для указанного IP-адреса.
|
||||
|
||||
Пробует сначала DNS, затем NetBIOS.
|
||||
|
||||
* **Parameters:**
|
||||
**ip** (*str*) – IP-адрес устройства.
|
||||
* **Returns:**
|
||||
Хостнейм или None, если не удалось определить.
|
||||
* **Return type:**
|
||||
Optional[str]
|
||||
|
||||
#### get_vendor(mac: str) → str
|
||||
|
||||
Получает вендора устройства по MAC-адресу.
|
||||
|
||||
Использует кэширование для повышения производительности.
|
||||
|
||||
* **Parameters:**
|
||||
**mac** (*str*) – MAC-адрес устройства.
|
||||
* **Returns:**
|
||||
Название вендора или “Неизвестный” в случае ошибки.
|
||||
* **Return type:**
|
||||
str
|
||||
|
||||
#### scan_nbtscan(subnet: str) → None
|
||||
|
||||
Сканирует подсеть с помощью nbtscan для получения хостнеймов.
|
||||
|
||||
Сохраняет результаты в кэш и логирует процесс.
|
||||
|
||||
* **Parameters:**
|
||||
**subnet** (*str*) – Подсеть в формате CIDR.
|
||||
|
||||
### *class* services.subnet_service.DeviceStorage(base_path: str = 'storage/subnets', translations: Translations = None)
|
||||
|
||||
Bases: `object`
|
||||
|
||||
Класс для хранения и управления данными об устройствах.
|
||||
|
||||
Формат файла подсети:
|
||||
|
||||
```default
|
||||
{
|
||||
"devices": [Device, ...]
|
||||
}
|
||||
```
|
||||
|
||||
Политика очистки:
|
||||
|
||||
- Метод \_clean_old_devices удаляет оффлайн‑устройства, не наблюдавшиеся более 7 дней,
|
||||
чтобы поддерживать актуальность списка.
|
||||
|
||||
#### get_subnet_file(subnet: str) → Path
|
||||
|
||||
Возвращает путь к файлу для конкретной подсети.
|
||||
|
||||
Заменяет символы ‘/’ на ‘_’ для корректного имени файла.
|
||||
|
||||
* **Parameters:**
|
||||
**subnet** (*str*) – Подсеть в формате CIDR.
|
||||
* **Returns:**
|
||||
Путь к файлу.
|
||||
* **Return type:**
|
||||
Path
|
||||
|
||||
#### load_devices(subnet: str) → Dict[str, Device]
|
||||
|
||||
Загружает устройства для указанной подсети.
|
||||
|
||||
Читает данные из JSON-файла и фильтрует устаревшие устройства.
|
||||
|
||||
* **Parameters:**
|
||||
**subnet** (*str*) – Подсеть в формате CIDR.
|
||||
* **Returns:**
|
||||
Словарь устройств с MAC как ключом.
|
||||
* **Return type:**
|
||||
Dict[str, Device]
|
||||
|
||||
#### save_devices(subnet: str, devices: List[Device]) → None
|
||||
|
||||
Сохраняет устройства для указанной подсети.
|
||||
|
||||
Записывает данные в JSON-файл.
|
||||
|
||||
* **Parameters:**
|
||||
* **subnet** (*str*) – Подсеть в формате CIDR.
|
||||
* **devices** (*List* *[**Device* *]*) – Список устройств для сохранения.
|
||||
* **Raises:**
|
||||
**Exception** – Если произошла ошибка при сохранении.
|
||||
|
||||
### *class* services.subnet_service.NetworkScanner(interface: str, translations: Translations)
|
||||
|
||||
Bases: `object`
|
||||
|
||||
Класс для сканирования подсети с использованием ARP-запросов.
|
||||
|
||||
Назначение:
|
||||
: Обнаруживает активные устройства в локальной сети, отправляя широковещательные
|
||||
ARP‑запросы по указанной подсети и собирая ответы (IP, MAC).
|
||||
|
||||
Детали реализации:
|
||||
: - Использует scapy (Ether + ARP) для генерации пакетов и srp для
|
||||
отправки/получения на канальном уровне от имени заданного интерфейса.
|
||||
- Таймаут ожидания ответа короткий (2 секунды), ориентирован на интерактивные
|
||||
сценарии UI.
|
||||
|
||||
Ограничения и замечания:
|
||||
: - Требуются права для отправки низкоуровневых пакетов (capabilities/root).
|
||||
- В сетях с фильтрацией широковещания количество обнаруженных устройств
|
||||
может быть ограничено.
|
||||
|
||||
#### scan(subnet: str) → List[Tuple[str, str]]
|
||||
|
||||
Сканирует подсеть с использованием ARP-запросов.
|
||||
|
||||
Отправляет ARP-пакеты для обнаружения активных устройств и возвращает
|
||||
список кортежей (IP, MAC).
|
||||
|
||||
* **Parameters:**
|
||||
**subnet** (*str*) – Подсеть в формате CIDR (например, “10.1.1.0/24”).
|
||||
* **Returns:**
|
||||
Список кортежей (IP-адрес, MAC-адрес) обнаруженных устройств.
|
||||
* **Return type:**
|
||||
List[Tuple[str, str]]
|
||||
* **Raises:**
|
||||
**Exception** – Если произошла ошибка сканирования.
|
||||
|
||||
### *class* services.subnet_service.PortScanner(interface: str, translations: Translations)
|
||||
|
||||
Bases: `object`
|
||||
|
||||
Класс для сканирования открытых портов на устройствах.
|
||||
|
||||
Назначение:
|
||||
: Плейсхолдер для будущего функционала активного сканирования TCP/UDP‑портов
|
||||
у обнаруженных узлов. В текущей версии возвращает пустой список.
|
||||
|
||||
План развития:
|
||||
: - Добавить неблокирующее сканирование наиболее распространённых портов
|
||||
(22, 80, 443 и т.д.) с ограничением по времени.
|
||||
- Настраиваемые профили глубины и скорости сканирования.
|
||||
|
||||
#### scan(ip: str) → List[str]
|
||||
|
||||
Сканирует открытые порты на указанном IP-адресе.
|
||||
|
||||
Пока возвращает пустой список, так как функциональность не реализована.
|
||||
|
||||
* **Parameters:**
|
||||
**ip** (*str*) – IP-адрес устройства для сканирования.
|
||||
* **Returns:**
|
||||
Список открытых портов (пока пустой).
|
||||
* **Return type:**
|
||||
List[str]
|
||||
|
||||
### *class* services.subnet_service.SubnetService(translations: Translations)
|
||||
|
||||
Bases: `object`
|
||||
|
||||
Сервис для сканирования подсетей и управления устройствами.
|
||||
|
||||
Роль сервиса:
|
||||
: Объединяет сетевое сканирование (ARP), сбор дополнительной информации
|
||||
(вендор, хостнейм), слияние с кэшем предыдущих результатов и персистентное
|
||||
хранение данных по подсетям. Предоставляет вспомогательные операции для
|
||||
локального узла и работы с заметками устройств.
|
||||
|
||||
Поток выполнения скана (scan_subnet):
|
||||
: 1. Определение подсети (вручную или авто по интерфейсу).
|
||||
2. Загрузка ранее сохранённых устройств подсети.
|
||||
3. Добавление локального устройства (если принадлежит подсети).
|
||||
4. ARP‑сканирование и параллельная обработка узлов (обогащение данных).
|
||||
5. Маркировка оффлайн‑узлов из кэша, не встреченных в текущем скане.
|
||||
6. Сортировка по IP и сохранение объединённого списка в JSON.
|
||||
|
||||
#### add_note(mac: str, note: str, translations: Translations) → Tuple[bool, Tuple[str, Dict] | None]
|
||||
|
||||
Добавляет заметку для устройства по MAC-адресу.
|
||||
|
||||
Привязывает заметку к устройству, если оно существует.
|
||||
|
||||
* **Parameters:**
|
||||
* **mac** (*str*) – MAC-адрес устройства.
|
||||
* **note** (*str*) – Текст заметки.
|
||||
* **translations** (*Translations*) – Объект переводов для текущего языка.
|
||||
* **Returns:**
|
||||
Кортеж (успех, результат),
|
||||
: где результат содержит код ошибки/успеха и данные.
|
||||
* **Return type:**
|
||||
Tuple[bool, Optional[Tuple[str, Dict]]]
|
||||
|
||||
#### delete_note(mac: str, translations: Translations) → Tuple[bool, Tuple[str, Dict] | None]
|
||||
|
||||
Удаляет заметку для устройства по MAC-адресу.
|
||||
|
||||
Удаляет привязанную заметку, если она существует.
|
||||
|
||||
* **Parameters:**
|
||||
* **mac** (*str*) – MAC-адрес устройства.
|
||||
* **translations** (*Translations*) – Объект переводов для текущего языка.
|
||||
* **Returns:**
|
||||
Кортеж (успех, результат),
|
||||
: где результат содержит код ошибки/успеха и данные.
|
||||
* **Return type:**
|
||||
Tuple[bool, Optional[Tuple[str, Dict]]]
|
||||
|
||||
#### scan_subnet(subnet: str | None = None) → SubnetScanResult
|
||||
|
||||
Сканирует указанную подсеть и возвращает результаты.
|
||||
|
||||
Выполняет ARP-сканирование, собирает информацию о устройствах и сохраняет данные.
|
||||
|
||||
* **Parameters:**
|
||||
**subnet** (*Optional* *[**str* *]*) – Подсеть в формате CIDR (например, “10.1.1.0/24”).
|
||||
Если None или пустая строка, определяется автоматически.
|
||||
* **Returns:**
|
||||
Объект с результатами сканирования, содержащий список
|
||||
: устройств или сообщение об ошибке.
|
||||
* **Return type:**
|
||||
SubnetScanResult
|
||||
* **Raises:**
|
||||
**Exception** – Если произошла ошибка сканирования.
|
||||
|
||||
#### update_note(mac: str, note: str, translations: Translations) → Tuple[bool, Tuple[str, Dict] | None]
|
||||
|
||||
Обновляет заметку для устройства по MAC-адресу.
|
||||
|
||||
Изменяет существующую заметку, если она есть.
|
||||
|
||||
* **Parameters:**
|
||||
* **mac** (*str*) – MAC-адрес устройства.
|
||||
* **note** (*str*) – Новый текст заметки.
|
||||
* **translations** (*Translations*) – Объект переводов для текущего языка.
|
||||
* **Returns:**
|
||||
Кортеж (успех, результат),
|
||||
: где результат содержит код ошибки/успеха и данные.
|
||||
* **Return type:**
|
||||
Tuple[bool, Optional[Tuple[str, Dict]]]
|
||||
|
||||
### services.subnet_service.get_subnet_service(translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Фабричная функция для создания экземпляра SubnetService.
|
||||
|
||||
Использует зависимости FastAPI для получения объекта переводов и возвращает
|
||||
экземпляр SubnetService с текущей локализацией.
|
||||
|
||||
* **Parameters:**
|
||||
**translations** (*Translations*) – Объект переводов для текущего языка.
|
||||
* **Returns:**
|
||||
Экземпляр сервиса для работы с подсетями.
|
||||
* **Return type:**
|
||||
SubnetService
|
||||
108
Documentation/Tech-docs/api/services/ufw_service.md
Normal file
108
Documentation/Tech-docs/api/services/ufw_service.md
Normal file
|
|
@ -0,0 +1,108 @@
|
|||
# UFW Service
|
||||
|
||||
### *class* services.ufw_service.UFWService
|
||||
|
||||
Bases: `object`
|
||||
|
||||
Сервис взаимодействия с UFW (Uncomplicated Firewall).
|
||||
|
||||
Назначение:
|
||||
: - Чтение статуса и списка правил брандмауэра.
|
||||
- Добавление, удаление и массовая обработка правил с поддержкой диапазонов портов,
|
||||
комментариев и выбором протоколов.
|
||||
|
||||
Детали реализации:
|
||||
: - Команды выполняются через sudo ufw …; вывод парсится в модели pydantic.
|
||||
- Для операций удаления соблюдается порядок с конца, чтобы не нарушать нумерацию.
|
||||
|
||||
#### add_rules(rules: List[UFWRule]) → dict
|
||||
|
||||
Добавляет правила UFW.
|
||||
|
||||
* **Parameters:**
|
||||
**rules** – Список правил для добавления
|
||||
* **Returns:**
|
||||
Результат добавления правил
|
||||
* **Return type:**
|
||||
dict
|
||||
|
||||
#### add_rules_base(rules: List[UFWRule], direction: str = '') → bool
|
||||
|
||||
Базовый метод для добавления правил UFW.
|
||||
|
||||
* **Parameters:**
|
||||
* **rules** – Список правил для добавления
|
||||
* **direction** – Направление трафика (“in” или “out”)
|
||||
* **Returns:**
|
||||
True если все правила были успешно добавлены, False в противном случае
|
||||
* **Return type:**
|
||||
bool
|
||||
|
||||
#### add_ufw_in_rules(rules: List[UFWRule]) → bool
|
||||
|
||||
Добавляет входящие (in) правила UFW.
|
||||
|
||||
* **Parameters:**
|
||||
**rules** (*List* *[**UFWRule* *]*) – Список правил для добавления
|
||||
* **Returns:**
|
||||
True если все правила были успешно добавлены, False в противном случае
|
||||
* **Return type:**
|
||||
bool
|
||||
|
||||
#### add_ufw_out_rules(rules: List[UFWRule]) → bool
|
||||
|
||||
Добавляет исходящие (out) правила UFW.
|
||||
|
||||
* **Parameters:**
|
||||
**rules** (*List* *[**UFWRule* *]*) – Список правил для добавления
|
||||
* **Returns:**
|
||||
True если все правила были успешно добавлены, False в противном случае
|
||||
* **Return type:**
|
||||
bool
|
||||
|
||||
#### delete_rules(rule_numbers: List[int]) → dict
|
||||
|
||||
Удаляет правила UFW по их номерам.
|
||||
|
||||
* **Parameters:**
|
||||
**rule_numbers** (*List* *[**int* *]*) – Список номеров правил для удаления
|
||||
* **Returns:**
|
||||
Результат операции удаления
|
||||
* **Return type:**
|
||||
dict
|
||||
|
||||
#### disable_ufw() → bool
|
||||
|
||||
Выключает UFW.
|
||||
|
||||
* **Returns:**
|
||||
True если успешно выключен, False в противном случае
|
||||
* **Return type:**
|
||||
bool
|
||||
|
||||
#### enable_ufw() → bool
|
||||
|
||||
Включает UFW.
|
||||
|
||||
* **Returns:**
|
||||
True если успешно включен, False в противном случае
|
||||
* **Return type:**
|
||||
bool
|
||||
|
||||
#### get_ufw_rules() → UFWRulesResponse
|
||||
|
||||
Получает список правил UFW.
|
||||
|
||||
* **Returns:**
|
||||
Объект, содержащий статус UFW и список правил
|
||||
* **Return type:**
|
||||
UFWRulesResponse
|
||||
|
||||
#### get_ufw_status() → UFWStatus
|
||||
|
||||
Проверяет статус UFW.
|
||||
|
||||
* **Returns:**
|
||||
Объект с информацией о статусе UFW
|
||||
* **Return type:**
|
||||
UFWStatus
|
||||
61
Documentation/Tech-docs/api/services/wifi_service.md
Normal file
61
Documentation/Tech-docs/api/services/wifi_service.md
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
# Wifi Service
|
||||
|
||||
### *class* services.wifi_service.WifiService(translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Bases: `object`
|
||||
|
||||
Сервис для сканирования текущих Wi‑Fi точек доступа и заметок.
|
||||
|
||||
Источники данных:
|
||||
: - pywifi для базового сканирования и получения списка AP.
|
||||
- iw dev <iface> scan для уточнения частоты, сигнала и безопасности.
|
||||
- MacLookup для определения вендора по BSSID.
|
||||
|
||||
Политики:
|
||||
: - Выбор лучшего AP по SSID по уровню сигнала.
|
||||
- Кэширование определения вендора.
|
||||
- Сохранение SSID даже без заметок для будущих операций.
|
||||
|
||||
#### add_note(ssid: str, note: str) → Tuple[bool, str | None]
|
||||
|
||||
Добавляет заметку к сети Wi-Fi по SSID.
|
||||
|
||||
#### delete_note(ssid: str) → Tuple[bool, str | None]
|
||||
|
||||
Удаляет заметку сети Wi-Fi по SSID.
|
||||
|
||||
#### get_vendor(mac: str) → str
|
||||
|
||||
Определяет вендора по MAC-адресу с использованием кэширования.
|
||||
|
||||
#### scan_wifi(timeout: int = 30) → WifiScanResult
|
||||
|
||||
Сканирует текущие Wi-Fi точки доступа.
|
||||
|
||||
#### update_note(ssid: str, note: str) → Tuple[bool, str | None]
|
||||
|
||||
Обновляет заметку сети Wi-Fi по SSID.
|
||||
|
||||
### *class* services.wifi_service.WifiStorage(storage_path: str = 'storage/wifi/wifi.json', translations: Translations = Depends(translations_dependency))
|
||||
|
||||
Bases: `object`
|
||||
|
||||
Класс для хранения данных о Wi‑Fi сетях и их заметках по SSID.
|
||||
|
||||
Формат:
|
||||
: {
|
||||
: “networks”: [{“ssid”: str, “note”: Optional[str]}]
|
||||
<br/>
|
||||
}
|
||||
|
||||
Поведение:
|
||||
: - Создаёт директорию хранения при инициализации, ведёт логирование путей.
|
||||
- Валидация структуры при чтении, безопасная запись с Unicode и отступами.
|
||||
|
||||
#### load_notes() → Dict[str, str | None]
|
||||
|
||||
Загружает заметки по SSID из файла хранения.
|
||||
|
||||
#### save_notes(notes: Dict[str, str | None]) → None
|
||||
|
||||
Сохраняет заметки по SSID в файл.
|
||||
4
Documentation/Tech-docs/api/storage.md
Normal file
4
Documentation/Tech-docs/api/storage.md
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
# Хранилища
|
||||
|
||||
* [storage.json_storage](GonetsDocs/Documentation/Tech-docs/api/storage/json_storage.md)
|
||||
* [storage.session_storage](GonetsDocs/Documentation/Tech-docs/api/storage/session_storage.md)
|
||||
75
Documentation/Tech-docs/api/storage/json_storage.md
Normal file
75
Documentation/Tech-docs/api/storage/json_storage.md
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
# storage.json_storage
|
||||
|
||||
### *class* storage.json_storage.JsonStorage(file_path: str = '/etc/gonets/users.json')
|
||||
|
||||
Bases: `object`
|
||||
|
||||
Хранилище пользователей в JSON-файле.
|
||||
|
||||
Назначение:
|
||||
: Обеспечивает простое файловое хранилище для учетных записей пользователей
|
||||
без полноценной СУБД. Подходит для встраиваемых окружений и сценариев,
|
||||
где важна минимальная зависимость от внешних сервисов.
|
||||
|
||||
Формат данных:
|
||||
: JSON‑структура вида:
|
||||
{
|
||||
<br/>
|
||||
> “users”: [
|
||||
> : {“id”: int, “username”: str, “password_hash”: str, “is_admin”: bool},
|
||||
> …
|
||||
<br/>
|
||||
> ],
|
||||
> “next_id”: int
|
||||
<br/>
|
||||
}
|
||||
|
||||
Безопасность:
|
||||
: Пароли никогда не сохраняются в открытом виде. Для хеширования используется
|
||||
passlib.context.CryptContext со схемой bcrypt. Файл создаётся с правами
|
||||
доступа 0o600 (только владелец).
|
||||
|
||||
Ограничения и замечания:
|
||||
: - Отсутствует конкурентный доступ/блокировки файла — при использовании в
|
||||
многопроцессной среде может потребоваться внешняя синхронизация.
|
||||
- Имя файла и каталог по умолчанию /etc/gonets/users.json предполагают
|
||||
наличие прав на запись и предварительную подготовку окружения.
|
||||
|
||||
#### create_user(user: UserCreate) → UserResponse
|
||||
|
||||
Создаёт нового пользователя с хешированием пароля.
|
||||
|
||||
* **Parameters:**
|
||||
**user** (*UserCreate*) – Объект с данными нового пользователя (username, password, is_admin).
|
||||
* **Returns:**
|
||||
Объект с данными созданного пользователя (id, username, is_admin).
|
||||
* **Return type:**
|
||||
UserResponse
|
||||
* **Raises:**
|
||||
* **ValueError** – Если пользователь с таким именем уже существует.
|
||||
* **Exception** – Если произошла ошибка при записи данных.
|
||||
|
||||
#### get_user_by_username(username: str) → dict | None
|
||||
|
||||
Получает данные пользователя по имени.
|
||||
|
||||
* **Parameters:**
|
||||
**username** (*str*) – Имя пользователя для поиска.
|
||||
* **Returns:**
|
||||
Словарь с данными пользователя или None, если пользователь не найден.
|
||||
* **Return type:**
|
||||
Optional[dict]
|
||||
* **Raises:**
|
||||
**Exception** – Если произошла ошибка при чтении файла.
|
||||
|
||||
#### verify_password(plain_password: str, hashed_password: str) → bool
|
||||
|
||||
Проверяет соответствие введённого пароля хэшированному.
|
||||
|
||||
* **Parameters:**
|
||||
* **plain_password** (*str*) – Введённый пользователем пароль.
|
||||
* **hashed_password** (*str*) – Хэшированный пароль из хранилища.
|
||||
* **Returns:**
|
||||
True, если пароль верен, False в противном случае.
|
||||
* **Return type:**
|
||||
bool
|
||||
95
Documentation/Tech-docs/api/storage/session_storage.md
Normal file
95
Documentation/Tech-docs/api/storage/session_storage.md
Normal file
|
|
@ -0,0 +1,95 @@
|
|||
# storage.session_storage
|
||||
|
||||
### *class* storage.session_storage.SessionStorage(file_path: str = '/etc/gonets/sessions.json')
|
||||
|
||||
Bases: `object`
|
||||
|
||||
Хранилище сессий пользователей в JSON-файле.
|
||||
|
||||
Назначение:
|
||||
: Лёгкое файловое хранилище для сессионных токенов, сопоставленных с
|
||||
client_id (например, IP клиента). Предназначено для сред без БД и
|
||||
persistent‑кэшей. Обеспечивает базовые операции и авто‑очистку протухших
|
||||
сессий.
|
||||
|
||||
Формат данных:
|
||||
: {
|
||||
: “sessions”: {
|
||||
: “<session_id>”: {
|
||||
: “username”: str,
|
||||
“token”: str,
|
||||
“client_id”: str,
|
||||
“created_at”: ISO8601 str,
|
||||
“expiry”: ISO8601 str
|
||||
<br/>
|
||||
}
|
||||
<br/>
|
||||
}
|
||||
|
||||
Политика TTL:
|
||||
: Каждая сессия действует 30 минут. При создании/чтении/удалении вызывается
|
||||
clean_expired_sessions() для удаления протухших записей.
|
||||
|
||||
Ограничения:
|
||||
: - Нет файловых блокировок: в многопроцессных конфигурациях возможны гонки.
|
||||
- Размещение по умолчанию /etc/gonets/sessions.json требует прав на запись.
|
||||
|
||||
#### clean_expired_sessions()
|
||||
|
||||
Удаляет все истекшие сессии из хранилища.
|
||||
|
||||
* **Raises:**
|
||||
**Exception** – Если произошла ошибка при чтении или записи данных.
|
||||
|
||||
#### NOTE
|
||||
Проверяет срок действия каждой сессии и удаляет те, что истекли,
|
||||
записывая обновлённые данные.
|
||||
|
||||
#### create_session(username: str, token: str, client_id: str) → str
|
||||
|
||||
Создаёт новую сессию и возвращает уникальный session_id.
|
||||
|
||||
* **Parameters:**
|
||||
* **username** (*str*) – Имя пользователя, для которого создаётся сессия.
|
||||
* **token** (*str*) – Токен аутентификации.
|
||||
* **client_id** (*str*) – Идентификатор клиента.
|
||||
* **Returns:**
|
||||
Уникальный идентификатор сессии (session_id).
|
||||
* **Return type:**
|
||||
str
|
||||
* **Raises:**
|
||||
**Exception** – Если произошла ошибка при создании или записи сессии.
|
||||
|
||||
#### NOTE
|
||||
Удаляет истекшие сессии перед созданием новой и устанавливает срок
|
||||
действия 30 минут.
|
||||
|
||||
#### delete_session(session_id: str)
|
||||
|
||||
Удаляет сессию по указанному session_id.
|
||||
|
||||
* **Parameters:**
|
||||
**session_id** (*str*) – Уникальный идентификатор сессии.
|
||||
* **Raises:**
|
||||
**Exception** – Если произошла ошибка при чтении или записи данных.
|
||||
|
||||
#### NOTE
|
||||
Очищает истекшие сессии перед удалением.
|
||||
|
||||
#### get_latest_session(client_id: str) → Dict | None
|
||||
|
||||
Получает последнюю активную сессию для указанного client_id.
|
||||
|
||||
* **Parameters:**
|
||||
**client_id** (*str*) – Идентификатор клиента.
|
||||
* **Returns:**
|
||||
Словарь с данными последней активной сессии, включая
|
||||
: ”session_id”, или None, если сессия не найдена.
|
||||
* **Return type:**
|
||||
Optional[Dict]
|
||||
* **Raises:**
|
||||
**Exception** – Если произошла ошибка при чтении или обработке данных.
|
||||
|
||||
#### NOTE
|
||||
Очищает истекшие сессии перед поиском и возвращает сессию с самым
|
||||
поздним временем создания.
|
||||
3
Documentation/Tech-docs/api/utils.md
Normal file
3
Documentation/Tech-docs/api/utils.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
# Утилиты
|
||||
|
||||
* [utils.i18n](GonetsDocs/Documentation/Tech-docs/api/utils/i18n.md)
|
||||
23
Documentation/Tech-docs/api/utils/i18n.md
Normal file
23
Documentation/Tech-docs/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
Documentation/Tech-docs/index.md
Normal file
45
Documentation/Tech-docs/index.md
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
# GONETS SRV Documentation
|
||||
|
||||
Добро пожаловать в документацию серверной части GONETS (SRV).
|
||||
|
||||
## Содержание
|
||||
|
||||
## Разделы
|
||||
|
||||
* [Сервисы](GonetsDocs/Documentation/Tech-docs/api/services.md)
|
||||
* [ARP Service](GonetsDocs/Documentation/Tech-docs/api/services/arp_service.md)
|
||||
* [Auth Service](GonetsDocs/Documentation/Tech-docs/api/services/auth_service.md)
|
||||
* [Connect Service](GonetsDocs/Documentation/Tech-docs/api/services/connect_service.md)
|
||||
* [Firewalld Service](GonetsDocs/Documentation/Tech-docs/api/services/firewalld_service.md)
|
||||
* [IP Service](GonetsDocs/Documentation/Tech-docs/api/services/ip_service.md)
|
||||
* [Network Service](GonetsDocs/Documentation/Tech-docs/api/services/network_service.md)
|
||||
* [Settings Service](GonetsDocs/Documentation/Tech-docs/api/services/settings_service.md)
|
||||
* [Subnet Service](GonetsDocs/Documentation/Tech-docs/api/services/subnet_service.md)
|
||||
* [UFW Service](GonetsDocs/Documentation/Tech-docs/api/services/ufw_service.md)
|
||||
* [Wifi Service](GonetsDocs/Documentation/Tech-docs/api/services/wifi_service.md)
|
||||
* [Модели](GonetsDocs/Documentation/Tech-docs/api/models.md)
|
||||
* [models.auth](Техническая-документация-api/api/models/auth.md)
|
||||
* [models.network](Техническая-документация-api/api/models/network.md)
|
||||
* [models.request](GonetsDocs/Documentation/Tech-docs/api/models/request.md)
|
||||
* [models.subnet](Техническая-документация-api/api/models/subnet.md)
|
||||
* [models.ufw](Техническая-документация-api/api/models/ufw.md)
|
||||
* [models.wifi](GonetsDocs/Documentation/Tech-docs/api/models/wifi.md)
|
||||
* [API эндпоинты](GonetsDocs/Documentation/Tech-docs/api/endpoints.md)
|
||||
* [api.v1.auth](Техническая-документация-api/api/endpoints/auth.md)
|
||||
* [api.v1.ip](GonetsDocs/Documentation/Tech-docs/api/endpoints/ip.md)
|
||||
* [api.v1.network](Техническая-документация-api/api/endpoints/network.md)
|
||||
* [api.v1.settings](GonetsDocs/Documentation/Tech-docs/api/endpoints/settings.md)
|
||||
* [api.v1.subnet](Техническая-документация-api/api/endpoints/subnet.md)
|
||||
* [api.v1.ufw](Техническая-документация-api/api/endpoints/ufw.md)
|
||||
* [api.v1.websocket](GonetsDocs/Documentation/Tech-docs/api/endpoints/websocket.md)
|
||||
* [Конфигурация](GonetsDocs/Documentation/Tech-docs/api/config.md)
|
||||
* [config.cors](GonetsDocs/Documentation/Tech-docs/api/config/cors.md)
|
||||
* [config.init_config](GonetsDocs/Documentation/Tech-docs/api/config/init_config.md)
|
||||
* [config.ports](GonetsDocs/Documentation/Tech-docs/api/config/ports.md)
|
||||
* [Core](GonetsDocs/Documentation/Tech-docs/api/core.md)
|
||||
* [core.cli_executor](GonetsDocs/Documentation/Tech-docs/api/core/cli_executor.md)
|
||||
* [Хранилища](GonetsDocs/Documentation/Tech-docs/api/storage.md)
|
||||
* [storage.json_storage](GonetsDocs/Documentation/Tech-docs/api/storage/json_storage.md)
|
||||
* [storage.session_storage](GonetsDocs/Documentation/Tech-docs/api/storage/session_storage.md)
|
||||
* [Утилиты](GonetsDocs/Documentation/Tech-docs/api/utils.md)
|
||||
* [utils.i18n](GonetsDocs/Documentation/Tech-docs/api/utils/i18n.md)
|
||||
5
Documentation/ГоNets итог.md
Normal file
5
Documentation/ГоNets итог.md
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
# ГоNets итог
|
||||
|
||||

|
||||
|
||||
|
||||
58
Documentation/Инструкция по запуску и сборке клиента.md
Normal file
58
Documentation/Инструкция по запуску и сборке клиента.md
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
# Инструкция по запуску и сборке клиента
|
||||
|
||||
### Общие сведения.
|
||||
|
||||
Клиент приложения ГоNets написан на языке Typescript с использованием фреймворка React. Для более понятного отображения информации была выбрана библиотека ReatFlow, позволяющая легко и просто выстраивать различные графы, схемы, блоки и их связи. Так же, для того, чтобы приложение запускалось как десктопное был выбран метод обёртки собранной (build) версии в облочку Electron.
|
||||
|
||||
### Зависимости клиентской части
|
||||
|
||||
Далее будет представлен список необходимых npm зависимостей для разработки приложения. Уточню, что необходимы они исключительно во время разработки и сборки, собранная версия работает спокойно без них.
|
||||
|
||||
Зависимости при разработки:
|
||||
|
||||
```
|
||||
"dependencies": {
|
||||
"@iconify/icons-ic": "^1.2.13",
|
||||
"@iconify/react": "^5.2.0",
|
||||
"@reduxjs/toolkit": "^2.6.0",
|
||||
"@xyflow/react": "^12.3.5",
|
||||
"axios": "^1.7.9",
|
||||
"react": "^18.3.1",
|
||||
"react-dom": "^18.3.1",
|
||||
"react-flow-renderer": "^10.3.17",
|
||||
"react-redux": "^9.2.0",
|
||||
"react-router-dom": "^7.0.2",
|
||||
"styled-components": "^6.1.13",
|
||||
"zustand": "^5.0.3"
|
||||
},
|
||||
|
||||
"devDependencies": {
|
||||
"@iconify-json/ic": "^1.2.2",
|
||||
"@types/react": "^18.0.28",
|
||||
"@types/react-dom": "^18.0.11",
|
||||
"@vitejs/plugin-basic-ssl": "^2.0.0",
|
||||
"@vitejs/plugin-react": "^4.4.1",
|
||||
"electron": "^34.0.2",
|
||||
"electron-packager": "^17.1.2",
|
||||
"esbuild-wasm": "^0.17.12",
|
||||
"typescript": "^4.9.5",
|
||||
"vite": "^6.3.4"
|
||||
}
|
||||
```
|
||||
|
||||
### Запуск и сборка
|
||||
|
||||
Для того, чтобы работать с исходным кодом, необходимо склонировать проект с ветки frontend, перейти в директорию `FRONT/DEV/` и выполнить установку зависимостей с помощью `npm install`, возможно потребуется сделать после этого `npm audit --fix` Весь исходный код, находится непосредственно в директории `DEV`, собранная же версия в директории `BUILD`.
|
||||
|
||||
Для сборки приложения и обёртки его в электрон необходимо выполнить команду `npm run package`, далее перейти в созданную после команды директорию `dist`, от туда в `gonets-for-linux-64x/resources/app`, здесь нужно выполнить `npm run build`, в появившейся директории `dist` отредактировать файл `index.html`, таким образом, что везде где стоит `/assets` нужно прописать `./assets`. Проверить запуск приложения, можно прописав в терминале `./gonets` из директории `FRONT/DEV/dist/gonets-for-linux-64x`, где и лежит исполняемвый файл.
|
||||
|
||||
После удачного билда можно переместить всё содержимое `FRONT/DEV/dist/gonets-for-linux-64x/` в `/FRONT/BUILD`
|
||||
|
||||
Дополнительно отмечу, что входной точкой/файлом настройки самого электрона является файл `main.js`
|
||||
|
||||
### Замечания для разработки
|
||||
|
||||
- В dev режиме можно менять https запросы и wss подключение на http и ws соответственно. Меняется это в файлах:
|
||||
- /FRONT/DEV/src/api/request.ts - Здесь основные http запросы
|
||||
- /FRONT/DEV/src/components/workSpace/workModule/networkInterfaces.tsx - Здесь главное WebSocket подключение
|
||||
- Стоит убедиться, что сервер работает в соответствующем режиме (HTTP или HTTPS), чтобы избежать ошибок подключения
|
||||
199
Documentation/Инструкция по пользованию.md
Normal file
199
Documentation/Инструкция по пользованию.md
Normal file
|
|
@ -0,0 +1,199 @@
|
|||
# Инструкция по пользованию
|
||||
|
||||
## Описание
|
||||
|
||||
**GoNets** — это приложение для удобного и эффективного управления сетями в Linux с интуитивно понятным графическим интерфейсом. Оно помогает пользователям работать с сетевыми интерфейсами и узлами через визуальные блоки, что упрощает настройку и управление сетью без необходимости использования множества команд в терминале.
|
||||
|
||||
### Основные компоненты приложения:
|
||||
|
||||
- **Клиентская часть**: веб-приложение, использующее современные подходы веб-разработки для отображения сетевых интерфейсов и их связей в виде узлов и соединений. Приложение обёрнуто в Electron, что позволяет запускать приложение как десктопное.
|
||||
- **Серверная часть**: сервис на Python, который взаимодействует с операционной системой через D-Bus и передает данные клиенту через WebSocket.
|
||||
|
||||
## Установка
|
||||
|
||||
1. **Скачивание и установка**:
|
||||
Скачайте DEB-пакет GoNets и установите его на вашу систему Linux. Установка автоматически запустит серверную часть как системный сервис на адресе https://localhost:8001.
|
||||
2. **Запуск клиента**:
|
||||
Запустите клиентскую часть через Electron, которая подключится к серверу и начнёт отображать сетевые интерфейсы.
|
||||
|
||||
## Первы запуск приложения
|
||||
|
||||
### 1\. Настройка пароля администратора
|
||||
|
||||
При первом запуске необходимо создать пароль администратора. Он будет использоваться для доступа к функциям с повышенными правами (например, изменение IP-адресов).
|
||||
|
||||
В окне создания пароля доступны также:
|
||||
|
||||
- Переключение темы интерфейса.
|
||||
- Переход на страницу «О приложении».
|
||||
- Кнопка возврата на корневой узел (если происходит регистрация подключённого узла).
|
||||
|
||||
**Что такое узел?**
|
||||
В контексте GoNets **узел** — это отдельное, подключённое к общей сети и управляемый через приложение. Узел может быть **корневым** (локальный компьютер, с которого запущено приложение) или **подключённым** (удалённая система, подключённая к корневому узлу).
|
||||
|
||||
**Особенности пароля:**
|
||||
|
||||
- У каждого узла (корневого или подключённого) — свой уникальный пароль администратора.
|
||||
- Пример для корневого узла: `securePass2025`
|
||||
- Пример для подключённого узла: \`adminNet123
|
||||
- Если на подключённом узле пароль ещё не задан, система предложит создать его при первом подключении.
|
||||
|
||||
## Интерфейс и работа с приложением
|
||||
|
||||
### 1\. Рабочее пространство
|
||||
|
||||
После успешной настройки пароля открывается стартовое приветственное окно, из которого осуществляется переход к основным модулям приложения. В текущей версии доступен один модуль — **Настройки сети**.
|
||||
|
||||
Рабочее пространство включает два постоянных элемента:
|
||||
|
||||
- **Боковая панель** — основной элемент навигации, доступен во всех разделах приложения.
|
||||
- **Рабочая область** — в ней отображаются модули и интерфейсы, связанные с выбранным разделом.
|
||||
|
||||
#### 1.1 Боковая панель
|
||||
|
||||
Боковая панель размещена слева и предоставляет быстрый доступ к следующим функциям:
|
||||
|
||||
- **Управление узлами** — кнопка с иконкой _Монитора_, открывает меню управления устройствами.
|
||||
- **Смена темы оформления** — переключение между светлой, тёмной и системной темой.
|
||||
- **Профиль пользователя** — отображает текущий уровень доступа (пользователь / администратор) с возможностью смены.
|
||||
- **О программе** — отображает информацию о версии и дате выпуска.
|
||||
|
||||
##### 1.2 Настройки сети
|
||||
|
||||
Этот модуль представляет собой интерактивный холст, на котором в графической форме отображаются сетевые интерфейсы и их связи. Такой подход обеспечивает наглядное и удобное управление сетевой конфигурацией.
|
||||
|
||||
Элементы на холсте можно перемещать для лучшего отображения. Положение элементов будет сохраняться даже при выходе из приложения. Чтобы вернуть все элементы в исходное положение, в хэдере холста нажмите на иконку сброса. Чтобы закрыть холст, нажмите на иконку закрытия и вы попадёте обратно на приветственное окно
|
||||
|
||||
На холсте отображаются следующие элементы:
|
||||
|
||||
1. **Группы интерфейсов**
|
||||
Все сетевые интерфейсы распределяются на две группы: **активные** и **неактивные**.Каждая группа оформлена в виде рамки с заголовком и кнопкой «Скрыть/Показать», позволяющей сворачивать или разворачивать список интерфейсов.
|
||||
2. **Блок сетевого интерфейса**
|
||||
Каждый интерфейс отображается в отдельном блоке, содержащем:
|
||||
- **Заголовок** — название интерфейса, его тип (например, ethernet, wifi или VPN), а также текущий статус, который представлен цветом заголовка интерфейса.
|
||||
- **Конфигурацию** — MAC-адрес и значение MTU.
|
||||
- **Блоки IP-адресов** (опционально) — один или несколько блоков с информацией о назначенных IP-адресах.
|
||||
3. **Блок IP-адреса**Каждый блок IP-адреса включает:
|
||||
- **Заголовок** — указывается метод получения адреса: `DHCP` или `Static`, а также кнопка редактирования.
|
||||
- **Параметры** — строки с IP-адресом, шлюзом и DNS-серверами.
|
||||
- При активации редактирования, строки заменяются на поля ввода. В заголовке блока при этом появляются кнопки подтверждения и отмены изменений.
|
||||
|
||||
### 2\. Управление узлами
|
||||
|
||||
Управление узлами осуществляется через **боковую панель**. Для этого нажмите на иконку _Монитора_ — откроется меню с перечнем доступных устройств.
|
||||
|
||||
В меню узлов отображаются:
|
||||
|
||||
1. **Корневой узел** — локальное устройство, на котором запущено приложение. Его имя берётся из системного `hostname`.
|
||||
2. **Список подключённых узлов** — отображаются в порядке добавления.
|
||||
3. **Кнопка добавления нового узла** — представлена в виде блока с символом "+".
|
||||
|
||||
#### 2.1 Добавление нового узла
|
||||
|
||||
При нажатии на кнопку **"+"** откроется модальное окно, в котором потребуется указать адрес подключаемого устройства.
|
||||
В текущей версии приложения поддерживается подключение только к узлам, находящимся в одной локальной сети с корневым.
|
||||
|
||||
После ввода адреса и подтверждения, приложение попытается установить соединение с выбранным узлом. Если на нём установлено приложение GoNets, соединение будет успешно установлено, и узел появится в списке. В противном случае подключение не состоится, и переключение на данный узел будет невозможно.
|
||||
|
||||
#### 2.2 Пароль администратора на узлах
|
||||
|
||||
При первом переходе на подключённый узел система проверит, задан ли на нём пароль администратора GoNets.
|
||||
Если пароль отсутствует, появится предложение создать его. Этот пароль требуется для выполнения действий с повышенными правами, таких как изменение IP-адресов или управление интерфейсами.
|
||||
|
||||
> **Важно**: проверка пароля выполняется один раз — при первом запуске GoNets на каждом устройстве. Установленный пароль сохраняется на узле и в дальнейшем используется без повторной настройки.
|
||||
|
||||
#### 2.3. Возврат к корневому узлу
|
||||
|
||||
Чтобы вернуться на корневой узел просто нажмите на него в списке узлов, он всегда будет первым.
|
||||
|
||||
### 3\. Права пользователя приложения
|
||||
|
||||
В приложении реализована двухуровневая система прав доступа:
|
||||
|
||||
- **Ограниченные права** — режим по умолчанию при входе в приложение, даже после создания пароля администратора.
|
||||
- **Администраторский доступ** — расширенные права, необходимые для изменения конфигурации сетевых параметров.
|
||||
|
||||
Даже после создания пароля администратора Пользователь попадает в приложение с ограниченными правами.
|
||||
|
||||
#### 3.1 Ограниченный режим
|
||||
|
||||
В ограниченном режиме пользователь может просматривать сетевую конфигурацию, но **не имеет доступа к редактированию IP-адресов** интерфейсов. При попытке изменить параметры IP, шлюза или DNS, будет отображено уведомление о невозможности выполнения действия без прав администратора.
|
||||
|
||||
#### 3.2 Повышение прав до администратора
|
||||
|
||||
Для получения прав администратора:
|
||||
|
||||
1. Нажмите на иконку перечёркнутого щита в **боковой панели**.
|
||||
2. В открывшемся модальном окне введите **администраторский пароль** для текущего узла.
|
||||
Важно: пароль должен соответствовать именно тому узлу, с которым Вы работаете в данный момент.
|
||||
3. После успешного ввода:
|
||||
- Появится уведомление об успешной авторизации. Оно автоматически исчезнет через 3 секунды или может быть закрыто вручную.
|
||||
- Иконка в боковой панели изменится, отображая текущий статус пользователя (администратор или ограниченный доступ).
|
||||
4.
|
||||
|
||||
#### 3.3 Возврат в ограниченный режим
|
||||
|
||||
Чтобы отключить расширенные права:
|
||||
|
||||
1. Снова нажмите на иконку доступа в боковой панели.
|
||||
2. В модальном окне нажмите кнопку **«Ограничить»**.
|
||||
3. После этого права пользователя будут понижены, и доступ к редактированию IP-адресов будет снова ограничен.
|
||||
|
||||
### 4\. Взаимодействие с IP-адресами
|
||||
|
||||
Приложение предоставляет удобный способ управления IP-адресами сетевых интерфейсов. Все изменения доступны **только при наличии административных прав доступа**.
|
||||
|
||||
#### 4.1 Переход в режим редактирования
|
||||
|
||||
Чтобы изменить параметры IP-адреса:
|
||||
|
||||
1. Убедитесь, что Вы находитесь в **режиме администратора**.
|
||||
2. Найдите нужный интерфейс в группе **активных интерфейсов**.
|
||||
3. Нажмите на кнопку с иконкой **карандаша** в заголовке блока IP-адреса.
|
||||
|
||||
После этого строки с параметрами IP-адреса преобразуются в с поля ввода для редактирования:
|
||||
|
||||
- **IP-адрес**
|
||||
- **Шлюз**
|
||||
- **DNS-серверы**
|
||||
|
||||
В заголовке блока IP-Адреса появятся две кнопки: **Подтвердить** и **Отменить изменения**.
|
||||
|
||||
#### 4.2 Требования к данным
|
||||
|
||||
Перед подтверждением убедитесь, что:
|
||||
|
||||
- Указанные IP-адрес, шлюз и DNS-серверы находятся **в одной подсети**.
|
||||
- Все поля заполнены корректно.
|
||||
|
||||
Если данные не соответствуют требованиям, появится предупреждение
|
||||
|
||||
#### 4.3 Проверка и подтверждение изменений
|
||||
|
||||
После ввода корректных данных:
|
||||
|
||||
1. Нажмите кнопку **подтверждения**.
|
||||
2. Отобразится **экран загрузки**, во время которого приложение производит сканирование локальной сети, чтобы:
|
||||
- Проверить доступность указанного IP-адреса.
|
||||
- Убедиться, что адрес **не занят другим устройством**.
|
||||
|
||||
Если IP-адрес уже используется, появится уведомление, и изменения применить не удастся, это уведомление можно будет закрыть.
|
||||
|
||||
Если адрес свободен:
|
||||
|
||||
1. Откроется **модальное окно подтверждения**, в котором отображаются:
|
||||
- **Текущие параметры** IP-адреса.
|
||||
- **Новые параметры**, введённые пользователем.
|
||||
- Здесь Вы можете либо **отменить изменения**, либо **сохранить** их.
|
||||
|
||||
> Обратите внимание: в процессе могут несколько раз отображаться **экраны загрузки** — это нормально. Сервер динамически обрабатывает изменения и проверяет доступность указанных параметров.
|
||||
|
||||
#### 4.4 Изменение адреса подключённого узла
|
||||
|
||||
Если редактирование IP-адреса выполняется **у подключённого узла**, то при успешном применении новый адрес автоматически **обновится в списке узлов** в боковой панели. Это необходимо для корректной работы приложения и исключения путаницы.
|
||||
|
||||
## Заключение
|
||||
|
||||
GoNets значительно упрощает управление сетями в Linux, предоставляя удобный графический интерфейс для работы с сетевыми интерфейсами и узлами. Вы можете легко настраивать IP-адреса, добавлять новые узлы и управлять ими, а также изменять параметры интерфейсов без необходимости использовать командную строку.
|
||||
|
||||
Для получения дополнительной информации и подробных инструкций, пожалуйста, ознакомьтесь с документацией и скриншотами, которые будут добавлены в следующей версии.
|
||||
3
Documentation/Итерация 1 WIFI SCANNER.md
Normal file
3
Documentation/Итерация 1 WIFI SCANNER.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
# Итерация 1 WIFI SCANNER
|
||||
|
||||

|
||||
212
Documentation/Общее описание кода клиентской части.md
Normal file
212
Documentation/Общее описание кода клиентской части.md
Normal file
|
|
@ -0,0 +1,212 @@
|
|||
# Общее описание кода клиентской части
|
||||
|
||||
Клиент ГоNets — это одностраничное веб-приложение, разработанное на TypeScript с использованием фреймворка React. Код организован по принципам компонентно-ориентированной архитектуры, разделён на модули и компоненты для упрощения разработки, поддержки и масштабирования. Приложение использует localStorage, библиотеку Zustand и React Context для управления состоянием, а также HTTPS и WebSocket для взаимодействия с сервером.
|
||||
|
||||
### 1\. Входная точка приложения
|
||||
|
||||
Точка входа — файл index.tsx, где инициализируется корневой компонент приложения. Здесь подключаются роутер и компонент модальных окон:
|
||||
|
||||
```tsx
|
||||
return (
|
||||
<>
|
||||
<WindowComponent isOpen={isOpen} type={modalType} data={modalData} />
|
||||
<Router />
|
||||
</>
|
||||
);
|
||||
```
|
||||
|
||||
Приложение оборачивается в провайдеры ThemeProvider и ModalProvider, которые обеспечивают глобальный доступ к темам и модальным окнам:
|
||||
|
||||
```tsx
|
||||
root.render(
|
||||
<ThemeProvider>
|
||||
<HashRouter>
|
||||
<ModalProvider>
|
||||
<MainComponent />
|
||||
</ModalProvider>
|
||||
</HashRouter>
|
||||
</ThemeProvider>
|
||||
);
|
||||
```
|
||||
|
||||
### 2\. Роутинг
|
||||
|
||||
Роутинг реализован в файле router.tsx с использованием библиотеки react-router-dom. Несмотря на одностраничную природу приложения, роутинг управляет условной загрузкой компонентов в зависимости от конфигурации:
|
||||
|
||||
```tsx
|
||||
if (configExists === null) {
|
||||
return <RouterLoader loaderText="Идёт загрузка данных" />;
|
||||
}
|
||||
if (configExists === false) {
|
||||
return <CreateUser />;
|
||||
}
|
||||
return (
|
||||
<Routes>
|
||||
<Route path="/" element={<WorkSpace />} />
|
||||
</Routes>
|
||||
);
|
||||
```
|
||||
|
||||
### 3\. Рабочее пространство
|
||||
|
||||
Рабочее пространство (workspace.tsx) — центральная часть приложения, где происходит отрисовка интерфейса и взаимодействие с пользователем. Оно включает:
|
||||
|
||||
- Боковую панель (SideBar) — отвечает за навигацию и управление.
|
||||
- Модули — динамически подключаемые компоненты, отображаемые на основе значения из localStorage.
|
||||
|
||||
Логика отображения модулей:
|
||||
|
||||
```tsx
|
||||
return (
|
||||
<Section>
|
||||
<FlowContainer>
|
||||
<SideBar />
|
||||
{workModule === workSpaceNames[1] && <HelloWindow />}
|
||||
{workModule === workSpaceNames[2] && <About from="workSpace" />}
|
||||
{workModule === workSpaceNames[4] && <About from="helloWindow" />}
|
||||
{workModule === workSpaceNames[3] && (
|
||||
<WorkSection>
|
||||
<Header />
|
||||
<ReactFlowProvider>
|
||||
<NetworkInterfaces
|
||||
key={currentWs}
|
||||
startConnection={true}
|
||||
ws={currentWs}
|
||||
/>
|
||||
</ReactFlowProvider>
|
||||
</WorkSection>
|
||||
)}
|
||||
</FlowContainer>
|
||||
</Section>
|
||||
);
|
||||
```
|
||||
|
||||
#### 3.1. Модули рабочего пространства
|
||||
|
||||
Рабочее пространство приложения построено с акцентом на модульность, что позволяет разделять функциональность на независимые компоненты. Модули делятся на два типа:
|
||||
|
||||
- Модули приложения (AppModules): Глобальные и информационные модули, отвечающие за общую функциональность и представление данных. Примеры:
|
||||
- HelloWindow — приветственное окно.
|
||||
- About — страница с информацией о приложении.
|
||||
- Рабочие модули: Узкоспециализированные модули, предназначенные для выполнения конкретных задач. На данный момент реализован один такой модуль:
|
||||
- NetworkInterfaces (networkInterfaces.tsx) — управляет сетевыми интерфейсами и визуализацией данных с помощью React Flow. (Более подробно ознакомиться можно в файле “Описание работы модуля сетевых интерфейсов“)
|
||||
|
||||
Модули хранятся в /src/componens/workSpace/workSpaceModules/
|
||||
|
||||
### 4\. Хранилища данных
|
||||
|
||||
Приложение использует localStorage для и библиотеку Zustand с React Context для управления состоянием. Zustand-хранилища синхронизируются с localStorage через persist, а некоторые хранилища управляют временным состоянием без сохранения.
|
||||
|
||||
Все хранилища располагаются в директории /src/store
|
||||
|
||||
#### 4.1. Хранилища в localStorage
|
||||
|
||||
1. currentIp-storage (строка): Хранит IP-адрес текущего хоста или "[localhost](http://localhost)". Пример: "192.168.1.147".
|
||||
2. connectedDevices-storage (массив объектов Device): Список подключённых хостов.
|
||||
|
||||
```tsx
|
||||
interface Device { number: number; address: string; }
|
||||
```
|
||||
|
||||
Пример: \[{ number: 1, address: "192.168.1.147" }\].
|
||||
3. menus-storage (массив объектов Menu): Состояние меню (открыто/закрыто, активно/неактивно).
|
||||
|
||||
```tsx
|
||||
interface Menu { id: string; isOpen: boolean; isActive?: boolean; }
|
||||
```
|
||||
|
||||
Пример: \[{ id: "menu1", isOpen: true, isActive: true }\].
|
||||
4. toolBar-storage (объект ToolBar): Состояние боковой панели и текущий активный пункт.
|
||||
|
||||
```tsx
|
||||
interface ToolSpace { id: string; isOpen: boolean; isActive?: boolean; }
|
||||
interface ToolBar { toolSpace: ToolSpace[]; current: string; }
|
||||
```
|
||||
|
||||
Пример: { toolSpace: \[{ id: "tool1", isOpen: true, isActive: true }\], current: "tool1" }.
|
||||
5. workSpace-storage (строка): Название активного модуля из /src/const/workSpace/names.ts. Пример: "networkInterfaces".
|
||||
6. theme (строка): Текущая тема приложения ("light", "dark", "system"). Пример: "dark".
|
||||
|
||||
#### 4.2. Zustand-хранилища, связанные с localStorage
|
||||
|
||||
1. useIpStore (currentIp-storage): Управляет IP-адресом хоста.
|
||||
- Методы: setIpAddress(newIp: string).
|
||||
- Пример: "[localhost](http://localhost)".
|
||||
2. useDevicesStore (connectedDevices-storage): Управляет списком устройств.
|
||||
- Методы: addDevice(address: string), deleteDevice(number: number).
|
||||
- Пример: \[{ number: 1, address: "192.168.1.147" }\].
|
||||
3. useMenuStore (menus-storage): Управляет состоянием меню.
|
||||
- Методы: toggleMenu(menuId: string).
|
||||
- Пример: \[{ id: "menu1", isOpen: true, isActive: true }\].
|
||||
4. useToolBarStore (toolBar-storage): Управляет боковой панелью.
|
||||
- Методы: toggleMenu(menuId: string), initialize().
|
||||
- Пример: { toolSpace: \[{ id: "tool1", isOpen: true }\], current: "tool1" }.
|
||||
5. useWorkSpaceStore (workSpace-storage): Хранит активный модуль.
|
||||
- Методы: setWorkModule(newModule: string), initialize().
|
||||
- Пример: "networkInterfaces".
|
||||
|
||||
#### 4.3. Zustand-хранилища (без localStorage)
|
||||
|
||||
1. useAdminStore: Управляет административными правами.
|
||||
- Тип: Булево значение (isAdmin).
|
||||
- Методы: setAdmin(isAdmin: boolean).
|
||||
- Пример: isAdmin: true.
|
||||
2. useGroupStore: Управляет группами нод в React Flow.
|
||||
- Тип: Массив объектов { id: string; click: boolean }.
|
||||
- Методы: setGroups(groups: { id: string; click: boolean }\[\]).
|
||||
- Пример: \[{ id: "group1", click: true }\].
|
||||
3. usePosStore: Хранит флаг для сброса позиций нод в React Flow.
|
||||
- Тип: Булево значение (isNullPos).
|
||||
- Методы: setNullPos(isNullPos: boolean).
|
||||
- Пример: isNullPos: false.
|
||||
4. React Контексты
|
||||
|
||||
#### 4.4. Контекст темы (ThemeProvider)
|
||||
|
||||
- Назначение: Управляет темой приложения ("light", "dark", "system") и её переключением.
|
||||
- Хранилище localStorage: theme.
|
||||
- Интерфейс:
|
||||
|
||||
```tsx
|
||||
type ThemeContextType = {
|
||||
theme: "light" | "dark" | "system";
|
||||
toggleTheme: () => void;
|
||||
};
|
||||
```
|
||||
|
||||
- Методы: toggleTheme() — переключает тему в порядке: system → light → dark.
|
||||
- Особенности:
|
||||
- По умолчанию используется "system", подстраивающаяся под prefers-color-scheme.
|
||||
- Интеграция с styled-components для стилизации через StyledTheme и GlobalStyle.
|
||||
- Тема сохраняется в localStorage для восстановления.
|
||||
- Пример: "dark".
|
||||
|
||||
Более подробно о теме можно ознакомиться в файле (Описание работы с темой)
|
||||
|
||||
#### 4.5. Контекст модальных окон (ModalProvider)
|
||||
|
||||
- Назначение: Управляет отображением модальных окон.
|
||||
- Интерфейс:
|
||||
|
||||
```tsx
|
||||
interface ModalContextType {
|
||||
isOpen: boolean;
|
||||
modalType: string;
|
||||
modalData: any;
|
||||
openModal: (modalType: string, modalData?: any) => void;
|
||||
closeModal: () => void;
|
||||
closeLoader: () => void;
|
||||
}
|
||||
```
|
||||
|
||||
- Методы:
|
||||
- openModal(modalType: string, modalData?: any) — открывает окно с указанным типом и данными.
|
||||
- closeModal() — закрывает окно с перезагрузкой страницы.
|
||||
- closeLoader() — закрывает окно без перезагрузки.
|
||||
- Особенности:
|
||||
- Оборачивает приложение в index.tsx, доступ через useModalContext.
|
||||
- Блокирует прокрутку страницы при открытии окна (overflow: hidden).
|
||||
- Типы окон определены в /src/components/modalwindows/windowsType.ts.
|
||||
- Логика отображения — в /src/components/modalwindows/modalWindow.tsx.
|
||||
- Контейнеры хранятся в /src/components/modalwindows/modalContainers.
|
||||
- Пример: openModal("loader", "загрузка данных").
|
||||
387
Documentation/Описание работы c сетевыми интерфейсами.md
Normal file
387
Documentation/Описание работы c сетевыми интерфейсами.md
Normal file
|
|
@ -0,0 +1,387 @@
|
|||
# Описание работы c сетевыми интерфейсами
|
||||
|
||||
На данный момент главным рабочим модулем приложения является модуль работы с сетевыми интерфейсами. Данный модуль позволяет отображать сетевые интерфейсы хоста в графическом виде и управлять IP адресами интерфейсов. В основе работы модуля лежит достаточно большая библиотека ReactFlow, которая позволяет строить различные графы по средством блоков и связей между ними. Далее для удобства блоки будут называться нодами (node), связи эджами (edge), а само поле ReactFlow холстом
|
||||
|
||||
### 1\. Подключение модуля в рабочее пространство
|
||||
|
||||
Работа модуля начинается с файла /src/components/workSpace/workspace.tsx, здесь в рабочее пространство приложения подключаются сами модули.
|
||||
|
||||
```
|
||||
{workModule === workSpaceNames[3] &&
|
||||
<WorkSection>
|
||||
<Header />
|
||||
<ReactFlowProvider>
|
||||
<NetworkInterfaces
|
||||
key={currentWs}
|
||||
startConnection={true}
|
||||
ws={currentWs}
|
||||
/>
|
||||
</ReactFlowProvider>
|
||||
</WorkSection>
|
||||
}
|
||||
```
|
||||
|
||||
В данном блоке этого файла подключается модуль сетевых интерфейсов в рабочее пространство. Из localstorage берётся название текущего модуля, который должен быть подключён, в этом случаи это ‘networkInterfaces‘ и по названию определяется необходимый модуль.
|
||||
|
||||
Здесь
|
||||
|
||||
<Header/> - это верхняя панель для управления холстом
|
||||
|
||||
<NetWorkInterfaces/> - Сам компонент работы с сетевыми интерфейсами, в нём пропсы key - ключ компонента, будет равен текущему ip хоста, startConnection - флаг, при передачи которого начинается работа компонента, ws - передача ip текущего хоста для создания WebSocket подключения
|
||||
|
||||
### 2\. Компонент NetworkInterfaces
|
||||
|
||||
Рассмотрение компонента логично начать с обзора его переменных состояния, которых в этом компоненте присутствует немало.
|
||||
|
||||
#### 2.1. Переменные состояния компонента NetworkInterfaces
|
||||
|
||||
1. initializationAttempt
|
||||
- Тип: React.useRef<number>
|
||||
- Описание: Счетчик попыток инициализации данных, хранящийся в useRef. Используется для отслеживания статуса начальной загрузки нод и эджей. Начальное значение — 0. После успешной инициализации устанавливается в 1. Позволяет избежать повторных попыток инициализации или перезагрузки страницы при сбоях.
|
||||
2. requestError
|
||||
- Тип: { status: boolean, message: string }
|
||||
- Описание: Состояние для отслеживания ошибок при установлении WebSocket-соединения или загрузке данных. Содержит флаг status (true, если ошибка произошла) и поле message с текстом ошибки (например, "Соединение с сервером разорвано" или "Превышено время ожидания"). Используется для отображения ошибок через модальное окно.
|
||||
3. { openModal, closeLoader }
|
||||
- Тип: Методы из useModalContext
|
||||
- Описание: Функции, полученные из контекста ModalWindowContext, для управления модальными окнами. openModal открывает модальное окно с указанным типом и параметрами (например, для отображения ошибок или уведомлений о загрузке). closeLoader закрывает экран загрузки после завершения инициализации данных.
|
||||
4. loader
|
||||
- Тип: boolean
|
||||
- Описание: Флаг, управляющий отображением экрана загрузки. Изначально установлен в true, что указывает на процесс загрузки данных. После успешной инициализации нод и эджей устанавливается в false, и экран загрузки скрывается с помощью closeLoader.
|
||||
5. socket
|
||||
- Тип: WebSocket | null
|
||||
- Описание: Состояние для хранения объекта WebSocket, используемого для связи с сервером по адресу ws://192.168.1.147:8001/api/v1. Изначально null. После успешного подключения сохраняет экземпляр WebSocket, позволяя отправлять и получать данные о сетевых интерфейсах.
|
||||
6. data
|
||||
- Тип: ResponseData\[\]
|
||||
- Описание: Массив данных, полученных через WebSocket. Содержит два элемента: данные об активных (activation) и неактивных (deactivation) сетевых интерфейсах. Используется как источник для преобразования в ноды и эджи для отображения на холсте ReactFlow.
|
||||
7. wifiData
|
||||
- Тип: ResponseNetwork | undefined
|
||||
- Описание: Состояние для хранения информации о Wi-Fi интерфейсе, извлеченной из активных данных (activation). Обновляется, если в полученных данных присутствует интерфейс с типом WIFI. Используется для специфической обработки и отображения Wi-Fi нод на холсте.
|
||||
8. hasInited
|
||||
- Тип: boolean
|
||||
- Описание: Флаг, указывающий, были ли данные (ноды и эджи) успешно инициализированы. Изначально false. Устанавливается в true после первичной обработки данных и вызова handleInit из useInitCanvas, чтобы предотвратить повторную инициализацию.
|
||||
9. { initedNodes, initedEdges, handleInit }
|
||||
- Тип: Значения и метод из useInitCanvas
|
||||
- Описание: Данные и функция из пользовательского хука useInitCanvas. initedNodes и initedEdges содержат инициализированные ноды и эджи, подготовленные для отображения на холсте. handleInit выполняет начальную обработку edgeData и interfaces для создания этих структур.
|
||||
10. interfaces
|
||||
- Тип: Interfaces\[\]
|
||||
- Описание: Состояние для хранения преобразованных данных о сетевых интерфейсах, полученных из data с помощью функции initNetworkIntData. Содержит структурированные объекты, описывающие интерфейсы, в формате, удобном для построения нод на холсте ReactFlow.
|
||||
11. edgeData
|
||||
- Тип: IEdge\[\]
|
||||
- Описание: Состояние для хранения преобразованных данных о связях (эджи) между сетевыми интерфейсами, полученных из data с помощью initNetworkIntData. Используется как промежуточный формат перед финальной инициализацией эджей для отображения.
|
||||
12. nodes
|
||||
- Тип: Массив нод для ReactFlow
|
||||
- Описание: Состояние, управляемое хуком useNodesState, для хранения и отображения нод (блоков) на холсте ReactFlow. Инициализируется пустым массивом и заполняется данными из initedNodes после обработки. Обновляется при изменении позиций, групп или Wi-Fi данных.
|
||||
13. edges
|
||||
- Тип: Массив эджей для ReactFlow
|
||||
- Описание: Состояние, управляемое хуком useEdgesState, для хранения и отображения связей (эджей) между нодами на холсте ReactFlow. Изначально пустой массив, заполняется из initedEdges после инициализации и обновляется при добавлении новых связей.
|
||||
14. isPanDisabled
|
||||
- Тип: boolean
|
||||
- Описание: Флаг, полученный из хука usePannableStore, определяющий, отключена ли возможность перемещения (прокрутки) холста ReactFlow. Если true, пользователь не может перемещать холст, что полезно для фиксации вида при определенных действиях.
|
||||
15. changeArray
|
||||
- Тип: any\[\]
|
||||
- Описание: Массив для временного хранения изменений позиций нод, полученных через processNodeChanges. Накапливает данные о перемещениях, которые затем отправляются на сервер через autosavePosition с интервалом в 1 секунду для сохранения позиций.
|
||||
16. groups
|
||||
- Тип: Данные из useGroupStore
|
||||
- Описание: Состояние, полученное из хука useGroupStore, содержащее информацию о группах сетевых интерфейсов (например, активные и неактивные). Используется для сортировки и сворачивания/разворачивания групп нод на холсте с помощью groupSort и collapseGroup.
|
||||
17. { isNullPos, setNullPos }
|
||||
- Тип: Значения и метод из usePosStore
|
||||
- Описание: Состояние и функция из хука usePosStore. isNullPos — флаг, указывающий, нужно ли сбросить позиции нод. setNullPos — метод для управления этим флагом. При активации сбрасывает позиции нод через resetPosition, отправляя запрос по WebSocket.
|
||||
|
||||
#### 2.2. Методы
|
||||
|
||||
Функции и эффекты
|
||||
|
||||
1. Первый useEffect — Подключение к WebSocket
|
||||
|
||||
```jsx
|
||||
useEffect(() => {
|
||||
if (startConnection) {
|
||||
openModal(ModalMap['2'], 'Идет загрузка данных');
|
||||
setNodes([]);
|
||||
setEdges([]);
|
||||
setHasInited(false);
|
||||
initializationAttempt.current = 0;
|
||||
const newSocket = new WebSocket(`ws://192.168.1.147:8001/api/v1`);
|
||||
let connectionTimeout;
|
||||
setSocket(newSocket);
|
||||
connectionTimeout = setTimeout(() => {
|
||||
if (newSocket.readyState !== WebSocket.OPEN) {
|
||||
newSocket.close();
|
||||
}
|
||||
}, 5000);
|
||||
newSocket.onopen = () => {
|
||||
console.log('WebSocket connection established');
|
||||
};
|
||||
newSocket.onmessage = (event) => {
|
||||
const newData = JSON.parse(event.data);
|
||||
setData(() => [newData.activation, newData.deactivation]);
|
||||
};
|
||||
newSocket.onerror = (error) => {
|
||||
console.error('WebSocket error:', error);
|
||||
};
|
||||
newSocket.onclose = () => {
|
||||
console.log('WebSocket connection closed');
|
||||
setRequestError({ status: true, message: 'Соединение с сервером разорвано' });
|
||||
};
|
||||
return () => {
|
||||
newSocket.close();
|
||||
closeLoader();
|
||||
};
|
||||
}
|
||||
}, [startConnection, ws]);
|
||||
```
|
||||
|
||||
- Условие: Срабатывает при изменении startConnection или ws.
|
||||
- Логика: Открывает модальное окно загрузки, сбрасывает ноды, эджи и флаги. Создает WebSocket, устанавливает тайм-аут (5 сек) для проверки соединения. Обрабатывает открытие, получение данных, ошибки и закрытие.
|
||||
- Очистка: Закрывает WebSocket и загрузчик.
|
||||
- Цель: Установить связь с сервером и получить данные.
|
||||
2. Второй useEffect — Обработка данных из WebSocket
|
||||
|
||||
```jsx
|
||||
useEffect(() => {
|
||||
if (data.length > 0) {
|
||||
const { interfaces: newInterfaces, edgeData: newEdgeData } = initNetworkIntData(data);
|
||||
const activationData = data[0].interfaces;
|
||||
const wifi = activationData.find((el: any) => el.type === 'WIFI');
|
||||
setInterfaces(newInterfaces);
|
||||
setEdgeData(newEdgeData);
|
||||
if (wifi) { setWifi(wifi); }
|
||||
}
|
||||
}, [data]);
|
||||
```
|
||||
|
||||
- Условие: Срабатывает при изменении data.
|
||||
- Логика: Преобразует data в interfaces и edgeData через initNetworkIntData. Ищет Wi-Fi интерфейс в активных данных, обновляет состояния.
|
||||
- Цель: Подготовить данные для холст.
|
||||
3. Третий useEffect — Инициализация нод и эджей
|
||||
|
||||
```jsx
|
||||
useEffect(() => {
|
||||
if (interfaces.length > 0 && !hasInited) {
|
||||
handleInit(edgeData, interfaces);
|
||||
setHasInited(true);
|
||||
}
|
||||
}, [interfaces, edgeData, hasInited]);
|
||||
```
|
||||
|
||||
- Условие: Срабатывает при изменении interfaces, edgeData, hasInited.
|
||||
- Логика: Если данные есть и инициализация не выполнена, вызывает handleInit для подготовки нод и эджей, затем устанавливает hasInited в true.
|
||||
- Цель: Инициализировать холст.
|
||||
4. Четвертый useEffect — Мониторинг инициализации
|
||||
|
||||
```jsx
|
||||
useEffect(() => {
|
||||
if (initializationAttempt.current === 0 && !requestError.status) {
|
||||
const checkInterval = setInterval(() => {
|
||||
setTimeout(() => {
|
||||
if (!initedNodes.some(node => node.id === 'g0_nw0_rx0_ip0')) {
|
||||
window.location.reload();
|
||||
}
|
||||
}, 500);
|
||||
if (initedNodes.length > 0 && initedEdges.length > 0) {
|
||||
setNodes(initedNodes);
|
||||
setEdges(initedEdges);
|
||||
console.log("Ноды и эджи успешно инициализированы");
|
||||
initializationAttempt.current = 1;
|
||||
clearInterval(checkInterval);
|
||||
clearTimeout(timeoutId);
|
||||
} else {
|
||||
console.log("Попытка инициализации нод и эджей...");
|
||||
}
|
||||
}, 1000);
|
||||
const timeoutId = setTimeout(() => {
|
||||
console.error("Ошибка: слишком долгая загрузка данных");
|
||||
clearInterval(checkInterval);
|
||||
setRequestError({ status: true, message: 'Превышено время ожидания' });
|
||||
}, 30000);
|
||||
return () => {
|
||||
clearInterval(checkInterval);
|
||||
clearTimeout(timeoutId);
|
||||
};
|
||||
}
|
||||
}, [initedNodes, initedEdges, requestError]);
|
||||
```
|
||||
|
||||
- Условие: Срабатывает при изменении initedNodes, initedEdges, requestError.
|
||||
- Логика: Проверяет каждую секунду наличие инициализированных данных. Через 500 мс проверяет ключевую ноду; если нет — перезагрузка. При успехе обновляет nodes, edges, логирует, останавливает проверки. Тайм-аут (30 сек) фиксирует ошибку.
|
||||
- Очистка: Удаляет интервал и тайм-аут.
|
||||
- Цель: Гарантировать успешную инициализацию.
|
||||
5. Пятый useEffect — Обновление счетчика попыток
|
||||
|
||||
```jsx
|
||||
useEffect(() => {
|
||||
if (nodes.length === 0) {
|
||||
initializationAttempt.current = 0;
|
||||
} else {
|
||||
initializationAttempt.current = 1;
|
||||
}
|
||||
}, [nodes]);
|
||||
```
|
||||
|
||||
- Условие: Срабатывает при изменении nodes.
|
||||
- Логика: Сбрасывает initializationAttempt в 0, если нод нет, иначе устанавливает 1.
|
||||
- Цель: Отслеживать состояние инициализации.
|
||||
6. Шестой useEffect — Управление загрузчиком
|
||||
|
||||
```jsx
|
||||
useEffect(() => {
|
||||
if (nodes.length > 0 && loader == true) {
|
||||
setLoader(false);
|
||||
closeLoader();
|
||||
}
|
||||
}, [nodes, loader]);
|
||||
```
|
||||
|
||||
- Условие: Срабатывает при изменении nodes, loader.
|
||||
- Логика: Если ноды есть и загрузчик активен, скрывает его.
|
||||
- Цель: Убрать экран загрузки после рендера.
|
||||
7. Функция onEdgesChange
|
||||
|
||||
```jsx
|
||||
const onEdgesChange = useCallback(
|
||||
(changes: any) => setEdges((eds) => applyEdgeChanges(changes, eds)),
|
||||
[setEdges]
|
||||
);
|
||||
```
|
||||
|
||||
- Тип: useCallback
|
||||
- Вход: changes — массив изменений эджей.
|
||||
- Логика: Применяет изменения к эджам через applyEdgeChanges, обновляет edges.
|
||||
- Цель: Обработать изменения связей.
|
||||
8. Функция onConnect
|
||||
|
||||
```jsx
|
||||
const onConnect = useCallback(
|
||||
(connection: any) => setEdges((eds) => addEdge(connection, eds)),
|
||||
[setEdges]
|
||||
);
|
||||
```
|
||||
|
||||
- Тип: useCallback
|
||||
- Вход: connection — объект новой связи.
|
||||
- Логика: Добавляет связь через addEdge, обновляет edges.
|
||||
- Цель: Создавать новые связи на холсте.
|
||||
9. Функция handleNodesChange
|
||||
|
||||
```jsx
|
||||
const handleNodesChange = (changes: any) => {
|
||||
onNodesChange(changes);
|
||||
const newData = processNodeChanges(changes, data);
|
||||
if (newData) {
|
||||
setChangeArray((prevArray) => [...prevArray, newData]);
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
- Вход: changes — массив изменений нод.
|
||||
- Логика: Обновляет ноды через onNodesChange, извлекает изменения позиций через processNodeChanges, добавляет в changeArray.
|
||||
- Цель: Отслеживать перемещения нод.
|
||||
10. Седьмой useEffect — Автосохранение позиций
|
||||
|
||||
```jsx
|
||||
useEffect(() => {
|
||||
const interval = setInterval(() => {
|
||||
if (socket && socket.readyState === WebSocket.OPEN) {
|
||||
autosavePosition(changeArray, socket);
|
||||
}
|
||||
setChangeArray([]);
|
||||
}, 1000);
|
||||
return () => {
|
||||
clearInterval(interval);
|
||||
};
|
||||
}, [changeArray, socket]);
|
||||
```
|
||||
|
||||
- Условие: Срабатывает при изменении changeArray, socket.
|
||||
- Логика: Каждую секунду отправляет изменения позиций через autosavePosition, очищает changeArray.
|
||||
- Очистка: Удаляет интервал.
|
||||
- Цель: Сохранять позиции на сервере.
|
||||
11. Восьмой useEffect — Обработка групп
|
||||
|
||||
```jsx
|
||||
useEffect(() => {
|
||||
const sortedGroups = groupSort(groups, nodes);
|
||||
setNodes(collapseGroup(sortedGroups, nodes));
|
||||
}, [groups]);
|
||||
```
|
||||
|
||||
- Условие: Срабатывает при изменении groups.
|
||||
- Логика: Сортирует ноды по группам через groupSort, сворачивает/разворачивает через collapseGroup, обновляет nodes.
|
||||
- Цель: Организовать ноды по группам.
|
||||
12. Девятый useEffect — Обновление Wi-Fi
|
||||
|
||||
```jsx
|
||||
useEffect(() => {
|
||||
if (wifiData) {
|
||||
setNodes(updateWifiData(wifiData, nodes));
|
||||
}
|
||||
}, [wifiData]);
|
||||
```
|
||||
|
||||
- Условие: Срабатывает при изменении wifiData.
|
||||
- Логика: Обновляет ноды с учетом Wi-Fi через updateWifiData.
|
||||
- Цель: Отобразить Wi-Fi данные.
|
||||
13. Десятый useEffect — Обработка ошибок
|
||||
|
||||
```jsx
|
||||
useEffect(() => {
|
||||
if (requestError.status) {
|
||||
setTimeout(() => {
|
||||
openModal(ModalMap['3'], { message: requestError.message });
|
||||
}, 1000);
|
||||
}
|
||||
}, [requestError]);
|
||||
```
|
||||
|
||||
- Условие: Срабатывает при изменении requestError.
|
||||
- Логика: При ошибке через 1 сек открывает модальное окно с сообщением.
|
||||
- Цель: Уведомить об ошибках.
|
||||
14. Одиннадцатый useEffect — Сброс позиций
|
||||
|
||||
```jsx
|
||||
useEffect(() => {
|
||||
if (isNullPos) {
|
||||
if (socket && socket.readyState === WebSocket.OPEN) {
|
||||
resetPosition(socket, setNullPos, nodes, setNodes);
|
||||
}
|
||||
}
|
||||
}, [isNullPos]);
|
||||
```
|
||||
|
||||
- Условие: Срабатывает при изменении isNullPos.
|
||||
- Логика: При истинном isNullPos сбрасывает позиции через resetPosition, обновляет ноды.
|
||||
- Цель: Вернуть исходные позиции.
|
||||
|
||||
#### 2.3. Рендеринг
|
||||
|
||||
```jsx
|
||||
return (
|
||||
<>
|
||||
<ReactFlow
|
||||
nodes={nodes}
|
||||
edges={edges}
|
||||
onNodesChange={handleNodesChange}
|
||||
onEdgesChange={onEdgesChange}
|
||||
onConnect={onConnect}
|
||||
style={{ background: '#F7F9FB' }}
|
||||
minZoom={0}
|
||||
maxZoom={4}
|
||||
fitView
|
||||
fitViewOptions={{ padding: 0.1 }}
|
||||
attributionPosition="bottom-left"
|
||||
snapToGrid
|
||||
snapGrid={[20, 20]}
|
||||
panOnDrag={!isPanDisabled}
|
||||
nodeTypes={nodeTypes}
|
||||
proOptions={proOptions}
|
||||
>
|
||||
<Background gap={20} size={1} bgColor={theme.background} />
|
||||
<Controls fitViewOptions={{ padding: 0.1 }} />
|
||||
</ReactFlow>
|
||||
</>
|
||||
);
|
||||
```
|
||||
|
||||
- Компонент: ReactFlow рендерит холст.
|
||||
- Параметры: Ноды, эджи, обработчики, фон, зум (0–4), сетка (20x20), перетаскивание по isPanDisabled, кастомные ноды.
|
||||
- Дочерние: Background (сетка), Controls (кнопки для управления зумом).
|
||||
3
Documentation/Сервер от меня.md
Normal file
3
Documentation/Сервер от меня.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
# Сервер от меня
|
||||
|
||||

|
||||
187
Documentation/Структура исходного кода клиентской части.md
Normal file
187
Documentation/Структура исходного кода клиентской части.md
Normal file
|
|
@ -0,0 +1,187 @@
|
|||
# Структура исходного кода клиентской части
|
||||
|
||||
### Структура исходного кода клиенсткой части
|
||||
|
||||
```
|
||||
FRONT/
|
||||
BUILD/ # Сближенная версия приложения
|
||||
DEV/ # Исходный код приложения
|
||||
assets/
|
||||
icon.png # Иконка для самого приложения
|
||||
public/
|
||||
assets/
|
||||
images/ # SVG-иконки и изображения для UI
|
||||
back1.svg
|
||||
bigLogo.svg
|
||||
bukvi.svg
|
||||
cancel.svg
|
||||
check.svg
|
||||
edit.svg
|
||||
ethernet.svg
|
||||
gossys.png
|
||||
logo.svg
|
||||
signal.svg
|
||||
vite.svg
|
||||
vpn.svg
|
||||
wifi.svg
|
||||
src/ # Основной исходный код приложения
|
||||
api/
|
||||
request.ts # Функции для HTTP-запросов
|
||||
assets/
|
||||
css/ # Стили приложения
|
||||
flow.css # Стили для React Flow
|
||||
index.css # Глобальные стили приложения
|
||||
components/
|
||||
customeNodes/ # Кастомные ноды для React Flow
|
||||
nodes/
|
||||
baseForm/ # Базовые формы нод
|
||||
circle/
|
||||
circleNode.tsx # Компонент ноды в форме круга
|
||||
style.ts
|
||||
default/
|
||||
defaultNode.tsx # Компонент ноды по умолчанию
|
||||
style.ts
|
||||
diamond/
|
||||
diamondNode.tsx # Компонент ноды в форме ромба
|
||||
style.ts
|
||||
paralelogram/
|
||||
paralelogramNode.tsx # Компонент ноды в форме параллелограмма
|
||||
style.ts
|
||||
pill/
|
||||
pillNode.tsx # Компонент ноды в форме таблетки
|
||||
style.ts
|
||||
networkInterface/ # Ноды для представления сетевых интерфейсов
|
||||
ipGroup/
|
||||
ipGroup.tsx # Компонент ноды групп IP-адресов
|
||||
style.ts
|
||||
ipNode/
|
||||
ipNode.tsx # Компонент ноды IP-адреса
|
||||
style.ts
|
||||
networkGroup/
|
||||
nodeGroup.tsx # Компонент ноды групп сетевых интерфейсов
|
||||
style.ts
|
||||
networkNode/
|
||||
networkNode.tsx # Компонент ноды сетевого интерфейса
|
||||
style.ts
|
||||
portNode/
|
||||
portNode.tsx # Компонент ноды порта
|
||||
style.ts
|
||||
index.ts
|
||||
types/
|
||||
colors.ts # Константы цветов для нод
|
||||
types.ts # Общие типы для нод
|
||||
modalwindows/
|
||||
modalContainers/ # Контейнеры для модальных окон
|
||||
addDevice.tsx
|
||||
connectionError.tsx
|
||||
ipConfirm.tsx
|
||||
rightsConfirm.tsx
|
||||
index.ts
|
||||
modal.tsx # Базовый компонент модального окна
|
||||
modalWindow.tsx # Основной компонент для рендеринга модальных окон
|
||||
style.ts # Стили для модальных окон
|
||||
windowsType.ts # Типы для модальных окон
|
||||
UI/ # Общие UI-компоненты
|
||||
buttons/
|
||||
mainButton.tsx # Основная кнопка приложения
|
||||
quitButton.tsx # Кнопка выхода
|
||||
toggletheme.tsx # Кнопка переключения темы
|
||||
inputs/
|
||||
input.tsx # Компонент поля ввода
|
||||
animDot.tsx # Анимированная точка
|
||||
loader.tsx # Компонент загрузки
|
||||
routerLoader.tsx # Лоадер для маршрутизации
|
||||
signalSvg.tsx # SVG-компонент для индикатора сигнала
|
||||
workSpace/ # Компоненты рабочего пространства
|
||||
modules/
|
||||
appModules/ # Общие модули приложения
|
||||
about.tsx # Страница/компонент "О программе"
|
||||
header.tsx # Компонент хэдера
|
||||
helloWindow.tsx # Приветственное окно
|
||||
workModules/
|
||||
networkInterfaces.tsx # Модуль для управления сетевыми интерфейсами
|
||||
sideBar/ # Боковая панель
|
||||
toolBar/
|
||||
toolBar-button.tsx # Компонент кнопки панели инструментов
|
||||
toolBar.tsx # Панель инструментов
|
||||
toolSpace/
|
||||
devicesBar.tsx # Меню управление подключённых хостов
|
||||
toolSpace.tsx # Компонент пространства инструментов
|
||||
sideBar.tsx # Основной компонент боковой панели
|
||||
workSpace.tsx # Основной компонент рабочего пространства
|
||||
register.tsx # Компонент регистрации пользователя(создания пароля)
|
||||
const/ # Константы и конфигурации
|
||||
buttons/
|
||||
icons.tsx # Иконки для кнопок
|
||||
names.ts # Названия кнопок
|
||||
menus/
|
||||
othersMenus/
|
||||
data.ts # Данные для прочих меню
|
||||
names.ts # Названия прочих меню
|
||||
sideBar/
|
||||
components.tsx # Компоненты для боковой панели
|
||||
data.ts # Данные для боковой панели
|
||||
icons.tsx # Иконки боковой панели
|
||||
names.ts # Названия пунктов боковой панели
|
||||
modals/
|
||||
names.ts # Названия модальных окон
|
||||
theme/
|
||||
globalStyles.ts # Глобальные стили темы
|
||||
icons.tsx # Иконки для темы
|
||||
names.ts # Названия тем
|
||||
theme.ts # Конфигурация темы
|
||||
types/
|
||||
types.ts # Общие типы приложения
|
||||
workspace/
|
||||
names.ts # Названия для рабочего пространства
|
||||
hooks/
|
||||
useMenu.ts # Хук для управления меню
|
||||
useToolBar.ts # Хук для управления панелью инструментов
|
||||
store/
|
||||
adminStore.ts # Хранилище для админских данных
|
||||
devicesStore.ts # Хранилище для данных об подключённых хостах
|
||||
flowStore.ts # Хранилище для React Flow
|
||||
groupStore.ts # Хранилище для групп нод
|
||||
index.ts # Экспорт всех хранилищ
|
||||
ipStore.ts # Хранилище для IP-адресов
|
||||
menusStore.ts # Хранилище для меню
|
||||
modalContext.tsx # Контекст для управления модальными окнами
|
||||
pannableStore.ts # Хранилище для перемещения холста
|
||||
posStore.ts # Хранилище для позиций нод
|
||||
themeContext.tsx # Контекст для управления темой
|
||||
toolBarStore.ts # Хранилище для панели инструментов
|
||||
workSpaceStore.ts # Хранилище для рабочего пространства
|
||||
utils/ # Утилитарные функции
|
||||
nodeController/ # Утилиты для управления узлами
|
||||
nodeCreator/
|
||||
inits/
|
||||
initEdges.ts # Инициализация связей (эджей)
|
||||
initIpArray.ts # Инициализация массива IP-адресов
|
||||
initNodes.ts # Инициализация нод
|
||||
initor.ts # Общий инициализатор
|
||||
autosavePosition.ts # Автосохранение позиций нод
|
||||
collapseGroup.ts # Сворачивание групп нод
|
||||
groupSort.ts # Сортировка групп
|
||||
index.ts # Экспорт утилит
|
||||
initNetIntData.ts # Инициализация данных сетевых интерфейсов
|
||||
updateWifiData.ts # Обновление данных Wi-Fi
|
||||
validator.ts # Валидация данных
|
||||
checkAdmin.ts # Проверка прав администратора
|
||||
pageReloads.ts # Утилиты для управления перезагрузкой страниц
|
||||
electron.d.ts # Типы для Electron
|
||||
router.tsx # Маршрутизация (React Router)
|
||||
.gitignore
|
||||
eslint.config.js
|
||||
index.html # Главный HTML-файл
|
||||
index.tsx # Точка входа для React-приложения
|
||||
main.js # Главный файл для Electron
|
||||
package-lock.json
|
||||
package.json
|
||||
preload.js # Preload-скрипт для Electron
|
||||
tsconfig.app.json
|
||||
tsconfig.json
|
||||
tsconfig.node.json
|
||||
vite-env.d.ts
|
||||
vite.config.ts
|
||||
yarn.lock
|
||||
```
|
||||
3
Documentation/Схема общей структуры клиентской части.md
Normal file
3
Documentation/Схема общей структуры клиентской части.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
# Схема общей структуры клиентской части
|
||||
|
||||

|
||||
67
Documentation/Схема общей структуры сервера.md
Normal file
67
Documentation/Схема общей структуры сервера.md
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
# Схема общей структуры сервера
|
||||
|
||||

|
||||
|
||||
|
||||
### Зависимости сервера (AGPL Нету):
|
||||
|
||||
| Название | Версия | Описание | Лицензия |
|
||||
| --- | --- | --- | --- |
|
||||
| _annotated-types_ | _0.7.0_ | _Reusable constraint types to use with typing.Annotated_ | _MIT_ |
|
||||
| _anyio_ | _4.7.0_ | _High level compatibility layer for multiple asynchronous event loop implementations_ | _MIT_ |
|
||||
| _bcrypt_ | _4.3.0_ | _Modern password hashing for your software and your servers_ | _Apache-2.0_ |
|
||||
| _certifi_ | _2025.1.31_ | _Python package for providing Mozilla's CA Bundle._ | _MPL-2.0_ |
|
||||
| _cffi_ | _1.17.1_ | _Foreign Function Interface for Python calling C code._ | _MIT_ |
|
||||
| _click_ | _8.1.7_ | _Composable command line interface toolkit_ | _BSD-3-Clause_ |
|
||||
| _cryptography_ | _44.0.2_ | _Cryptography is a package which provides cryptographic recipes and primitives to Python developers._ | _Apache-2.0 OR BSD-3-Clause_ |
|
||||
| _dbus-python_ | _1.3.2_ | _Python bindings for libdbus_ | _MIT_ |
|
||||
| _dnspython_ | _2.7.0_ | _DNS toolkit_ | _ISC_ |
|
||||
| _ecdsa_ | _0.19.0_ | _ECDSA cryptographic signature library (pure python)_ | _MIT_ |
|
||||
| _email-validator_ | _2.2.0_ | _A robust email address syntax and deliverability validation library._ | _MIT_ |
|
||||
| _fastapi_ | _0.115.11_ | _FastAPI framework, high performance, easy to learn, fast to code, ready for production_ | _MIT_ |
|
||||
| _fastapi-cli_ | _0.0.7_ | _Run and manage FastAPI apps from the command line with FastAPI CLI._ | _MIT_ |
|
||||
| _h11_ | _0.14.0_ | _A pure-Python, bring-your-own-I/O implementation of HTTP/1.1_ | _MIT_ |
|
||||
| _httpcore_ | _1.0.7_ | _A minimal low-level HTTP client._ | _BSD-3-Clause_ |
|
||||
| _httptools_ | _0.6.4_ | _A collection of framework independent HTTP protocol utils._ | _MIT_ |
|
||||
| _httpx_ | _0.28.1_ | _The next generation HTTP client._ | _BSD-3-Clause_ |
|
||||
| _idna_ | _3.10_ | _Internationalized Domain Names in Applications (IDNA)_ | _BSD-3-Clause_ |
|
||||
| _jinja2_ | _3.1.5_ | _A very fast and expressive template engine._ | _BSD-3-Clause_ |
|
||||
| _markdown-it-py_ | _3.0.0_ | _Python port of markdown-it. Markdown parsing, done right!_ | _MIT_ |
|
||||
| _markupsafe_ | _3.0.2_ | _Safely add untrusted strings to HTML/XML markup._ | _BSD-3-Clause_ |
|
||||
| _mdurl_ | _0.1.2_ | _Markdown URL utilities_ | _MIT_ |
|
||||
| _netaddr_ | _1.3.0_ | _A network address manipulation library for Python_ | _BSD-3-Clause_ |
|
||||
| _netifaces_ | _0.11.0_ | _Portable network interface information._ | _MIT_ |
|
||||
| _paramiko_ | _3.5.1_ | _SSH2 protocol library_ | _LGPL-2.1_ |
|
||||
| _passlib_ | _1.7.4_ | _Comprehensive password hashing framework supporting over 30 schemes_ | _BSD-3-Clause_ |
|
||||
| _pyasn1_ | _0.4.8_ | _ASN.1 types and codecs_ | _BSD-2-Clause_ |
|
||||
| _pycairo_ | _1.27.0_ | _Python interface for cairo_ | _MPL-1.1 OR LGPL-2.1_ |
|
||||
| _pycparser_ | _2.22_ | _C parser in Python_ | _BSD-3-Clause_ |
|
||||
| _pydantic_ | _2.10.3_ | _Data validation using Python type hints_ | _MIT_ |
|
||||
| _pydantic-core_ | _2.27.1_ | _Core functionality for Pydantic validation and serialization_ | _MIT_ |
|
||||
| _pydbus_ | _0.6.0_ | _Pythonic DBus library_ | _LGPL-2.1_ |
|
||||
| _pygments_ | _2.19.1_ | _Pygments is a syntax highlighting package written in Python._ | _BSD-2-Clause_ |
|
||||
| _pygobject_ | _3.50.0_ | _Python bindings for GObject Introspection_ | _LGPL-2.1_ |
|
||||
| _pynacl_ | _1.5.0_ | _Python binding to the Networking and Cryptography (NaCl) library_ | _Apache-2.0_ |
|
||||
| _python-dotenv_ | _1.0.1_ | _Read key-value pairs from a .env file and set them as environment variables_ | _BSD-3-Clause_ |
|
||||
| _python-jose_ | _3.4.0_ | _JOSE implementation in Python_ | _MIT_ |
|
||||
| _python-multipart_ | _0.0.20_ | _A streaming multipart parser for Python_ | _Apache-2.0_ |
|
||||
| _python-pam_ | _2.0.2_ | _Python PAM module using ctypes, py3_ | _MIT_ |
|
||||
| _pyyaml_ | _6.0.2_ | _YAML parser and emitter for Python_ | _MIT_ |
|
||||
| _rich_ | _13.9.4_ | _Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal_ | _MIT_ |
|
||||
| _rich-toolkit_ | _0.13.2_ | _Rich toolkit for building command-line applications_ | _MIT_ |
|
||||
| _rsa_ | _4.9_ | _Pure-Python RSA implementation_ | _Apache-2.0_ |
|
||||
| _scapy_ | _2.6.1_ | _Scapy: interactive packet manipulation tool_ | _GPL-2.0_ |
|
||||
| _sdbus_ | _0.13.0_ | _Modern Python D-Bus library. Based on sd-bus from libsystemd._ | _LGPL-2.1_ |
|
||||
| _sdbus-networkmanager_ | _2.0.0_ | _NetworkManager binds for sdbus._ | _LGPL-2.1_ |
|
||||
| _shellingham_ | _1.5.4_ | _Tool to Detect Surrounding Shell_ | _ISC_ |
|
||||
| _six_ | _1.17.0_ | _Python 2 and 3 compatibility utilities_ | _MIT_ |
|
||||
| _sniffio_ | _1.3.1_ | _Sniff out which async library your code is running under_ | _MIT OR Apache-2.0_ |
|
||||
| _starlette_ | _0.41.3_ | _The little ASGI library that shines._ | _BSD-3-Clause_ |
|
||||
| _storage_ | _0.0.4.3_ | _Libraries to interact with Enterprise Storage Arrays, FC Switches and Servers._ | _Unknown_ |
|
||||
| _typer_ | _0.15.2_ | _Typer, build great CLIs. Easy to code. Based on Python type hints._ | _MIT_ |
|
||||
| _typing-extensions_ | _4.12.2_ | _Backported and Experimental Type Hints for Python 3.8+_ | _PSFL_ |
|
||||
| _uuid_ | _1.30_ | _UUID object and generation functions (Python 2.3 or higher)_ | _BSD-3-Clause_ |
|
||||
| _uvicorn_ | _0.32.1_ | _The lightning-fast ASGI server._ | _BSD-3-Clause_ |
|
||||
| _uvloop_ | _0.21.0_ | _Fast implementation of asyncio event loop on top of libuv_ | _MIT AND Apache-2.0_ |
|
||||
| _watchfiles_ | _1.0.4_ | _Simple, modern and high performance file watching and code reload in python._ | _MIT_ |
|
||||
| _websockets_ | _14.1_ | _An implementation of the WebSocket Protocol (RFC 6455 & 7692)_ | _BSD-3-Clause_ |
|
||||
Loading…
Add table
Add a link
Reference in a new issue