No description
  • Go 94%
  • Shell 6%
Find a file
2026-07-31 09:36:07 +03:00
cmd feat: Реализация hook для кастомных скриптов отслеживания состояния 2026-07-31 08:18:55 +03:00
docs doc: Обновление и нормализация 2026-07-31 09:36:07 +03:00
hooks feat: Реализация hook для кастомных скриптов отслеживания состояния 2026-07-31 08:18:55 +03:00
internal fix: Конфигурационный файл и блокировка завершения сервиса 2026-07-31 08:59:22 +03:00
packaging fix: CI 2026-07-31 08:27:00 +03:00
.gitignore feat: Реализация hook для кастомных скриптов отслеживания состояния 2026-07-31 08:18:55 +03:00
.golangci.yml first commit 2026-07-30 15:27:27 +03:00
.woodpecker.yml fix: CI 2026-07-31 08:27:00 +03:00
CHANGELOG.md doc: Обновление и нормализация 2026-07-31 09:36:07 +03:00
config.yml.example feat: Реализация hook для кастомных скриптов отслеживания состояния 2026-07-31 08:18:55 +03:00
go.mod first commit 2026-07-30 15:27:27 +03:00
go.sum first commit 2026-07-30 15:27:27 +03:00
LICENSE first commit 2026-07-30 15:27:27 +03:00
parachute.service first commit 2026-07-30 15:27:27 +03:00
parachute@.service first commit 2026-07-30 15:27:27 +03:00
README.md doc: Обновление и нормализация 2026-07-31 09:36:07 +03:00

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 code0; любой ненулевой код считается ошибкой, решение в этом цикле не принимается (таймер сохраняется)
  • время выполнения — не более 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.