From: Alex Samorukov
Newsgroups: email
Date: Mon, 25 May 2005 14:31:37 +0000 (UTC)
Subject: Использование apcupsd в гетерогенных сетях.
Предистория
На 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. После этого:
# cd /usr/local/etc/rc.d;cp apcupsd.sh.sample apcupsd.sh
Теперь правим конфигурацию apcupsd (/usr/local/etc/apcupsd/apcupsd.conf).
Пример конфигурации apcupsd на FreeBSD:
UPSCABLE usb
UPSTYPE usb
DEVICE
LOCKFILE /var/spool/lock
BATTERYLEVEL 5
MINUTES 3
TIMEOUT 0
ANNOY 300
ANNOYDELAY 60
NOLOGON disable
KILLDELAY 0
NETSERVER on
NISIP 10.0.0.1
NISPORT 3551
EVENTSFILE /var/log/apcupsd.events
EVENTSFILEMAX 10
UPSCLASS netmaster
UPSMODE net
NETPORT 6666
#ip адрес windows машины
slave 10.0.0.2
STATTIME 0
STATFILE /var/log/apcupsd.status
LOGSTATS off
DATATIME 0
Для корректной работы usb ups с apcupsd необходимо закомментировать в
файле конфигурации ядра устройство uhid и пересобрать ядро.
После установки ядра перезагружаем машину. UPS должен быть виден в
системе как устройство /dev/ugen0.
Для проверки работоспособности набираем apcaccess - это должно выдать
нам статистику UPS. Если всё работает - самое время перейти к
настройке windows.
Установка APCUPSD на Windows 2003
Скачав на сайте скомпиленный win32 бинарник, я распаковал архив в
папку c:apcupsd. После чего запустил c:apcupsdbinsetup.bat для
создания win32 сервиса. Конфигурация apcupsd/win32 находится в файле
apcupsdetcapcupsdapcupsd.conf.
Запускаем apcupsd командой net start apcupsd. Проверяем работу
запуском apcaccess. Через некотое время сервис должен присоединиться к
серверу (у меня почему-то этот процесс проходит больше минуты). В
файле apcupsdetcapcupsdapccontrol расположены команды, выполняемые
при срабатывании событий. В секцию onbattery я добавил строку
/windows/system32/net.exe send /DOMAIN "WARNING: Server running on UPS battaries"
для оповещения пользователей домена о проблемах. По непонятной мне
причине, будучи запущенным от пользвателя system, сервис не выполнял
оповещение. После изменения пользователя сервиса оповещения стали
рассылаться.
Итог
Все работает так как и требовалось изначально. При желании к apcupsd
можно прикрутить web интерфейс, mrtg и прочие рюшечки и свистелки.