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

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


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

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

  • документация по net-snmp
  • rfc1678
  • UPSHowto
  • страницы руководства по snmptrapd(8), snmptrapd.conf(8) и snmptrap(8)

Net-snmp

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

  • Гибкий агент
  • Библиотеку SNMP
  • Утилиты для получения или установки информации от SNMP агентов
  • Утилиты для генерации и обработки SNMP трэпов (traps -- ловушки. -- Прим. пер.)
  • Вариант unix команды 'netstat', использующий SNMP
  • Графический браузер базы MIB, основанный на Perl/Tk/SNMP ....

Обратитесь к сайту NET-SNMP.

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-код, введя команду 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.

Недостатки

  • Программа обрабатывает только два трэпа и проверяет только одно состояние. В базе 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
  • Обработка сигналов от нескольких ИБП
  • Использование данных из конфигурационного файла
  • Поддержка идентификации

Все предложения, пожелания, критику, пожертвования (только код и идеи, никаких денег;) и т.п. приветствуются. Со мной можно связаться по адресу [email protected]. А вот моя домашняя страница .


Copyright (C) 2002, A B Prasad.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 83 of Linux Gazette, October 2002


Вернуться на главную страницу