Имеется зоопарк серверов серии 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, то ахтунг. Как-то это всё криво. Может можно лучше? И заодно скрипт причесать... ::)
Долго думал над красивым решением, без патчей на сервер не получится к сожалению. В следующей версии сделаю дополнительные функции, которые упростят конфигурацию в таких ситуациях. Пока-что можно сделать такой скрипт для 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"
В общем, сделал так - завёл в шаблоне ещё один 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-х строк :)
Вариант с циклом:
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;
}