gonets/SRV/docs/_build/markdown/api/services/subnet_service.md

273 lines
12 KiB
Markdown
Raw Normal View History

2025-10-14 16:11:12 +05:00
# Subnet Service
### *class* services.subnet_service.DeviceInfoCollector(translations: Translations)
Bases: `object`
Класс для сбора информации об устройствах, включая вендоров и хостнеймы.
Источники данных:
: - MacLookup: сопоставление префикса MAC (OUI) с названием производителя.
- DNS: gethostbyaddr с малым таймаутом для обратного разрешения имени.
2025-10-21 09:20:50 +05:00
- NetBIOS (nbtscan): опрос сегмента сети для извлечения NetBIOS-имён.
2025-10-14 16:11:12 +05:00
Политика кэширования:
: - Результаты 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, ...]
}
```
Политика очистки:
2025-10-21 09:20:50 +05:00
- Метод \_clean_old_devices удаляет оффлайн-устройства, не наблюдавшиеся более 7 дней,
2025-10-14 16:11:12 +05:00
чтобы поддерживать актуальность списка.
#### 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-запросов.
Назначение:
: Обнаруживает активные устройства в локальной сети, отправляя широковещательные
2025-10-21 09:20:50 +05:00
ARP-запросы по указанной подсети и собирая ответы (IP, MAC).
2025-10-14 16:11:12 +05:00
Детали реализации:
: - Использует 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`
Класс для сканирования открытых портов на устройствах.
Назначение:
2025-10-21 09:20:50 +05:00
: Плейсхолдер для будущего функционала активного сканирования TCP/UDP-портов
2025-10-14 16:11:12 +05:00
у обнаруженных узлов. В текущей версии возвращает пустой список.
План развития:
: - Добавить неблокирующее сканирование наиболее распространённых портов
(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. Добавление локального устройства (если принадлежит подсети).
2025-10-21 09:20:50 +05:00
4. ARP-сканирование и параллельная обработка узлов (обогащение данных).
5. Маркировка оффлайн-узлов из кэша, не встреченных в текущем скане.
2025-10-14 16:11:12 +05:00
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