Нашел альтернативный проект apcupsd, завелось все из коробки с небольшими настройками. У меня к одному компьютеру, задача которого отвечать за мониторинг, поключены по USB оба бесперебойника ippon winner 3000. На нем же находится и Zabbix. В детали Zabbix-а вдаваться не будем, скажу лишь что он достоен отдельной статьи и не одной. Процесс расписывать не вижу смысла, таких статей предостаточно. Просто приведу готовые конфиги. Устанавливаем сам пакет:
$sudo apt-get install apcupsd
Все файлы настройки и скрипты по умолчанию находятся по умолчанию в /etc/acpupsd/ Прошу особое внимание обратить на названия статус и конфиг файлов.
UPSTYPE usb
DEVICE /dev/usb/hiddev0
LOCKFILE /var/lock
SCRIPTDIR /etc/apcupsd
PWRFAILDIR /etc/apcupsd
NOLOGINDIR /etc
ONBATTERYDELAY 6
BATTERYLEVEL 5
MINUTES 3
TIMEOUT 0
ANNOY 300
ANNOYDELAY 60
NOLOGON disable
KILLDELAY 0
NETSERVER on
NISIP 127.0.0.1
NISPORT 3551
EVENTSFILE /var/log/apcupsd/apcupsd-ippon0.events
EVENTSFILEMAX 10
UPSCLASS standalone
UPSMODE disable
STATTIME 60
STATFILE /var/log/apcupsd/apcupsd-ippon0.status
LOGSTATS off
DATATIME 0
UPSTYPE usb
DEVICE /dev/usb/hiddev1
LOCKFILE /var/lock
SCRIPTDIR /etc/apcupsd
PWRFAILDIR /etc/apcupsd
NOLOGINDIR /etc
ONBATTERYDELAY 6
BATTERYLEVEL 5
MINUTES 3
TIMEOUT 0
ANNOY 300
ANNOYDELAY 60
NOLOGON disable
KILLDELAY 0
NETSERVER on
NISIP 127.0.0.1
NISPORT 3552
EVENTSFILE /var/log/apcupsd/apcupsd-ippon1.events
EVENTSFILEMAX 10
UPSCLASS standalone
UPSMODE disable
STATTIME 60
STATFILE /var/log/apcupsd/apcupsd-ippon1.status
LOGSTATS off
DATATIME 0
Для запуска использую простой скрипт
#!/bin/bash
[ -n "`pgrep apcupsd`" ] && killall apcupsd ;
sleep 5 ;
UPS_DAEMON="/sbin/apcupsd"
for CONF_FILE in /etc/apcupsd/apcupsd*conf
do
$UPS_DAEMON -f $CONF_FILE
echo $UPS_DAEMON -f $CONF_FILE
done
Он запускает демон apcupsd с каждым конфигурационным файлом «apcupsd*conf». Идем в каталог /var/log/apcupsd и изучаем его содержимое, если все прошло успешно, содержимое его должно выглядеть так:
apcupsd-ippon0.events
apcupsd-ippon0.status
apcupsd-ippon1.events
apcupsd-ippon1.status
Из названий понятно что файлы с расширением events отвечает за события демона, аля запуск-остановка и т.д. Для нас больший интерес представляет файлы с расширениями status. Приведу содержимое с пояснениями одного из них. Забегая вперед скажу что внешняя обработка заббих будет брать информацию именно из этих файлов.
APC : 001,031,0762 - номер-версии,количество-строк,количество-байт DATE : 2016-01-19 20:25:01 +0300 - время получения информации от ИБП HOSTNAME : zavdiag - DNS имя сервера VERSION : 3.14.10 (13 September 2011) debian - версия сборки apcupsd UPSNAME : zavdiag - имя из apcupsd.conf CABLE : USB Cable - тип управляющего кабеля DRIVER : USB UPS Driver - имя драйвера UPSMODE : Stand Alone STARTTIME: 2016-01-19 14:40:36 +0300 - Когда стартовал демон apcupsd MODEL : HID UPS - Модель STATUS : ONLINE - текущее состояние (ONLINE, ONBATT, NOBATT и т.д.), извлекается из ИБП LOADPCT : 12.0 Percent Load Capacity - уровень нагрузки в процентах от VA, извлекается из ИБП BCHARGE : 100.0 Percent - процент зарядки батареи извлекается из ИБП TIMELEFT : 62.4 Minutes - предполагаемое время работы на батарее, извлекается из ИБП MBATTCHG : 5 Percent - значение BATTERYLEVEL в apcupsd.conf MINTIMEL : 3 Minutes - значение MINUTES в apcupsd.conf MAXTIME : 0 Seconds - значение TIMEOUT в apcupsd.conf OUTPUTV : 216.0 Volts - выходное напряжение, извлекается из ИБП DWAKE : -01 Seconds - сколько секунд будет ждать UPS после возобновления питания до включения нагрузки, извлекается из ИБП (думаю что отображается неверно) LOTRANS : 176.0 Volts - нижняя граница допустимого напряжения, извлекается из ИБП HITRANS : 264.0 Volts - верхняя граница допустимого напряжения, извлекается из ИБП ALARMDEL : 30 seconds - период задержки подачи сигнала при пропадании питания, извлекается из ИБП LINEFREQ : 50.0 Hz - частота входного напряжения, извлекается из ИБП NUMXFERS : 0 - количество изменений состояния, извлекается из ИБП TONBATT : 0 seconds - время работы от батареи текущее, извлекается из ИБП CUMONBATT: 0 seconds - время работы от батареи суммарное, извлекается из ИБП XOFFBATT : N/A - время последнего перехода на работу с батареи на сеть SELFTEST : NO - результат самотестирование ИБП (OK, BT - мал заряд, BG - перегрузка, NO - не запускался последние 5 минут), извлекается из ИБП STATFLAG : 0x07000008 Status Flag - битовая строка состояния, извлекается из ИБП SERIALNO : S42140618978 - серийный номер ИБП, извлекается из ИБП NOMPOWER : 2700 Watts - номаинальная мощность в Ваттах (активная?), извлекается из ИБП END APC : 2016-01-19 20:25:02 +0300 - время выдачи состояния</blockquote>
Более полную информацию можно посмотреть здесь
Там же можно найти подробности по конфигурации apcupsd.
Редактируем файлы скриптов, вписываем свой адрес электронной почты:
Вкратце опишу назначения скриптов:
changeme — вызывается когда батарея требует замены
commfailure — вызывается когда связь с блоком утеряна
commok — вызывается когда связь с блоком восстановлена
onbattery — вызывается при переходе на питание от бараеи
offbattery — вызывается при переходе с батареи
killpower — вызывается перед выключением
На этом настройка apcupsd закончена. Если в кратце то процесс происходит так: демон опрашивает устройства UPS, вызывает соответствующий скрипт при изменении состояния и формирует файлы состояния. Теперь осталось все это привязать к Zabbix-у.
Единственный логичный способ, на мой взгляд, занести данные в заббих используя внешнюю проверку.
Для этого используем скрипт который будет парсить файл состояния и получать значения заданных параметров. В моем случае и агент и сервер заббикса будут находится на одном компьютере. Агент слушает порт 10050 сервер 10051. Нам необходимо выяснить каталог где рассполагаются файлы внешних проверок. Для этого ищем в файле конфигурации сервера /etc/zabbix/zabbix_server.conf строку ExternalScripts=/usr/lib/zabbix/externalscripts. В этот каталог и ложим файл проверок. Не используйте не вкоем случае в имени файла точки, даже если это bash-скрипт! Сначала я написал скрипт вот такого вида:
#!/bin/bash
if [[ $1 == ippon? ]] && [ -f "/var/log/apcupsd/apcupsd-$1.status" ] ;
then
case $2 in
BCHARGE)
cat /var/log/apcupsd/apcupsd-$1.status | grep 'BCHARGE' | awk '{print $3}'
;;
OUTPUTV)
cat /var/log/apcupsd/apcupsd-$1.status | grep 'OUTPUTV' | awk '{print $3}'
;;
LOADPCT)
cat /var/log/apcupsd/apcupsd-$1.status | grep 'LOADPCT' | awk '{print $3}'
;;
DWAKE)
cat /var/log/apcupsd/apcupsd-$1.status | grep 'DWAKE' | awk '{print $3}'
;;
STATFLAG)
cat /var/log/apcupsd/apcupsd-$1.status | grep 'STATFLAG' | awk '{print $3}'
;;
STATUS)
cat /var/log/apcupsd/apcupsd-$1.status | grep 'STATUS' | awk '{print $3}'
;;
XOFFBATT)
cat /var/log/apcupsd/apcupsd-$1.status | grep 'XOFFBATT' | awk '{print $3}'
;;
TONBATT)
cat /var/log/apcupsd/apcupsd-$1.status | grep 'TONBATT' | awk '{print $3}'
;;
TIMELEFT)
cat /var/log/apcupsd/apcupsd-$1.status | grep 'TIMELEFT' | awk '{print $3}'
;;
esac
fi
В каталоге /etc/zabbix/zabbix_agentd.d создаем файл userparameter_apcupsd.conf с содержимым
UserParameter=apcupsd[*],/usr/lib/zabbix/externalscripts/apcupsd $1 $2
Перезапускаем агента:
$sudo service zabbix-server restart
Однако на оффсайте Zabbix-а есть предупреждение
Не злоупотребляйте внешними проверками! Они могут привести к значительному снижению производительности Zabbix системы.
А поскольку я не только админ, но еще и пописываю, было решено переписать внешнюю проверку на Cи. А кто его знает когда мы в эту производительность упремся.
Создаем файл apcups.c с содержимым:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
char ValueParam[30];
char *GetValue(char *NameVar, char *FileName)
{
FILE *fconfig=fopen(FileName,"r");
char fileline[255];
unsigned char FLAGDDOT=0,FLAGSPACEB=0;
memset(ValueParam,0,sizeof(ValueParam));
while(!feof(fconfig))
{
fgets (fileline, 255, fconfig);
if(strncmp(fileline,NameVar,strlen(NameVar))==0)
{
for(int i=0;i<strlen(fileline);i++)
{
if(fileline[i]!=':' && FLAGDDOT==0) continue;
if(FLAGDDOT==0)
{
FLAGDDOT=1;
continue;
}
if(fileline[i]==' ' && FLAGSPACEB==0) continue;
if(fileline[i]==' ' && FLAGSPACEB==1) break;
if(FLAGSPACEB==0) FLAGSPACEB=1;
ValueParam[strlen(ValueParam)]=fileline[i];
ValueParam[strlen(ValueParam)+1]=0;
}
if(strlen(ValueParam)>0) break;
}
}
fclose(fconfig);
return ValueParam;
}
void main(int argc, char* argv[])
{
//argv[1] - hostname argv[2] - param
char fname[255];
//Проверяем начинается ли имя хоста с "ippon" и предано ли 2 аргумента
if((argc==3) && (strncmp(argv[1],"ippon",5)==0) )
{
memset(fname,0,sizeof(fname));
strcpy(fname,"/var/log/apcupsd/apcupsd-");
strcat(fname,argv[1]);
strcat(fname,".status");
//Проверяем есть ли соответствующий конфигурационный файл
// /var/log/apcupsd/apcupsd-ipponX.status
if(access( fname, F_OK ) != -1)
{
puts(GetValue(argv[2],fname));
}
}
return;
}
Компиляцию производим так:
gcc apcupsd.c -o apcupsd -std=c99
Скомпилированный файл ложим в /usr/lib/zabbix/externalscripts.
Всё, осталось только импортировать шаблон для Zabbix-а.
Я не ставил себе цель сделать что то универсальное, как раз наоборот, стремился сделать необходимый минимум.
В шаблоне присутствуют (описание параметров см выше):
Для графиков сделал всего 4 параметра:
заряд батареи, текущая нагрузка, выходное напряжение и остаточное время работы на батареях.
Тригеры не вижу смысла заводить, так как скрипты демона apcupsd сами отсылают уведомление на почту. А телефон с интернетом всегда с собой. На этом все, буду рад ответить на ваши вопросы.
Спустя еще несколько дней, я выяснил очень интересные вещи, которыми поделюсь с вами. Возможно вас это избавит от многодневных творческих мучений.
Что касается проекта apcupsd, является по сути узконаправленной и заточена в основном под ИБП APC. С ней у вас больше шансов завести устройства с комбинированным подключением USB+COM при подключении по USB. В моем случае это был ippon winner 3000. Из минусов: не отображает заряд батареи и температуру. Видимо в APC этих параметров нет.
Что касается проекта NUT, является более универсальным и с ним у вас больше шансов подцепить свой редкий ИБП. Самый главный минус с комбинированным подключением USB+COM поддерживается только COM!
Комментарии (34)
big-town
20.01.2016 10:22Да принципиально, я в курсе что они существуют, не вижу смысла платить деньги за то что и так работает. Более того, сейчас есть миниПК raspberry из которых можно сделать подобные карты в пределах 1500рублей.
AcidVenom
20.01.2016 10:43+1Понимаю.
Как плюс, к этой карте можно прицепить датчик окружающей среды. Для более или менее серьезной инфраструктуры все же лучше именно этот вариант.big-town
20.01.2016 12:55Ну для моих целей как раз вполне подходит описанный вариант. Главная задача не проморгать батарею и вовремя завести генератор. А то у нас как всегда, о том что кончилась батарея узнаём когда электричество отключают. А человек ответственный за это совсем безответственный :).
yosemity
20.01.2016 19:35+1Добавьте обязательно мониторинг температуры + напряжение батарей (и алерты повесьте). Температура — критичный параметр, т.к. если умрет кулер, а он на этой модели крутится всегда, то ИБП гарантированно умрет. Напряжение батарей (там вроде — 12В х 7 = 84В) тоже важно. вдруг мозги заглючит. У меня были прецеденты, когда дурная электроника забирала с собой и батареи. Для статистки качества энергоснабжения есть смысл еще мерить входное напряжение.
big-town
20.01.2016 19:55-2Посмотрите файл /var/log/apcupsd/apcupsd-ippon0.status вы видите там эти параметры? Я не могу вывести то чего нет.
yosemity
20.01.2016 23:08+1Ippon winner 3000 умеет мониторить температуру и напряжение батарей. Значит apcupsd не понимает этих параметров. Рекомендую победить NUT.
big-town
20.01.2016 23:37Но вот будем ждать от вас публикации. Как победите так скажете. blaser_usb тупо не получает данные с ИБП. На сайте проекта этот драйвер на стадии experemental. И это статья называется apcupsd+Zabbix. А не NUT+Zabbix. И еще она так же не охватывает проблемы всей вселенной.
yosemity
21.01.2016 00:15+3Хамить не надо, я с вами нормально разговариваю и дельные вещи говорю. Если вам не нужен фидбек, то что это делает на хабре? Оставили бы у себя в txt- файлике на память. Пожалел, что плюсанул в карму.
big-town
21.01.2016 00:27-2И где в моем посте вы пардон хамство заметили? В данной статье еще и в самых первых строках я написал почему я не рассматривал NUT. И вести разговор о том что не имеет отношение к статье не вижу смысла.
Ну хорошо, давайте подискутируем, положим допилили драйвер и мы настроили NUT и получили злосчастную температуру. Работает алерт в 3:00 и что это даст? Вы подорветесь и поедите в серверную. Сколько бесперебойник проработает в серверной без кулера? Или вам важен факт что бесперебойник сдох? Утром и так об этом узнаете.yosemity
21.01.2016 01:04Не в посте, а в комментариях.
Давайте. Во-первых, не только температуру, но и напряжение батарей, во-вторых, это важные параметры, которые могут привести к отказу. Если алерт сработает в 3 ночи, то я никуда не поеду, без меня справятся, главное ЦУ давать по телефону. При потере питания энергосети, от ИБП требуется работа в течении максимум 10 минут. Проснуться, зевнуть, понять что происходит, одеться, пойти запустить генератор и переключиться на него, т.к. автозапуска нет, да и смысла в нем нет, человек присутствует 24/7/365. Сам я поеду в зависимости от настроения и того, до какого значения поднимется температура. Если она будет стабильно высокой, но не критичной, то ничего страшного, до утра терпит. Если это не так, то надо будет на ходу колхозить охлаждение или выключать упс. Отказ одного ИБП — это не катастрофа, т.к. они дублированы.
Мне важно спасти сам ИБП. Не хочу узнать утром, что беперебойник минуснулся из-за сдохшего кулера.big-town
21.01.2016 01:12-2Ну ладно с температурой более менее определились. Вам актуально а мне нет. У нас ни кто не дежурит, так упс сдохнет и с утра узнаем по вырубленным серверам. Это обсуждать не будем это проблема руководства. А что даст напряжение на батарее?
yosemity
21.01.2016 01:24А что даст напряжение на батарее?
вдруг мозги заглючит. У меня были прецеденты, когда дурная электроника забирала с собой и батареи.
При постоянном перезаряде батареи дохнут. А так есть шанс спасти хотя бы батареи.big-town
21.01.2016 01:44-1Так если электроника заглючит значит и напряжение неадакватное показывать будет. Как альтернатива есть процент зарядки.
yosemity
21.01.2016 02:56Какой процент зарядки? ИБП считает % по вольтажу акумов как раз, периодически, но довольно часто, отключая зарядку в процессе работы и замеряя напряжение на батареях. Это видно если в разрыв с батареями воткнуть амперметр. В случае постоянного перезаряда аккумов, вы этого не поймете по проценту заряда в момент отключения зарядки. Вольтаж будет выше порога срабатывания внутреннего алерта ИБП, до тех пор, пока не станет поздно. А вы мониторите именно внутренние показания процента заряда.
Плюс во время работы от батареи упс считает время в зависимости от прошлой калибровки и настройки количества дополнительных батарей. При неверной настройке легко словить случай, когда ИБП уйдет в даун даже если сможет работать еще не один час, только потому, что считает, что время вышло.big-town
22.01.2016 14:56периодически, но довольно часто, отключая зарядку в процессе работы и замеряя напряжение на батареях.
А вы уверены что это не импульсная дозарядка. Я конечно не занимался непосредственно с ИБП. Но другие нормальные зарядки работают именно так. Что бы обеспечить максимальный заряд аккумуляторов, перед их полной зарядкой, зарядка подается кратковременными импульсами.
И насколько опять же я сталкивался, напряжение на аккумуляторе всегда меряется под нагрузкой по падению напряжения на контрольном резисторе.
Может быть в ИБП не так? Если информация проверенная просветите.
big-town
21.01.2016 13:56+1Нашёл на просторах инета в man megatec.
On models with both a serial port (RS-232) and an USB port, only the serial port is supported.
Так что если хотите NUT на бесперебойниках ippon где есть оба разъема USB и COM.
NUT заведется только по COM.
RicoX
21.01.2016 16:10Я так понимаю пока вы искали решение, то плотно промониторили тему, может вам попадалось на глаза решение по мониторингу бесперебойника (ПРОГРЕСС-12-5000-HYBRID-BT), который отдает данные по Bluetooth? Предлагаемый производителем ViewPower уж очень монструозный и неудобный, я бы тоже к заббиксу лучше прикрутил, но для NUT и apcupsd не нашел вариантов как подружить.
big-town
21.01.2016 23:02К сожалению нет, не имел дела с таким ИБП. Как я понял NUT и apcupsd не очень то дружат с реликтовыми моделями. Я например сейчас столкнулся с такой проблемой ни как не хочет дружить вот такой девайс Bus 007 Device 020: ID 06da:0003 Phoenixtec Power Co., Ltd 1300VA UPS ни по USB ни по COM. Хотя может быть компорт мертвый на сервере, завтра попробую с переходником. Визуально это полная копия ippon winner 3000, но это не он. Винер 3000 имеет ID 06da:ffff.
RicoX
22.01.2016 09:26Так в том то и дело что модель не реликтовая (это гибридный инвертор на весь дом), производитель заявляет: «Работает по стандартному протоколу». Основная сложность именно в том что нет как такового USB или COM, есть BT, но напрямую пока завести не выходит, есть предположение что там эмуляция COM через ВТ. Спасибо — буду копать дальше.
big-town
22.01.2016 14:47Так если стандартный протокол, может быть, точнее я практически на 99% процентов уверен что там COM через ВТ. Устанавливайте блютузину, смотрите какой компорт создался а дальше все как с обычным комом. Неплохо бы знать конечно какой протокол используется.
moonug
22.01.2016 16:42Погуглил. ViewPower девайсы поддерживаются nutdrv_qx.
Судя по видео подключение именно через COM поверх BT.big-town
22.01.2016 17:14В статье не написано, да и мало где это пишут. Самую простую проверку можно сделать так /lib/nut/nutdrv_qx -DDDDD -a «имя девайса в конфиге ups.conf»
Минимальные настройки в ups.conf
[имя девайса]
driver = nutdrv_qx
port = /dev/ttyUSB0
Удачи, отпишитесь если получилось.
RicoX
22.01.2016 18:12Похоже вы правы, при первом просмотре не обратил внимание на
Спасибо, уже понятно куда копать и чем заняться на выходных.
alexdob
21.01.2016 18:17Если честно, то совсем не понял смысл свапа с sh на С… Сильно увеличилась производительность? Спрашиваю именно из интереса. Если уж переписывать на С, то используя trapper элемент, т.е. пушить самим к zabbix данные.
big-town
21.01.2016 23:10Всегда можно что то улучшить в любом проекте, здесь я с вами согласен, но всегда нужно взвесить трудозатраты и полученный результат. У меня например пока нет времени для того что бы писать траппер. Полно другой работы. В чем касается переход с баша на Си, ну если честно, то мне так захотелось. Ведь скрипт баша это фактически последовательное выполнение разных исполняемых файлов, а программа на Си это один исполняемый файл. Если учесть умение линукса все кешировать, то я не думаю что между скриптом и сишным файлом будет огромная разница(только при первом запуске). Но если мы можем сделать мир чуточку лучше, значит это надо сделать :).
big-town
24.01.2016 20:15+1Сегодня пришлось оживить еще и NUT, так как только с ним согласовался один бесперебойник по COM-порту. На мой взгляд информация у него куда скуднее и самое главное отсутствует параметр TIMELEFT (сколько проработает ИБП при данной нагрузке от батареи).
Вывод upcsbattery.voltage: 82.00
battery.voltage.high: 78.00
battery.voltage.low: 62.40
battery.voltage.nominal: 72.0
device.type: ups
driver.name: blazer_ser
driver.parameter.pollinterval: 2
driver.parameter.port: /dev/ttyUSB1
driver.parameter.protocol: megatec
driver.parameter.synchronous: no
driver.version: 2.7.3-158-g75a8f41
driver.version.internal: 1.57
input.current.nominal: 13.0
input.frequency: 49.9
input.frequency.nominal: 50
input.voltage: 236.9
input.voltage.fault: 175.7
input.voltage.nominal: 220
output.voltage: 209.3
ups.beeper.status: enabled
ups.delay.shutdown: 30
ups.delay.start: 180
ups.load: 20
ups.status: OL TRIM
ups.temperature: 14.2
ups.type: offline / line interactivebig-town
25.01.2016 14:32+1При более детальном изучении оказалось, это не программа не показывает значения, а их не отдает бесперебойник. В apcupsd нет поддержки обычного протокола megatec. Вообще надо сказать что apcupsd более заточены под девайсы APC. NUT является более универсальной программой. И я думаю в ряде случаев предпочтительнее использовать именно её.
AcidVenom
SNMP карту принципиально не рассматривали?