Filtering script for rule in Event Processing Policy

Started by enp, December 18, 2013, 06:24:36 AM

Previous topic - Next topic

enp

Здравствуйте!

У меня есть правило в Event Processing Policy для отсылки почтовых сообщений о различных событиях. Требуется не отсылать такие сообщения для интерфейсов "Vi*.*". Есть, как я понимаю, единственный способ - Filtering script для правила. Как его писать?

Никогда этого не делал, подходящей документации тоже не нашел. В http://wiki.netxms.org/wiki/UM:NetXMS_Scripting_Language_%28NXSL%29 описан только синтаксис (да и то не описаны, например, строковые функции: как определить вхождение подстроки в строку?). Но нет описания способов запуска скриптов. В http://wiki.netxms.org/wiki/UM:Event_Processing о написании фильтров тоже ни слова.

Покажите, пожалуйста, рабочий пример.

enp

Написал:

sub main()
{
  return !index("%m","Interface \"Vi");
}

Пока понаблюдаю, но написано совершенно по наитию, и уверенности нет. Это положено делать именно так?

enp

Нет, уже видно что не работает. Как правильно получить в NXSL хотя бы текст обрабатываемого события? Может есть возможность получить некий объект события с полями (код, сообщение и т.д.)? Есть ли возможность протестировать скрипт, т.е. запустить его вручную и на вход подать искусственно сформированное событие?

enp

Соответствующий объект есть - http://wiki.netxms.org/wiki/NXSL:Event. И чуть раньше было найдено нечто похожее на substring в других языках - http://wiki.netxms.org/wiki/NXSL:index. Очень не хватает ссылок на эти и другие объекты и функции из http://wiki.netxms.org/wiki/UM:NetXMS_Scripting_Language_%28NXSL%29.

Откуда взять объект Event в Filtering script для правила? Пробую так:


sub main()
{
  return !index($1->message,"Interface \"Vi");
}


Все равно не работает.

enp

Заработал такой вариант:


return !index($event->message,"Interface \"Vi");


С main тоже работает, но зачем нужны лишние 3 строчки - этого я не понял

Victor Kirhenshtein

Когда-то раньше main() был обязателен, теперь уже нет. Но старая форма все равно поддерживается.

Еще можно использовать регулярные выражения, например так:


return $event->message ~= ".*Interface \"Vi.*";


Ну и если речь идет о событиях SYS_IF_UP и SYS_IF_DOWN, то имя интерфейса передается как параметр номер 2, и можно сравнивать только его (тогда условие не будет зависеть от того, что текст сообщения поменяют в шаблоне):


return $2 like "Vi*";


или


return substr($2, 1, 2) == "Vi";


ну и если в названии могут быть прописные и строчные буквы:


return upper(substr($2, 1, 2)) == "VI";


enp

Спасибо! Я верно понимаю, все возможные параметры к событиям описаны в Configuration -> Event configuration?

И вопрос о запуске скриптов вручную по-прежнему актуален.

Victor Kirhenshtein

Quote from: enp on December 18, 2013, 02:01:47 PM
Спасибо! Я верно понимаю, все возможные параметры к событиям описаны в Configuration -> Event configuration?

да, верно.

Quote from: enp on December 18, 2013, 02:01:47 PM
И вопрос о запуске скриптов вручную по-прежнему актуален.

Для проверки обработки событий можно исскуственно создавать события при помощи команды nxevent. Например, для отсылки SYS_IF_DOWN команда может выглядеть так:

nxevent -u admin 192.168.64.1 5 101 eth0 10.10.10.2 255.255.255.0 1

enp

А скрипт может что-либо вывести в лог/консоль? Как это увидеть?

enp

Просто ваши примеры не работают - такое ощущение, что в $2 попадает совсем не имя интерфейса

Victor Kirhenshtein

Можно вывести в лог, функцией trace. Например так:

trace(0, "$2='" . $2 . "'");

enp

Спасибо!

С помощью trace удалось сформулировать правило так:


return !($event->name like "SYS_IF_*" && $event->parameters[2] like "Vi*");


Наверное, это самый правильный вариант.

enp

А куда и в каких случаях выводит данные функция println?

Victor Kirhenshtein

println выводит данные на консоль, ее имеет смысл использовать либо в тестовых скриптах, которые запускаются из nxscript, либо в скриптах, которые запускаются из дебаг консоли сервера командой exec.

enp


$ nxscript
NetXMS Scripting Host  Version 1.2.10
Copyright (c) 2005-2013 Victor Kirhenshtein

Usage: nxscript [options] script [arg1 [... argN]]

Valid options are:
   -d         Dump compiled script code
   -e <name>  Entry point
   -r         Print script return value


Что такое entry point? Объекты вроде $event в nxscript передать нельзя?