Одна небольшая по численности, но преуспевающая фирма-оператор связи,
решила-таки взять секретаря. Секретарь был хорош: короткая юбка,
длинные волосы, и все-такое...
Вот в первый день просит её директор отправить факс.
Ну объяснили как это делается: набрать, ответить, нажать...
Через 15 минут босс проводит контроль - факс не отправлен.
Через 30 минут - не отправлен.
В конце - концов, директор спрашивает, в чем дело:
занято? не отвечают? плохая линия?
Секретарша очаровательно похлопав глазками и преданно глядя на босса говорит:
"Я сама не понимаю в чем дело... Я все делаю как Вы сказали, листочик
заправляю, но он почему-то вылезает обратно!"
Мне кажется, что с young lady трудно спорить:)
Ну а теперь собственно статья. Инетерсно, понравится ли? :-)
И еще. Мы перешагнули отметку в 7000 подписчиков. Пользуюсь случаем,
поздравляю всех причастных к созданию и использованию этого ресурса:)
Как всегда, жду вопросов и замечаний по адресу suralis-s@mtu-net.ru. Если не лень, то
сразу пишите, можно ли использовать Ваши письма в рассылке.
Snmptrapd это SNMP-приложение, которое получает и протоколирует
snmp-трэпы, которые приходят на порт SNMP-TRAP (162). Можно сделать
настройку так, чтобы при получении snmp-трэпа запускалась
определенная программа.
snmptrapd.conf
snmptrapd.conf -- конфигурационный файл, который определяет
поведение snmp-демона при получении трэпа.
ups-MIB
Документ RFC1628 определяет объекты для источников
бесперебойного питания, которыми можно управлять по протоколу
SNMP.
Как использовать snmptrapd с powerh
Замечание: Я переименовал 'powerd' в 'powerh',
потому что он будет выступать не как демон, а как процедура
обработки трэпов.
Программа powerh предназначена для обработки состояния электропитания
системы. Она связывается с ИБП через последовательный порт. Однако,
в сетевой системе, где большое количество компьютеров использует
один и тот же тип (а зачастую и разный -- Прим. пер.) ИБП,
невозможно связаться с каждым источником напрямую. Большинство
современных ИБП поддерживают протокол SNMP либо непосредственно, либо при
помощи прокси-сервиса. Для обработки различных состояний питания выполните
следующие шаги
1. Добавьте в ваш snmptrapd.conf
traphandle 33.2.3 powerh b
traphandle 33.2.4 powerh p
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#define PWRSTAT "/etc/powerstatus"
void powerfail(int);
main(int argc, char* argv[]) {
char s[1000];
int i=0;
while(i<7) {
scanf("%s",s);
i++;
}
scanf("%s",s);
if (!strcmp("b",argv[1]))
if ( (!strcmp(s,"33.1.6.3.3"))
||
(!strcmp(s,"upsMIB.upsObjects.upsAlarm.upsWellKnownAlarms.upsAlarmLowBatte
ry")) )
powerfail(1);
if (!strcmp("p",argv[1]))
if ( (!strcmp(s,"33.1.6.3.3"))
||
(!strcmp(s,"upsMIB.upsObjects.upsAlarm.upsWellKnownAlarms.upsAlarmLowBatte
ry")) )
powerfail(0);
}
/* Поскольку программа может быть активизирована и при возникновении других
сигналов, внутренний оператор 'if' необходим */
void powerfail(int event) {
int fd;
unlink(PWRSTAT);
if ((fd = open(PWRSTAT, O_CREAT|O_WRONLY, 0644)) >= 0) {
switch (event)
{
case 0:
write(fd, "OKWAIT\n", 7);
break;
case 1:
write(fd, "FAIL\n", 5);
break;
}
close(fd);
}
kill(1, SIGPWR);
}
3. Запустите в вашей системе демон snmptrapd (можно настроить
запуск в скриптах автозагрузки)
Система будет выключена через две минуты после получения от ИБП сигнала
'слабый заряд батарей'. И, если до запуска останова
питание восстановится, программа либо отменит выключение системы, либо
будет действовать в соответствии с настройками в файле /etc/inittab
(настройки powerfail и powerokwait).
Пояснения к коду
Когда получен трэп 33.2.3
(upsMIB.upsTraps.upsTrapAlarmEntryAdded) программа вызывается с
параметром 'b'. Она проверяет 'upsAlarmId' присланный
трэпом, и если он равен 33.1.6.3.3
(upsMIB.upsObjects.upsAlarm.upsWellKnownAlarms.upsAlarmLowBattery)
сообщает процессу init, что произошел сбой питания. Если остаточное
время работы источника меньше или равно переменной
upsConfigLowBattTime, то это состояние добавляется в таблицу агента
ИБП. Состояние удаляется, если питание восстановлено и это
подтверждено трэпом 33.2.4. Тогда программа посылает процессу init
сообщение powerokwait.
Недостатки
Программа обрабатывает только два трэпа и проверяет только
одно состояние. В базе upsMIB имеется большое количество
состояний, и программа должна быть расширена для их обработки.
Используется устаревший метод оповещения процесса init. Это
нужно исправить.
Поскольку у меня нет ИБС, который может слать snmp-трэпы, я
использовал генератор трэпов
snmptrap -v 2c localhost public '' 33.2.3 33.2.3.0 s
"33.1.6.3.3"
snmptrap -v 2c localhost public '' 33.2.4 33.2.4.0 s
"33.1.6.3.3"
Я не уверен, что это корректно.
snmptrapd должен запускаться без параметра -f .
Протестировано только на RedHat Linux 6.2.
Нужно сделать
Хотелось бы увидеть, как эти несколько строк кода разрастутся в
комплексное программное обеспечение по управлению ИБП с такими
возможностями, как:
Наблюдение и изменение всех возможных состояний MIB от узла
upsMIB
Команда переводчиков:
Владимир Меренков, Александр Михайлов, Иван Песин, Сергей Скороходов,
Александр Саввин, Роман Шумихин, Александр Куприн, Андрей
Киселев
Со всеми предложениями, идеями и комментариями обращайтесь к Сергею
Скороходову (suralis-s@mtu-net.ru).
Убедительная просьба: указывайте сразу, не возражаете ли Вы против
публикации Ваших отзывов в рассылке.