Rename directories

This commit is contained in:
Merelden 2025-10-14 16:19:35 +05:00
parent c55acba709
commit ca047c4248
95 changed files with 77 additions and 77 deletions

44
Documentation/API.md Normal file
View 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), чтобы избежать ошибок подключения.

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.

View 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)

View file

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

View file

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

View file

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

View file

@ -0,0 +1,3 @@
# Core
* [core.cli_executor](GonetsDocs/Documentation/Tech-docs/api/core/cli_executor.md)

View file

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

View file

@ -0,0 +1,9 @@
# API эндпоинты
* [api.v1.auth](Техническая-документация-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)

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -0,0 +1,8 @@
# Модели
* [models.auth](Техническая-документация-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)

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -0,0 +1,12 @@
# Сервисы
* [ARP Service](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)

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View 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)

View file

@ -0,0 +1,5 @@
# ГоNets итог
![diagram.drawio.svg](https://dev.gossys.dev/hybryddocs/GonetsDocs/media/branch/main/assets/diagram.drawio.3.svg)

View 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), чтобы избежать ошибок подключения

View 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-адреса, добавлять новые узлы и управлять ими, а также изменять параметры интерфейсов без необходимости использовать командную строку.
Для получения дополнительной информации и подробных инструкций, пожалуйста, ознакомьтесь с документацией и скриншотами, которые будут добавлены в следующей версии.

View file

@ -0,0 +1,3 @@
# Итерация 1 WIFI SCANNER
![diagram.drawio.svg](https://dev.gossys.dev/hybryddocs/GonetsDocs/media/branch/main/assets/diagram.drawio.4.svg)

View 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", "загрузка данных").

View 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‘ и по названию определяется необходимый модуль.
Здесь
&lt;Header/&gt; - это верхняя панель для управления холстом
&lt;NetWorkInterfaces/&gt; - Сам компонент работы с сетевыми интерфейсами, в нём пропсы key - ключ компонента, будет равен текущему ip хоста, startConnection - флаг, при передачи которого начинается работа компонента, ws - передача ip текущего хоста для создания WebSocket подключения
### 2\. Компонент NetworkInterfaces
Рассмотрение компонента логично начать с обзора его переменных состояния, которых в этом компоненте присутствует немало.
#### 2.1. Переменные состояния компонента NetworkInterfaces
1. initializationAttempt
- Тип: React.useRef&lt;number&gt;
- Описание: Счетчик попыток инициализации данных, хранящийся в 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 (кнопки для управления зумом).

View file

@ -0,0 +1,3 @@
# Сервер от меня
![diagram.drawio.svg](https://dev.gossys.dev/hybryddocs/GonetsDocs/media/branch/main/assets/diagram.drawio.1.svg)

View 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
```

View file

@ -0,0 +1,3 @@
# Схема общей структуры клиентской части
![diagram.drawio.svg](https://dev.gossys.dev/hybryddocs/GonetsDocs/media/branch/main/assets/diagram.drawio.2.svg)

View file

@ -0,0 +1,67 @@
# Схема общей структуры сервера
![diagram.drawio.svg](https://dev.gossys.dev/hybryddocs/GonetsDocs/media/branch/main/assets/diagram.drawio.2.svg)
### Зависимости сервера (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_ |