Скриптовая задачка (в приложении к hardware-мониторингу на HP Proliant)
-
Имеется зоопарк серверов серии 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; }
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login