Collector daemon, FastAPI server (addresses, diff, collect, sources), SQLite storage with change journal, Docker Compose deployment, tests, documentation and project rules. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
3.8 KiB
3.8 KiB
План: управление ASN и FQDN через API (реализация - отдельной командой)
Часть B. Управление ASN и FQDN через API (только план)
Эндпоинты
Изменяющие запросы требуют X-API-Key (как POST /schedule, тот же verify_token); чтение открыто.
| Метод и путь | Действие |
|---|---|
GET /asns, GET /fqdns |
список из config.json |
POST /asns {"asn": 62041} |
добавить (идемпотентно: 201 при добавлении, 200 если уже есть) |
POST /fqdns {"fqdn": "example.com"} |
то же |
DELETE /asns/{asn}?purge=false, DELETE /fqdns/{fqdn}?purge=false |
убрать из конфигурации; 404, если нет |
Правила
- Валидация: ASN - целое
1..4294967295(pydanticField); FQDN - нормализация (нижний регистр, без завершающей точки), длина до 253, метки до 63 символов из[a-z0-9-], без начального и конечного дефиса, IP-литералы отклоняются. Ошибки -> 422. - Запись конфига: общий хелпер
update_config(mutator)вcidr_collector.py(блокировкаflock+ атомарная запись), используется вPOST /schedule, новых эндпоинтах и вCIDRCollector.add_asn/remove_asn,FQDNCollector.add_fqdn/remove_fqdn- заодно закрывает риск «CLI меняет конфиг без блокировки». - Данные удалённого источника: по умолчанию сохраняются. Чтобы не висеть вечно (TTL применяется только к опрашиваемым источникам), в
run_collectionпод блокировкой данных записи, которых уже нет в конфигурации, проходятmerge_entryс пустым набором: адреса истекают поttl_days, пустая запись удаляется.purge=trueудаляет запись изdata.json/fqdn_data.jsonсразу (под блокировкой данных, после обновления конфига, без вложенных блокировок). - В
run_collectionперед слиянием конфигурация перечитывается под блокировкой данных: источник, удалённый во время сбора, не воскресает. - Новые источники подхватываются на ближайшем запуске сбора (демон читает конфиг при каждом запуске); немедленный сбор по запросу (
POST /collect) - за рамками этого шага.
Тесты (минимум, в контейнере)
- Добавление/удаление ASN и FQDN: 401 без ключа, 201/200 идемпотентность, 422 на невалидные значения, 404 при удалении несуществующего, конфиг обновлён.
purge=trueудаляет данные источника, безpurge- данные остаются; при сборе запись без источника в конфигурации истекает по TTL.
Проверка
Тесты в контейнере; вручную curl с токеном на копии данных (добавить, увидеть в GET /asns, запуск сбора демоном, удалить с purge, адреса исчезли из /addresses).
Зависит от docs/plan-process-split.md (выполняется первым).