Обработка состояния питания при помощи
snmptrapd |
Если вы новичок в этой областиОбратитесь к следующим документам, если вы не знакомы SNMP
Net-snmpРазличные утилиты для протокола SNMP включают:
Обратитесь к сайту NET-SNMP. snmptrapdSnmptrapd это SNMP-приложение, которое получает и протоколирует snmp-трэпы, которые приходят на порт SNMP-TRAP (162). Можно сделать настройку так, чтобы при получении snmp-трэпа запускалась определенная программа. snmptrapd.confsnmptrapd.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 2. Скомпилируйте следующий C-код, введя команду 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.upsAlarmLowBattery")) ) powerfail(1); if (!strcmp("p",argv[1])) if ( (!strcmp(s,"33.1.6.3.3")) || (!strcmp(s,"upsMIB.upsObjects.upsAlarm.upsWellKnownAlarms.upsAlarmLowBattery")) ) 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. Недостатки
Нужно сделатьХотелось бы увидеть, как эти несколько строк кода разрастутся в комплексное программное обеспечение по управлению ИБП с такими возможностями, как:
Все предложения, пожелания, критику, пожертвования (только код и идеи, никаких денег;) и т.п. приветствуются. Со мной можно связаться по адресу [email protected]. А вот моя домашняя страница . Copyright (C) 2002, A B Prasad. |
Вернуться на главную страницу |