На 1 из обьектов, в серверную, был приобретен UPS APC Smart-UPS 1000 RM. Куплен он был для обслуживания 2ух серверов, один из которых на базе Windows 2003 (ip 10.0.0.2), второй - на базе FreeBSD 5.3. (ip 10.0.0.1).
Оба сервера требовалось подключить к данному UPS, обеспечив корректное завершение работы системы в случае окончания срока работы батарей. Также требовалось оповещение пользователей домена AD о проблемах с питанием в серверной.
UPS имеет интерфейс USB и COM, но в комплекте прилогался только USB шнур. Сначала я попытался использовать родное ПО данного UPS. И вскоре убедился, что оно совершенно не предназначено для нормальной работы.
Основные проблемы встроенного ПО:
* Непозволяетназначатьдействия (например, запуск внешних программ) на возникащие события.
* Монстроидально.Данныйшедевр разработчики APC написали на Java+Win32 API. Причем ПО разбито на Агента (сбор данных) + Сервер (работа с агентами) + Консоль (управление сервером). Кроме того при этом я получил не отключаемый web server и 40 Mb отожранной памяти (сервер+агент).
* Отсутствие поддержки BSD. Из поддержки OSS систем есть только поддержка Linux (причем ТОЛЬКО агент и тоже на Java+JNI!), работа по стандартным протоколам (snmp) отсутствует.
Apcupsd
Убедившись в невозможности встроенного ПО решить поставленную задачу я решил воспользоваться программой Apcupsd (http://www.apcupsd.com/). Начиная с версии 3.10.17 в ней реализована работа с USB UPS в BSD системах. Также доступна win32 версия программы (на базе cygwin). Apcupsd позволяет работать в режиме клиент/сервер, что и требуется для данной задачи.
Установка APCUPSD на FreeBSD
Так как в APCUPSD/WIN32 не реализована работа с USB, подключаем UPS к FreeBSD серверу. Устанавливаем apcupsd из портов:
Для корректной работы usb ups с apcupsd необходимо закомментировать в файле конфигурации ядра устройство uhid и пересобрать ядро. После установки ядра перезагружаем машину. UPS должен быть виден в системе как устройство /dev/ugen0.
Для проверки работоспособности набираем apcaccess - это должно выдать нам статистику UPS. Если всё работает - самое время перейти к настройке windows.
Установка APCUPSD на Windows 2003
Скачав на сайте скомпиленный win32 бинарник, я распаковал архив в папку c:\apcupsd. После чего запустил c:\apcupsd\bin\setup.bat для создания win32 сервиса. Конфигурация apcupsd/win32 находится в файле \apcupsd\etc\apcupsd\apcupsd.conf.
Пример конфигурации apcupsd на Windows:
UPSCABLE ether
UPSTYPE apcsmart
DEVICE
LOCKFILE /apcupsd/etc/apcupsd
ONBATTERYDELAY 6
BATTERYLEVEL 5
MINUTES 3
TIMEOUT 0
ANNOY 300
ANNOYDELAY 60
NOLOGON disable
KILLDELAY 0
NETSERVER on
NISIP 10.0.0.2
NISPORT 3551
EVENTSFILE /apcupsd/etc/apcupsd/apcupsd.events
EVENTSFILEMAX 10
UPSCLASS netslave
UPSMODE net
NETPORT 6666
# IP BSD сервера
MASTER 10.0.0.1
STATTIME 0
STATFILE /apcupsd/etc/apcupsd/apcupsd.status
LOGSTATS off
DATATIME 0
Запускаемapcupsd командойnet start apcupsd. Проверяем работу запуском apcaccess. Через некотое время сервис должен присоединиться к серверу (у меня почему-то этот процесс проходит больше минуты). В файле \apcupsd\etc\apcupsd\apccontrol расположены команды, выполняемые при срабатывании событий. В секцию onbattery я добавил строку
/windows/system32/net.exe send /DOMAIN "WARNING: Server running on UPS battaries"
для оповещения пользователей домена о проблемах. По непонятной мне причине, будучи запущенным от пользвателя system, сервис не выполнял оповещение. После изменения пользователя сервиса оповещения сталирассылаться.
Итог
Все работает так как и требовалось изначально. При желании к apcupsd можно прикрутить web интерфейс, mrtg и прочие рюшечки и свистелки.