apcupsd

Пакет apcupsd позволяет мониторить состояние UPS фирмы APC (и примкнувших к ней), а также позволяет вовремя завершить работу ОС. Поддерживает не только простые (dumb) UPS компании APC, но и более «разумные» (smart), подключаемые как по фирменному «последовательному» кабелю, так и USB и Ethernet модели. Поддерживаются модели с SNMP управлением (хотя в этом случае вы можете управлять устройством напрямую). Кроме простейшей конфигурации (один UPS - один компьютер) поддерживаются конфигурации с удаленным управлением (компьютер питается от UPS, но управляет данным UPS другой компьютер), питание нескольких компьютеров от одного UPS (один из компьютеров управляет UPS по кабелю или SNMP, остальные опрашивают состояние UPS у него) и управление несколькими UPS с одного компьютера (все питаемые от данных UPS компьютеры опрашивают данный компьютер). Можно подключать UPS к компьютерам под управлением Linux (Fedora, Debian, Slackware), FreeBSD, NetBSD, OpenBSD, HP/UX, Solaris и MS Windows под Cygwin (последовательный порт, USB, SNMP).

Разработчики предоставляют готовые rpm-пакеты для Red Hat (при обновлении рекомендуется удалить и поставить заново, иначе могут быть проблемы со скриптом halt) и бинарники для MS Windows XP. При установке модифицируется /etc/rc.d/init.d/halt (вставляется apcupsd –killpower для отключения UPS, иначе при «досрочном» появлении питания компьютер не загрузится), его надо проверить (и удалить, если компьютер не управляет питающий UPS). Сборка из исходных текстов также проста и стандартна (распаковываем; ./configure; make; make install), только надо не забыть остановить и удалить предыдущую версию.

Основные настройки задаются в файле /etc/apcupsd/apcupsd.conf, каждая строка которого определяет значение одного параметра. Основные параметры:

UPSNAME имя
UPSTYPE тип-управляющего-соединения (dumb, apcsmart, net, usb, snmp, test)
UPSCABLE тип-кабеля (simple, smart, usb, ether, модель фирменного кабеля)
DEVICE имя-устройства (/dev/ttyS0, /dev/hiddev0, 192.168.0.1:3551)
LOCKFILE имя-каталога (/var/lock; в этом каталоге будут создаваться блокирующие файлы доступа к последовательным или USB портам)
NETSERVER on (включение NIS сервера - см. ниже)
NISIP 0.0.0.0 (IP адрес для входящих соединений; можно 127.0.0.1)
NISPORT 3551 (входной порт NIS сервера)
EVENTSFILE имя-файла (журнал событий для NIS сервера)
EVENTSFILEMAX максимальный-размер-в-КБ
NETTIME 60 (интервал опроса NIS-сервера клиентом)
ONBATTERYDELAY 6
BATTERYLEVEL 5 (минимальный уровень зарядки батареи в процентах, после которого начинается выключение)
MINUTES 3 (минимальное количество минут, оставшихся до исчерпания батареи, после которого начинается выключение; основывается на мнении UPS)
TIMEOUT 0 (если не 0, то выключение начинается после указанного числа секунд работы на батарее без учёта уровня зарядки)
ANNOY 60 (интервал между призывами к пользователям прекратить работу)
ANNOYDELAY 300 (задержка между переходом на работу от батареи и первым призывом завершать работу)
NOLOGON disable (не давать начинать новый сеанс работы при работе от батареи; disable - отключить ограничение; timeout - запрещать новый сеанс по истечении 90%, заданого в TIMEOUT; percent - запрещать новый сеанс по достижению 110% уровня зарядки, заданного BATTERYLEVEL; minutes - запрещать новый сеанс по достижению 110% минут, указанных в MINUTES; always - запрещать сразу)
NOLOGINDIR имя-каталога (в этом каталоге создаётся файл nologin - именно наличие этого файла в /etc запрещает новый сеанс в UNIX)
KILLDELAY 0
SCRIPTDIR /etc/apcupsd
PWRFAILDIR имя-каталога (в этом каталоге - /etc/apcupsd - создаётся файл powerfail, как признак сбоя питания, который используется в изменённом скрипте /etc/init.d/halt для выключения UPS после выключения системы)
STATTIME 60 (секунд между обновлением файла состояния или записями в syslog)
STATFILE имя-файла
DATATIME 60 (секунд между обновлением краткого файла данных, см. ниже)
LOGSTATS on (выводить подробное состояние через syslog)
FACILITY DAEMON (от имени какой службы выводить состояние в syslog)

Опрос клиентскими компьютерами сервера, к которому подключён UPS, осуществляется по протоколу NIS (не путать со стандартным NIS!), порт по умолчанию 3551/tcp. Сервер должен иметь включённым параметр NETSERVER, для клиентов задаётся UPSCABLE равным ether, UPSTYPE - net. Порт на сервере задаётся параметром NISPORT, прослушиваемый IP адрес - NISIP. Не надо забывать открыть сетевой экран (никакой защиты нет, а apcupsd работает от root-а), есть поддержка tcpwrapper (какое имя программы?). Адрес и порт сервера задаётся на клиенте параметром DEVICE, интервал опроса - NETTIME (не устанавливать более 30 секунд!). Рекомендуется устанавливать параметры BATTERYLEVEL, MINUTES и TIMEOUT на клиенте так, чтобы клиент выключался раньше сервера. Клиент, в свою очередь, может являться сервером для других компьютеров.

Поддерживается протокол PowerChute Network Shutdown для включения в сеть мониторинга фирмы APC (модули AP9617) - драйвер PCNET. Не пробовал.

Имеется также режим Master/Slave, который признан устаревшим и здесь не описывается.

Режим модификации eeprom убран из apcupsd, для последовательного соединения можно пользоваться apctest, остальным - ждать.

Журнал событий записывается в файл /var/log/apcupsd.events (имя файла задаётся параметром EVENTSFILE), а текущее состояние ежеминутно записывается в /var/log/apcupsd.status (имя файла задаётся параметром STATFILE, интервал в минутах - параметром STATTIME).

Информация о событиях также записывается в syslog и выводится с помощью wall (тексты сообщений для wall и syslog не совпадают!). Отладочная информация (необходимо явно включить при сборке) выдается в syslog на уровне серьёзности DEBUG; данные о напряжении, температуре и т.д. (только для Smart и выше) в кратком виде - на уровне INFO; подробное текущее состояние - NOTICE; события - на уровнях WARNING (запуск и останов), ERR (потеря связи с UPS), CRIT (переход на питание от батарей) и ALERT (выключение компьютера). Источник сообщения для syslog - DAEMON, задается параметром FACILITY. В строке краткой информации для SmartUPS через запятую выводятся:

000.0 (нижний порог входного напряжения)
000.0 (верхний порог входного напряжения)
выходное напряжение
напряжение батареи
частота
нагрузка (%)
температура UPS
000.0 (внешняя температура)
000.0 (влажность)
входное напряжение
уровень зарядки
попеременно 0 и 1

В подробном текущем состоянии на каждой строке выводится значение одного параметра в виде: имя, двоеточие, значение. Основные параметры (изменяются в зависимости от типа UPS):

APC : номер-версии,количество-строк,количество-байт
DATE : время выдачи состояния
HOSTNAME : DNS имя сервера
RELEASE : версия apcupsd
VERSION : версия сборки apcupsd
UPSNAME : имя в apcupsd.conf
CABLE : тип управляющего кабеля
MODEL : модель UPS
UPSMODE : Stand Alone
STARTTIME: время запуска apcupsd
STATUS : текущее состояние (ONLINE, ONBATT, NOBATT и т.д.)
LINEV : входное напряжение
LOADPCT : уровень нагрузки
BCHARGE : уровень зарядки
TIMELEFT : предполагаемое время работы на батарее
MBATTCHG : значение BATTERYLEVEL в apcupsd.conf
MINTIMEL : значение MINUTES в apcupsd.conf
MAXTIME : значение TIMEOUT в apcupsd.conf
OUTPUTV : выходное напряжение
SENSE : чувствительность UPS к изменениям входного напряжения
DWAKE : сколько секунд будет ждать UPS после возобновления питания до включения нагрузки
DSHUTD : интервал задержки UPS-ом исполнения команды выключения питания
LOTRANS : нижняя граница допустимого напряжения
HITRANS : верхняя граница допустимого напряжения
RETPCT : минимальный уровень зарядки батареи после возобновления питания до включения нагрузки
ITEMP : температура UPS
ALARMDEL : период задержки подачи сигнала при пропадании питания (Always)
BATTV : напряжение на батарее
LINEFREQ : частота входного напряжения
LASTXFER : причина последнего изменения состояния
NUMXFERS : количество изменений состояния
TONBATT : время работы от батареи текущее
CUMONBATT: время работы от батареи суммарное
XONBATT : время последнего перехода на работу от батареи
XOFFBATT : время последнего перехода на работу с батареи на сеть
LASTSTEST: время последнего самотестирования
SELFTEST : производилось ли самотестирование UPS последние 5 минут и результат
STATFLAG : 0x07000008 Status Flag
SERIALNO : серийный номер UPS
MANDATE : дата изготовления UPS
BATTDATE : дата изготовления батареи (необходимо менять вручную)
NOMOUTV : номинальное выходное напряжение
NOMBATTV : нормальное напряжение батареи
FIRMWARE : версия firmware
APCMODEL : модель UPS для аналогов
END APC : время выдачи состояния

При каждом событии вызывается скрипт /etc/apcupsd/apccontrol, которому первым параметром передаётся имя события; вторым параметром - имя UPS (задаётся в apcupsd.conf); третьим параметром - если данный компьютер управляет UPS, то 1, иначе 0; четвёртым параметром - 0 (в будущем предполагается передавать питается ли компьютер от этого UPS). Если в директорию /etc/apcupsd/ положить скрипт (или программу) с именем, совпадающим с именем события, то он будет запущен на исполнение перед действием по умолчанию (необходимы права на исполнение). Скрипту (программе) передаются те же параметры, что и apccontrol, кроме имени события. Если скрипт возвращает 99, то действие по умолчанию не производится. Скрипт вызывается до того, как состояние будет доступно из файла status или через NIS сервер.

Имена событий: annoyme (запланировано отключение и истёк интервал перед предупреждением (ANNOYME)
changeme (UPS работает от сети, но батарея не работает и её надо заменить)
commfailure (потеряно управляющее соединение с UPS)
commok (восстановлено управляющее соединение с UPS)
doreboot (устарело)
doshutdown (UPS работает от батареи и пора отключаться)
emergency (немедленно выключить компьютер, т.к. UPS неисправен)
failing (UPS работает от батареи и батарея заканчивается)
loadlimit (UPS работает от батареи и заряд батареи упал ниже заданного)
mainsback (UPS перешёл на работу от сети)
onbattery (UPS перешёл на работу от батареи, задержка задаётся ONBATTERYDELAY)
offbattery (UPS вернулся от работы от батареи)
powerout (пропало питание в сети или самотестирование)
remotedown (UPS работает на батарее и с ним пропала связь, например, выключился управляющий компьютер)
restartme(устарело)
runlimit (UPS работает от батареи и осталось меньше времени, чем указано в MINUTES)
timeout (UPS работает от батареи дольше, чем указано в TIMEOUT)
startselftest (UPS начал самотестирование)
endselftest (UPS завершил самотестирование)
battdetach (батарея отсоединена)
battattach (батарея подключена обратно)
mastertimeout (?)
masterconnect (?)

Типичная последовательность событий на управляющем компьютере при кратковременном пропадании электричества в сети:

powerout onbattery (через 5 секунд) … offbattery mainsback Последовательность событий на управляющем компьютере при длительном пропадании электричества в сети:

powerout onbattery (через 5 секунд) failing или timeout или loadlimit или runlimit
doshutdown создаётся файл /etc/apcupsd/powerfail
/sbin/shutdown -h now # apcupsd продолжает работать
apcupsd получает сигнал завершить работу от /etc/rc.d/… выполняется модифицированный /etc/rc.d/init.d/halt файловые системы переводятся в режим «только чтение» /etc/apcupsd/apccontrol killpower apcupsd –killpower # посылает UPS сигнал отключения питания

Определение типа и имени USB-устройства для записи в apcupsd.conf
UPSCABLE usb
UPSTYPE usb
проверить USB подключение к управляющему компьютеру (драйвер д.б. usbhid или hid), cat /proc/bus/usb/devices
S: Manufacturer=American Power Conversion

S: Product=Smart-UPS 3000 RM FW:666.6.I USB FW:2.4 S: SerialNumber=… I: If#= 0 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=00 Prot=00 Driver=usbhid * проверить наличие драйверов: ls -1 /sys/bus/usb/drivers hiddev hub usb usbfs usbhid проверить наличие устройства hiddev:
ls -l /dev/hiddev*
получить информацию о цепочке подключения: udevinfo -a -p /sys/class/usb/hiddev0/
если к компьютеру по USB подключен только один UPS, то параметр DEVICE можно оставить пустым (или вписать любую ерунду) - apcupsd самостоятельно найдёт нужное устройство

При желании дать устройству уникальное имя и указать его в строке DEVICE (например, /dev/ups1000) в Debian GNU/Linux необходимо (перед подключением устройства!) добавить в файл /etc/udev/rules.d/50-udev.rules строчку:

KERNEL==«hiddev*», BUS==«usb», SYSFS{serial}==«AS0319230618», SYMLINK+=«ups1000» Увы, при отключении USB устройства пропадает соответствующий hiddev* (и ссылка на него). Управляющий этим UPS процесс apcupsd переключается на первый подходящий hiddev и обратно уже не возвращается.

Автоматический запуск в Debian GNU/Linux обеспечивается стандартными средствами

После установки сложной системы из многих UPS, серверов и клиентов рекомендуется проводить учения, чтобы убедиться в правильности отключения компьютеров: убедиться в наличии процессов apcupsd (ps)
наличие записей в журнале (apcupsd и apcserver)
service apcupsd status
наличие реакции на разрыв управляющего соединения между UPS и сервером (и какова реакция клиентов)
наличие реакции на временное отключение питания
правильное отключение систем по исчерпанию батареи (UPS также должен выключиться)

Утилита «apcaccess status» позволяет посмотреть текущее состояние UPS (содержимое apcupsd.status). Имя и порт NIS-сервера задаётся вторым параметром. Имеется (но не работает) возможность посмотреть значения параметров в eeprom: «apcaccess eeprom».

Утилита apctest позволяет (предварительно остановить apcupsd) запустить самотестирование, посмотреть и изменить дату батареи, посмотреть дату изготовления. Для UPS с последовательным кабелем можно программировать eeprom и войти в терминальный режим.

Утилита powerflute выдаёт красивую картинку (ncurses) о текущем состоянии UPS (которого из них?) и позволяет его выключить.

Пакет apcupsd-multimon содержит набор cgi-скриптов (не смотрел).