Обратитесь к следующим документам, если вы не знакомы SNMP
Различные утилиты для протокола SNMP включают:
Обратитесь к сайту NET-SNMP (http://www.net-snmp.org).
Snmptrapd это SNMP-приложение, которое получает и протоколирует snmp-трэпы, которые приходят на порт SNMP-TRAP (162). Можно сделать настройку так, чтобы при получении snmp-трэпа запускалась определенная программа.
snmptrapd.conf -- конфигурационный файл, который определяет поведение snmp-демона при получении трэпа.
Документ RFC1628 определяет объекты для источников бесперебойного питания, которыми можно управлять по протоколу SNMP.
Замечание: Я переименовал 'powerd' в 'powerh', потому что он будет выступать не как демон, а как процедура обработки трэпов.
Программа powerh предназначена для обработки состояния электропитания системы. Она связывается с ИБП через последовательный порт. Однако, в сетевой системе, где большое количество компьютеров использует один и тот же тип (а зачастую и разный -- Прим. пер.) ИБП, невозможно связаться с каждым источником напрямую. Большинство современных ИБП поддерживают протокол SNMP либо непосредственно, либо при помощи прокси-сервиса. Для обработки различных состояний питания выполните следующие шаги
1. Добавьте в ваш snmptrapd.conf
traphandle 33.2.3 powerh b traphandle 33.2.4 powerh p
2. Скомпилируйте следующий C-кодhttp://gazette.linux.ru.net/lg83/misc/prasad/code. c.txt, введя команду cc powerh.c -o powerh. После этого, скопируйте файл powerh в каталог, например /usr/local/sbin/.
#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.
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"Я не уверен, что это корректно.
Хотелось бы увидеть, как эти несколько строк кода разрастутся в комплексное программное обеспечение по управлению ИБП с такими возможностями, как:
Все предложения, пожелания, критику, пожертвования (только код и идеи, никаких денег;) и т.п. приветствуются. Со мной можно связаться по адресу [email protected]. А вот моя домашняя страница на http://www.geocities.com/prasad_ab .
Copyright (C) 2002, A B Prasad.
Copying
license http://www.linuxgazette.com/copying.html
Published
in Issue 83 of Linux Gazette, October 2002
Команда переводчиков:
Владимир Меренков, Александр Михайлов, Иван
Песин, Сергей Скороходов, Александр Саввин, Роман Шумихин, Александр Куприн,
Андрей Киселев