Скриптовая задачка (в приложении к hardware-мониторингу на HP Proliant)

Started by Ethril, January 26, 2009, 04:27:58 PM

Previous topic - Next topic

Ethril

Имеется зоопарк серверов серии HP Proliant, с которых NetXMS'ом по SNMP собираются температуры с внутренних датчиков. Сервера разных времён и моделей, поэтому у них разный состав этих датчиков. Где-то их 3 штуки, где-то 5, где-то первый датчик мониторит cpu, а где-то - powersupply...
(Местоположение датчика нумер N можно получить SNMP-запросом по OID .1.3.6.1.4.1.232.6.2.6.8.1.3.0.[N]. Затем запросом по OID .1.3.6.1.4.1.232.6.2.6.8.1.4.0.[N] получить температуру.)

На первых порах интересуют только данные датчиков с местоположением ambient.

Хотелось бы, не вдаваясь в подробности установки датчиков на каждой модели, получать полный список их значений с каждого сервера, находить там тот, который ambient, и слать алерт при превышении порога, скажем, 20 гр.

Завёл шаблон, перенёс в него все Пролианты, завёл в нём пары датчиков ([N]SensorLocale, [N]SensorData) ; N=1..5.
Во всех датчиках [N]SensorData вобью Thresholds, при превышении которых сработает некий эвент.
На некоем полу-NXSL, полу-псевдоязыке попытался накропать скрипт, который хочу вставить в Event Processing Policy:

set i=1;             //define integer variable

while ( i < 6 )     //cycle from 1Sensor[Locale/Data] to 5Sensor[Locale/Data]
{
if ( GetDCIValue($node, FindDCIByDescription($node, right("SensorLocale", 13, i))) == "ambient" )   // is [N]SensorLocale == "ambient" ?
{
if ( GetDCIValue($node, FindDCIByDescription($node, right("SensorData", 11, i))) > 20 )     // is ambient sensor overheat?
{
return GetDCIValue($node, FindDCIByDescription($node, right("SensorData", 11, i))); // if true, true then get data from ambient sensor
};
};
i++;
};

return 0;         // return current temperature from overheated ambient sensor, or 0.

, т.е., при срабатывании эвента отрабатывает скрипт, который перепроверяет, какой же это эвент сработал. Уж не ambient ли? Если ambient, то ахтунг. Как-то это всё криво. Может можно лучше? И заодно скрипт причесать... ::)

Victor Kirhenshtein

Долго думал над красивым решением, без патчей на сервер не получится к сожалению. В следующей версии сделаю дополнительные функции, которые упростят конфигурацию в таких ситуациях. Пока-что можно сделать такой скрипт для event processing policy (для события по трешолду на параметры [N]SensorData):


sub main()
{
   loc = GetDCIValue($node, FindDCIByDescription($node, left($2, 1) . "SensorLocale"));
   return loc == "ambient";   
}


C таким скриптом правило будет срабатывать для событий от [N]SensorData если значение соответствующего [N]SensorLocale равно строке ambient.

P.S. Скрипт можно упростить до


GetDCIValue($node, FindDCIByDescription($node, left($2, 1) . "SensorLocale")) == "ambient"


Ethril

В общем, сделал так - завёл в шаблоне ещё один DCI, впихнул ему в thresholds скрипт:

sub main()
{
if ( GetDCIValue($node, FindDCIByDescription($node, "1SensorLocale")) == "ambient" )
return GetDCIValue($node, FindDCIByDescription($node, "1SensorData"));
if ( GetDCIValue($node, FindDCIByDescription($node, "2SensorLocale")) == "ambient" )
return GetDCIValue($node, FindDCIByDescription($node, "2SensorData"));
if ( GetDCIValue($node, FindDCIByDescription($node, "3SensorLocale")) == "ambient" )
return GetDCIValue($node, FindDCIByDescription($node, "3SensorData"));
if ( GetDCIValue($node, FindDCIByDescription($node, "4SensorLocale")) == "ambient" )
return GetDCIValue($node, FindDCIByDescription($node, "4SensorData"));
if ( GetDCIValue($node, FindDCIByDescription($node, "5SensorLocale")) == "ambient" )
return GetDCIValue($node, FindDCIByDescription($node, "5SensorData"));
return 0;
}

Ну и в Event Processing просто отслеживаю только его состояние.

Осталось научиться заводить переменные и делать циклы типа for на вашем NXSL, чтобы скрипт свернуть до 3-х строк :)

Victor Kirhenshtein

Вариант с циклом:


sub main()
{
        i = 1;
        while(i < 6)
        {
                if (GetDCIValue($node, FindDCIByDescription($node, i . "SensorLocale")) == "ambient" )
                        return GetDCIValue($node, FindDCIByDescription($node, i . "SensorData"));
                i++;
        }
        return 0;
}