Наблюдаем за BIRD на OpenWrt: метрики, ubus и страница в 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:
status— структурированный снимок: демон, протоколы, области, интерфейсы и соседи OSPF, BGP-сессии, BFD, AS-пути;route— поиск одного адреса или префикса со всеми ECMP next hop;query— сырая передача команды для всего остального;set_ospf_cost— изменить стоимость OSPF одного интерфейса на лету.
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.