В нашем примере мы рассмотрим мониторинг бесперебойников APC путём использования serial-кабеля и утилиты apcupsd.
Начинаем.
Подключаем кабель к com-порту машины и ups. (Сразу обращу внимание, что стандартный COM кабель не подходит. Сама APC не дает схему распайки кабеля. Будьте внимательны. Если кого-то отпугнёт цена подобного кабеля у дилера, можно попробовать самостоятельно спаять его, воспользовавшись схемой).
На машине с FreeBSD устанавливаем порт apcupsd
cd /usr/ports/sysutils/apdupsd
make install clean
В окне конфигурации достаточно оставить одну галку напротив «Compile APC SmartUPS serial driver»
После процесса установки идём в /etc/rc.conf и добавляем туда строку:
apcupsd_enabled=»YES»
для разрешения автоматического запуска при буте из /usr/local/etc/rc.d/apcupsd
Скрипты и конфиги из диры /usr/local/etc/apcupsd
changeme, commfailure, commok, offbattery, onbattery — скрипты оповещения по мылу о состояниях UPS
соответственно — требуется замена батарей, потеря связи с бесперебойником, восстановление связи с бесперебойником, появление напряжения в сети, пропадание напряжения в сети и начало работы от аккумуляторов.
В каждом из этих скриптов следует поменять адрес (или адреса) mail на нужные.
Скрипт apccontrol используется для получения информации от ups, информирования в консоль об изменении состояния ups, выключения или перезагрузки обслуживаемых компьютеров (в данном случае — подключенного к ups по COM кабелю). Исполняется исключительно демоном apcupsd. Единственное что можно в нём поправить при надобности — закоментить строку с переменной перезагрузки
#SHUTDOWN=/sbin/shutdown
для предотвращения перезагрузок при частом пропадании питания (например часто мигает свет, и ups постоянно даёт ведомому компьютеру команду перезагрузиться).
Рассмотрим основные параметры конфига программы — apcupsd.conf
UPSCABLE smart — наш тип кабеля в данном случае
UPSTYPE apcsmart — тип нашего ups
DEVICE /dev/cuad0 — com-порт нашего компьютера (возможно, будет отличаться, например /dev/cuaa0)
POLLTIME 60 — интервал опроса ups’а демоном apcupsd в секундах
SCRIPTDIR /usr/local/etc/apcupsd — путь к скриптам
ONBATTERYDELAY, BATTERYLEVEL, MINUTES, TIMEOUT — определяют поведение ведомого компьютера в случае пропадания напряжения в сети (реакция в минутах)
ANNOY, ANNOYDELAY, NOLOGON — определяют время на выход из системы пользователей в случае пропадания напряжения в сети, а также возможность/невозможность логина в систему в таком состоянии
KILLDELAY — при ненулевом значении этого параметра, система будет работать указанное время (в секундах) даже после того как получила сигнал на выключение, по истечении которого будет предпринята попытка выключить систему
EVENTSFILE /var/log/apcupsd.events — файл логов. сюда попадают все события полученные от ups
EVENTSFILEMAX — размер вышеуказанного файла (в килобайтах, например — 100)
Пример работающего конфига apcupsd.conf:
#———————————
## apcupsd.conf v1.1 ##
# for apcupsd release 3.14.4 (18 May 2008) — freebsd
# «apcupsd» POSIX config file
# ========= General configuration parameters ============
#
UPSCABLE smart
UPSTYPE apcsmart
DEVICE /dev/usv
#POLLTIME 60
LOCKFILE /var/spool/lock
SCRIPTDIR /usr/local/etc/apcupsd
PWRFAILDIR /var/run
NOLOGINDIR /var/run
ONBATTERYDELAY 6
BATTERYLEVEL 5
MINUTES 3
TIMEOUT 0
ANNOY 300
ANNOYDELAY 60
NOLOGON disable
KILLDELAY 0
NETSERVER on
NISIP 0.0.0.0
NISPORT 3551
EVENTSFILE /var/log/apcupsd.events
EVENTSFILEMAX 10
UPSCLASS standalone
UPSMODE disable
STATTIME 0
STATFILE /var/log/apcupsd.status
LOGSTATS off
DATATIME 0
#FACILITY DAEMON
#UPSNAME UPS_IDEN
#BATTDATE mm/dd/yy
#SENSITIVITY H
#WAKEUP 60
#SLEEP 180
#LOTRANSFER 208
#HITRANSFER 253
#RETURNCHARGE 15
#BEEPSTATE T
#LOWBATT 2
#OUTPUTVOLTS 230
SELFTEST 336
#———————————
Запускаем apcupsd
/usr/local/etc/rc.d/apcupsd start
Проверяем связь с ups
/usr/local/sbin/apcaccess status
Если всё настроено правильно, получаем примерно следующий вывод:
APC : 001,052,1285
DATE : Thu Jul 24 15:00:46 MSD 2008
HOSTNAME : test-server
RELEASE : 3.14.0
VERSION : 3.14.0 (9 February 2007) freebsd
UPSNAME : UPS_IDEN
CABLE : Custom Cable Smart
MODEL : Smart-UPS 3000 RM
UPSMODE : Stand Alone
STARTTIME: Thu Jul 17 10:16:47 MSD 2008
STATUS : BOOST ONLINE
LINEV : 203.0 Volts
LOADPCT : 31.8 Percent Load Capacity
BCHARGE : 100.0 Percent
TIMELEFT : 20.0 Minutes
MBATTCHG : 10 Percent
MINTIMEL : 100 Minutes
MAXTIME : 0 Seconds
MAXLINEV : 216.0 Volts
MINLINEV : 177.1 Volts
OUTPUTV : 233.2 Volts
SENSE : High
DWAKE : 000 Seconds
DSHUTD : 090 Seconds
DLOWBATT : 02 Minutes
LOTRANS : 208.0 Volts
HITRANS : 253.0 Volts
RETPCT : 000.0 Percent
ITEMP : 25.2 C Internal
ALARMDEL : 5 seconds
BATTV : 55.1 Volts
LINEFREQ : 50.0 Hz
LASTXFER : Line voltage notch or spike
NUMXFERS : 551
XONBATT : Thu Jul 24 14:39:19 MSD 2008
TONBATT : 0 seconds
CUMONBATT: 808 seconds
XOFFBATT : Thu Jul 24 14:39:20 MSD 2008
SELFTEST : NO
STESTI : 336
STATFLAG : 0x0720000C Status Flag
REG1 : 0x00 Register 1
REG2 : 0x00 Register 2
REG3 : 0x00 Register 3
MANDATE : 02/21/07
SERIALNO : JS0708009520
BATTDATE : 02/21/07
NOMOUTV : 230
NOMBATTV : 48.0
EXTBATTS : 0
FIRMWARE : 666.6.I
APCMODEL : FWI
END APC : Thu Jul 24 15:01:17 MSD 2008
Более подробно можно прочесть в мане /usr/local/share/doc/apcupsd/apcupsd.pdf
Или скачать его ТУТ
С помощью небольшого скрипта на PERL можно парсить вывод и получать основные, нужные параметры, которые, например, отдавать для построения графиков в MRTG о загрузке, заряда батарей, температуре и т.п.
#!/usr/bin/perl
use Time::Local;
sub curr_date_unix{
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime();
$date_unix=timelocal ($sec,$min,$hour,$mday,$mon,$year+1900);
return $date_unix;
}
$cur_date=curr_date_unix();
%month_num=(‘Jan’ => ‘0’,
‘Feb’ => ‘1’,
‘Mar’ => ‘2’,
‘Apr’ => ‘3’,
‘May’ => ‘4’,
‘Jun’ => ‘5’,
‘Jul’ => ‘6’,
‘Aug’ => ‘7’,
‘Sep’ => ‘8’,
‘Oct’ => ‘9’,
‘Nov’ => ’10’,
‘Dec’ => ’11’,
);
@status=`/usr/local/sbin/apcaccess status`;
@ups_day=qw (01 02 03 04 05 06 07 08 09);
for ($i=0; $i<=$#status; $i++){
@spl=split(‘ ‘,$status[$i]);
chomp ($spl[0]);
chomp ($spl[2]);
chomp ($spl[3]);
chomp ($spl[4]);
chomp ($spl[6]);
if ($spl[0] eq LOADPCT){
$load=$spl[2];
}elsif ($spl[0] eq BCHARGE){
$charge=$spl[2];
}elsif ($spl[0] eq MAXLINEV){
$maxv=$spl[2];
}elsif ($spl[0] eq MINLINEV){
$minv=$spl[2];
}elsif ($spl[0] eq OUTPUTV){
$outv=$spl[2];
}elsif ($spl[0] eq ITEMP){
$temp=$spl[2];
}elsif ($spl[0] eq MODEL){
$model1=$spl[2];
$model2=$spl[3];
$model3=$spl[4];
}elsif ($spl[0] eq «STARTTIME:»){
$month=$spl[2];
$day=$spl[3];
$year=$spl[6];
@time_spl=split(‘:’,$spl[4]);
for ($j=1; $j<10; $j++){
if ($day eq $ups_day[$j-1]){
$day=$j;
}
}
}elsif ($spl[0] eq STATUS){
$st=$spl[2];
$st1=$spl[3];
}
}
$time=timelocal ($time_spl[2],$time_spl[1],$time_spl[0],$day,$month_num{$month},$year);
$delta= $cur_date — $time;
$min = $delta / 60;
$hours = $min / 60;
$days = sprintf(«%d»,($hours / 24));
$hours = sprintf(«%02d»,($hours — ($days * 24)));
$min = sprintf(«%02d»,($min — ($days * 60 * 24) — ($hours * 60)));
$sec = sprintf(«%02d»,($delta — ($min * 60) — ($days * 60 * 60 * 24) — ($hours * 60 * 60)));
if ( $days ne «0» ) {
$uptime = «$days days, «;
}
if ( $hours ne «0» ) {
$uptime .= «$hours:»;
}
$uptime .= «$min:$sec»;
open(UPS, «>/usr/ups.txt») || die «$!»;
printf UPS («%.0f\n»,$load);
printf UPS («LOAD\n»);
printf UPS («%.0f\n»,$charge);
printf UPS («CHARGE\n»);
printf UPS («%.0f\n»,$maxv);
printf UPS («MAXLINEV\n»);
printf UPS («%.0f\n»,$minv);
printf UPS («MINLINEV\n»);
printf UPS («%.0f\n»,$outv);
printf UPS («OUTPUTV\n»);
printf UPS («%.0f\n»,$temp);
printf UPS («ITEMP\n»);
printf UPS («%s %s\n»,$st,$st1);
printf UPS («STATUS\n»);
printf UPS («%s %s %s\n»,$model1,$model2,$model3);
printf UPS («MODEL\n»);
close(UPS);
Вывод результатов данного скрипта можно видеть в файле /usr/ups.txt:
32
LOAD
99
CHARGE
217
MAXLINEV
210
MINLINEV
213
OUTPUTV
25
ITEMP
ONLINE
STATUS
Smart-UPS 3000 RM
MODEL
И данные из этого файла уже можно скармливать MRTG для построения графиков.
З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !
Автор: MadMax
Похожие статьи:
- Не найдено
Добавить комментарий
Вам следует авторизоваться для размещения комментария.