- Go 94%
- Shell 6%
| cmd | ||
| docs | ||
| hooks | ||
| internal | ||
| packaging | ||
| .gitignore | ||
| .golangci.yml | ||
| .woodpecker.yml | ||
| CHANGELOG.md | ||
| config.yml.example | ||
| go.mod | ||
| go.sum | ||
| LICENSE | ||
| parachute.service | ||
| parachute@.service | ||
| README.md | ||
Parachute
Parachute — сервис-демон на Go для мониторинга источника бесперебойного питания (ИБП) через SNMP и корректного завершения работы сервера при длительном питании от батарей.
Назначение
Приложение предназначено для серверов, подключённых к ИБП. Parachute периодически опрашивает ИБП по SNMP и отслеживает, работает ли сервер от батарей. Если питание от батарей длится непрерывно дольше заданного времени (по умолчанию 10 минут), Parachute инициирует корректное завершение работы сервера. Это позволяет избежать потери данных при внезапном отключении питания после полного разряда батарей ИБП.
Помимо ИБП, Parachute умеет вызывать внешние команды (хуки) — например, для завершения сервера при выходе из строя одного из блоков питания (dual-PSU через IPMI).
Ключевые возможности
- SNMP-мониторинг ИБП по протоколу SNMPv1/v2c
- Настраиваемые OID — поддержка любых ИБП через конфигурацию
- Три режима завершения —
fix(по времени),loss(по порогу значения),mixed(оба условия) - Внешние хуки (
hook_command) — произвольная команда, stdout которой задаёт значение дляloss/mixed - Автоматическое завершение работы сервера по истечении таймаута
- Проверка перед выключением — подтверждение, что ИБП всё ещё на батареях
- Dry-run режим — тестирование без реального выключения
- Гибкая конфигурация — CLI-аргументы, переменные окружения, YAML/JSON-файлы
- Логирование JSONL в stdout или файл (с ротацией через logrotate)
- systemd-интеграция — готовый unit-файл (в т.ч. template для нескольких ИБП)
Платформы: демон
parachute— только Linux (systemd,/bin/sh, специфичные syscalls в хуках). Утилита диагностикиparachute-checkкроссплатформенная — в релизах естьparachute-check-windows-amd64.exeдля проверки SNMP с Windows-рабочей станции.
Быстрый старт
# Установка
go install git.ymnuktech.ru/ymnuk/parachute/cmd/parachute@latest
# Запуск в dry-run режиме для проверки
sudo parachute --dry-run --interval 30s --shutdown-delay 10m
# Запуск с конфигурационным файлом
sudo parachute --config /etc/parachute/config.yaml
Внешние хуки
В режимах loss/mixed Parachute может получать значение не только от ИБП по SNMP, но и из внешней команды (hook_command). Это позволяет выключать сервер по любому критерию — например, при выходе из строя одного из блоков питания (dual-PSU через IPMI).
Контракт хука
Хук — это любая исполняемая команда, которая вызывается через /bin/sh -c. Требования:
- stdout — одно целое число (может быть с переводом строки или пробелами, они отбрасываются)
- stderr — игнорируется
- exit code —
0; любой ненулевой код считается ошибкой, решение в этом цикле не принимается (таймер сохраняется) - время выполнения — не более
hook_timeout; по истечении команда (и её дочерние процессы) принудительно завершаются - сериализация — вызовы не накладываются: следующий стартует только после завершения предыдущего
Решение о выключении: если значение из stdout ≤ shutdown_charge_threshold — сервер выключается (после повторного запуска хука в качестве double-check).
Пример: dual-PSU через IPMI
Готовый скрипт-образец — hooks/psu_count.sh:
#!/bin/sh
ipmitool sdr 2>/dev/null | grep -c "PSU.*Present"
# /etc/parachute/config.yaml
shutdown_mode: loss
shutdown_charge_threshold: 1 # выключиться, когда живых БП <= 1
hook_command: /etc/parachute/hooks/psu_count.sh
hook_timeout: 10s
hook_value_name: psu_count
Работает так:
| Значение хука | Живых БП | Решение |
|---|---|---|
2 |
2 | работаем дальше |
1 |
1 | 1 <= 1 → double-check → shutdown |
0 |
0 | 0 <= 1 → double-check → shutdown |
Подробнее о сценариях — в docs/usage.md.
Документация
| Раздел | Файл | Описание |
|---|---|---|
| Архитектура | docs/architecture.md | Устройство и поток выполнения |
| Конфигурация | docs/configuration.md | Все параметры, OID, примеры |
| Использование | docs/usage.md | CLI, systemd, сборка |
| Внедрение | docs/deployment.md | Установка deb/rpm, конфигурация, хуки |
| Разработка | docs/development.md | Сборка, тесты, структура |
Требования
- Go 1.26.5 или новее (для сборки из исходников)
- ИБП с поддержкой SNMP (сетевой картой управления)
- Linux с systemd (для работы в качестве демона)
Лицензия
MIT License. См. файл LICENSE.