Отчёты
enodia export пишет отчёт в одном из трёх форматов. Все три принимают
--from (читать существующий инвентарь вместо сбора) и -o/--output
(путь к файлу, либо - для stdout — по умолчанию).
enodia export --format jsonenodia export --format prometheusenodia export --format html -o report.htmlВстроенный дефолт --format — json, но export.default_format в
settings.yaml переопределяет его, когда сам --format не передан —
явный --format всегда побеждает, тот же приоритет, что уже используют
render.default_view/html.view. См.
Конфигурацию.
--format json
Заголовок раздела «--format json»Каждый observation и каждый assessment, целиком — --view игнорируется.
Это формат для тех, кто хочет применить собственную политику severity
поверх фактов enodia (см.
Концепции).
Если настроен блок cve:, каждый assessment также несёт
массив cves — по записи на каждую находку в каждом источнике (CVE,
который есть и в БДУ, и в NVD, встречается дважды; из NVD — по разу на
каждый подошедший CPE):
{ "Source": "bdu", "AdvisoryID": "BDU:2026-11879", "CVEIDs": ["CVE-2026-19478"], "Title": "Уязвимость программной платформы … GitLab EE/ CE …", "Severity": "Высокий уровень опасности (базовая оценка CVSS 2.0 составляет 9,7) …", "MatchedName": "Gitlab", "RangeText": "от 19.2.0 до 19.2.4", "FixStatus": "Уязвимость устранена", "CVSS": { "Version": "3.1", "Score": 9.4, "Severity": "CRITICAL" }}Severity и RangeText — собственный текст источника, дословно;
CVSS — одна оценка, разобранная из него: в первую очередь CVSS
3.1/3.0, затем 4.0, затем 2.0 — версия 3.x есть почти у каждого CVE в
обоих источниках, поэтому оценки в одном списке остаются в одной шкале. Колонка
CVES в табличных представлениях считает различные CVE по этим
записям, а не сами записи. Находки из собственных данных вендора (см.
Собственные данные вендоров)
имеют ту же форму, с Source, равным mariadb, atlassian,
postgresql или nginx.
Находки по пакетам для Linux-хостов (см.
Сопоставление с CVE)
имеют ту же форму: Source — debian, oval или alpine,
MatchedName — имя пакета, и ещё четыре поля: InstalledVersion,
FixedVersion (версия, которая закрывает все CVE из CVEIDs),
AdvisoryURL и Advisories (все бюллетени, которых не хватает пакету).
Сам инвентарь для таких хостов тоже растёт: каждое наблюдение несёт
карту packages (пакет → установленная версия), а на хостах семейства
RHEL ещё и modules (потоки AppStream) — десятки КБ на хост.
--format prometheus
Заголовок раздела «--format prometheus»Prometheus textfile, рассчитанный на
textfile-коллектор node_exporter
— пишите его туда, куда node_exporter настроен сканировать, по
расписанию, как любую другую textfile-метрику. Находки CVE в метрики
не выгружаются.
--format html
Заголовок раздела «--format html»Один самодостаточный файл. Встроенного веб-сервера нет — сама enodia
его не отдаёт (см.
Концепции);
направьте на него nginx и пересобирайте его по cron или systemd-таймеру.
enodia serve (см. Справочник CLI)
— альтернатива, если нужно, чтобы отчёт отдавался автоматически, по
собственному расписанию.
--view ограничивает отчёт одним представлением вместо всех четырёх
секций подряд. html.view из settings.yaml делает то же самое, когда
флаг не передан.
Офлайн по умолчанию
Заголовок раздела «Офлайн по умолчанию»html.assets из settings.yaml управляет тем, что нужно
сгенерированному файлу:
inline(по умолчанию) — ноль внешних ресурсов. Проверено: ни одного<scriptво всём выводе и ничего, загружаемого поhttp(s)://, — такие адреса встречаются только в обычных ссылках (футер, страницы NVD/cve.org/БДУ в списке CVE). Рендерится одинаково внутри полностью закрытой сети.cdn— грузит Bootstrap и тему Bootswatch с CDN и добавляет заметное предупреждение прямо на странице о том, что для стилизованного рендера нужен интернет.html.themeвыбирает тему (none,default, либо любая из 26 настоящих тем Bootswatch);html.cdnвыбирает CDN —auto(по умолчанию) устраивает гонку между jsdelivr и cdnjs черезHEAD-запрос к каждому и переключается на того, кто ответил первым, так что блокировка одного CDN в конкретной сети не роняет стили отчёта целиком. Самый первый рендер всегда использует jsdelivr; гонка только обновляет стиль уже после этого. Кроме того, в отчёте есть выбор темы, который запоминается для каждого зрителя вlocalStorageбраузера, и так же запоминается закрытие предупреждения: закрытое один раз, оно больше не показывается в этом браузере и в пересобранных отчётах.
Полный пример settings.yaml см. в
Конфигурации.
Список CVE
Заголовок раздела «Список CVE»Если настроен блок cve:, ячейка CVES в секциях
compact и drift становится ссылкой, открывающей список CVE этого
таргета: одна строка на CVE, самые опасные сверху, со ссылками на NVD,
cve.org и, для находок из БДУ, на страницу bdu.fstec.ru, а оценка —
цветными бейджами (CRITICAL · CVSS 3.1 9.8). Описание — русский текст
из БДУ, если CVE есть в БДУ, иначе английский из NVD. Находки по пакетам —
одна строка на пакет (linux 6.12.107-1 → 6.12.111-1), со ссылкой на
бюллетень с исправлением и свёрнутым под ней списком CVE пакета. Всё сделано на
чистом CSS (модальное окно через :target), поэтому одинаково работает
и в режиме inline, совсем без скриптов.
Цвет строк в CDN-режиме
Заголовок раздела «Цвет строк в CDN-режиме»С html.assets: cdn каждая строка получает контекстный класс
Bootstrap — красный для недоступного инстанса, зелёный для доступного —
в той теме, что настроена, а не жёстко заданный enodia цвет на каждую
тему отдельно:
<table class="table table-striped table-hover table-sm align-middle"><thead><tr><th>PRODUCT</th><th>VERSION</th><th>STATUS</th><th>COUNT</th><th>INSTANCES</th></tr></thead><tbody><tr class="table-danger"><td>gitlab</td><td>(unknown)</td><td>auth</td><td>1</td><td>gitlab-2</td></tr><tr class="table-success"><td>gitlab</td><td>18.2.1</td><td>ok</td><td>1</td><td>gitlab-1</td></tr><tr class="table-danger"><td>jira</td><td>(unknown)</td><td>unreachable</td><td>1</td><td>jira-staging</td></tr><tr class="table-success"><td>jira</td><td>10.3.1</td><td>ok</td><td>1</td><td>jira-3</td></tr><tr class="table-success"><td>jira</td><td>10.3.2</td><td>ok</td><td>2</td><td>jira-1, jira-2</td></tr></tbody></table>Футер и favicon
Заголовок раздела «Футер и favicon»Футер каждого сгенерированного отчёта ссылается обратно на проект на
GitHub, а также на enodia.sh и docs.enodia.sh — обычные <a href>,
не загрузка ресурса, так что это никак не влияет на офлайн-гарантию
режима inline (она конкретно про загружаемые ресурсы, не про
инертный текст ссылки). Оба режима также получают favicon для вкладки:
inline встраивает небольшую base64-копию apple-touch-icon.png с
enodia.sh прямо в файл (не полный многоразмерный favicon.ico,
который добавил бы примерно полмегабайта к каждому отчёту ради иконки
вкладки); режим cdn вместо этого ссылается на живые иконки на
enodia.sh — этому режиму и так уже нужен интернет, чтобы отрендериться
вообще.
Сторонние ресурсы
Заголовок раздела «Сторонние ресурсы»html.assets: cdn грузит Bootstrap и, если не выставлено
html.theme: none, тему Bootswatch — обе лицензии MIT — с jsdelivr или
cdnjs в момент, когда кто-то открывает отчёт в браузере. Ни одна из них
не встроена ни в саму enodia, ни в артефакты релиза; каждый отчёт в
CDN-режиме указывает авторство обеих со ссылкой на лицензию прямо в
собственном футере.
История по многим инвентарям
Заголовок раздела «История по многим инвентарям»enodia collect -o "$(date +%F).jsonl" по расписанию уже даёт почти всё,
что нужно enodia history — директорию датированных инвентарей.
history --dir <эта директория> читает каждый *.jsonl-файл в ней и
оценивает каждый на момент его собственного сбора, выстраивая одну
временную шкалу на каждый ID таргета. См.
Справочник CLI.