← Заметки

Наблюдаем за BIRD на OpenWrt: метрики, ubus и страница в LuCI

· openwrt, bird, ucode, prometheus, luci

На каждом роутере моей mesh-сети крутится BIRD. birdc по SSH нормально для одной коробки и утомительно для десяти, поэтому я сделал три небольших пакета, которые смотрят на BIRD с трёх сторон: Prometheus, ubus и LuCI. Все они лежат в моём фиде для OpenWrt и все написаны на ucode.

Управляющий сокет BIRD

У BIRD простой строковый протокол на unix-сокете — тот же, что использует birdc. Подключаешься, читаешь приветствие, отправляешь команду и читаешь ответ; каждая строка ответа начинается с четырёхзначного кода и - (дальше есть ещё строки) или пробела (последняя строка). С модулем socket на ucode это говорится легко, так что ни одному пакету не нужен ни birdc, ни отдельный бинарник экспортера.

Метрики: коллектор для node-exporter

В штатном prometheus-node-exporter-ucode из OpenWrt поддержки BIRD нет, поэтому в фиде лежит мой форк с коллектором bird — ставить нужно его вместо штатного пакета. Он отдаёт состояние и аптайм демона, состояние каждого протокола, счётчики импортированных/экспортированных/отфильтрованных префиксов, сессии BFD и детали OSPF. Имена метрик и лейблы повторяют upstream bird_exporter, так что готовые дашборды и алерты работают как есть, без отдельного бинарника экспортера на роутере.

ubus: rpcd-mod-bird

rpcd-mod-bird — плагин rpcd, который регистрирует ubus-объект bird. Начинался он как плагин на C, а теперь это обычный ucode:

ubus call bird status
ubus call bird route '{"prefix": "2001:db8::/48"}'
ubus call bird set_ospf_cost '{"interface": "wg0", "cost": 30}'

Самое интересное — set_ospf_cost. Он никогда не трогает /etc/bird.conf: делает рабочую копию в /tmp, меняет стоимость там, проверяет её родным configure check BIRD и только потом применяет. Переконфигурации сериализуются блокировкой, а стоимости, выставленные на других линках, сохраняются. Чтобы вернуться к значениям по умолчанию, удалите рабочую копию и выполните голый birdc configure: в BIRD 3 он (как и SIGHUP) всегда перечитывает стартовый конфиг — здесь это удобно, но об этом стоит помнить, потому что так сбрасываются стоимости, выставленные на лету.

Парсеры вывода — чистые функции с юнит-тестами на записанном выводе BIRD.

LuCI: luci-app-bird

luci-app-bird добавляет Статус → BIRD в духе страницы статуса WireGuard: демон, протоколы, интерфейсы и соседи OSPF, BGP-сессии и BFD. Страница обновляется на месте, не перестраивая таблицы. Стоимости OSPF редактируются прямо в таблице — под капотом это set_ospf_cost, — а граф топологии строится по AS-путям BGP с помощью vis-network.

Подкрутить стоимость из браузера удобно, пока у меня ещё нет автоматического контроллера качества линков из заметки про mesh.