# Техническое задание (v1) ## Цель Создать кроссплатформенное веб-приложение на Go для: - обнаружения устройств в сети; - базовой идентификации устройств; - получения LLDP-соседей; - построения карты связей между устройствами. ## Платформы и запуск - Backend: Go 1.22+ - ОС: Linux и Windows - Запуск: стандартными средствами (без Docker) - Reverse proxy: Nginx (Linux) или IIS (Windows, опционально) ## Функциональные требования v1 - [x] ручной запуск скана по заданным CIDR; - [x] ping sweep по диапазонам; - [x] проверка базовых TCP-портов (`22, 80, 443, 161`); - [x] SNMP v2c: `sysName`, `sysDescr`, `sysObjectID`; - [x] сбор LLDP соседей по SNMP; - [x] сохранение результатов скана в БД; - [x] построение базового графа связей устройств (`/links`, `/topology`); - [x] история сканов и сравнение изменений (`/api/scans/diff?from=&to=`). ## Нефункциональные требования - кроссплатформенная сборка (Linux/Windows); - устойчивость к частичным ошибкам в сети; - конфигурируемые таймауты и параллелизм; - разграничение прав (`admin`, `viewer`); - логирование ошибок и действий. ## Архитектура - `cmd/server` — запуск HTTP API - `internal/api` — обработчики и роуты - `internal/scans` — логика создания/ведения scan jobs - `internal/scanner/*` — ping, ports, snmp, lldp (поэтапно) - `internal/store` — миграции PostgreSQL - `web` — интерфейс (следующий этап) ## Текущее состояние реализации - [x] готов API-каркас (`health`, создание и чтение scan jobs); - [x] реализован выбор хранилища: `memory` или `postgres` через env; - [x] добавлены автоматические миграции таблиц при старте; - [x] добавлены endpoints результатов: hosts, ports, snmp, lldp, links, topology; - [x] подготовлены конфиги для запуска как сервис на Linux и за IIS на Windows. - [x] UI позволяет выбрать последний scan и выполнить diff двух сканов. - [x] UI позволяет выбирать scan из списка и подсвечивать изменения на графе. - [x] UI содержит легенду и фильтр отображения узлов по diff. - [x] UI поддерживает экспорт topology/diff в JSON. ## Минимальные API - [x] `GET /health` - [x] `POST /api/scans` - [x] `GET /api/scans/{id}` - [x] `GET /api/scans/{id}/topology` - [x] `GET /api/scans/diff?from=&to=` ## Модель данных (минимум) - `users` - `snmp_credentials` - `scan_jobs` - `devices` - `open_ports` - `lldp_neighbors` - `links` ## SNMP OID минимум - `1.3.6.1.2.1.1.5.0` (`sysName`) - `1.3.6.1.2.1.1.1.0` (`sysDescr`) - `1.3.6.1.2.1.1.2.0` (`sysObjectID`) - `1.0.8802.1.1.2.1.4.1.1.5` (`lldpRemChassisId`) - `1.0.8802.1.1.2.1.4.1.1.7` (`lldpRemPortId`) - `1.0.8802.1.1.2.1.4.1.1.9` (`lldpRemSysName`) ## Этапы 1. [x] Каркас API и scan jobs 2. [x] PostgreSQL и миграции 3. [x] Ping + port scan 4. [x] SNMP system + LLDP 5. [x] Граф топологии в UI (минимальная web-страница `/`) 6. [x] История и diff ## Критерии приемки v1 - [x] скан по CIDR создается и завершается; - [x] живые узлы фиксируются в результатах; - [x] SNMP-доступные устройства читаются; - [x] LLDP-связи строятся минимум на тестовой сети; - [x] топология отображается в интерфейсе; - [ ] приложение запускается на Linux и Windows (нужна ваша проверка на 2 ОС).