Обработка состояния питания при помощи snmptrapd



Автор: (C) A B Prasad
Перевод: (C) Иван Песин


Если вы новичок в этой области

Обратитесь к следующим документам, если вы не знакомы SNMP

Net-snmp

Различные утилиты для протокола SNMP включают:

Обратитесь к сайту NET-SNMP (http://www.net-snmp.org).

snmptrapd

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

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.

Недостатки

Нужно сделать

Хотелось бы увидеть, как эти несколько строк кода разрастутся в комплексное программное обеспечение по управлению ИБП с такими возможностями, как:

Все предложения, пожелания, критику, пожертвования (только код и идеи, никаких денег;) и т.п. приветствуются. Со мной можно связаться по адресу [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

Команда переводчиков:
Владимир Меренков, Александр Михайлов, Иван Песин, Сергей Скороходов, Александр Саввин, Роман Шумихин, Александр Куприн, Андрей Киселев