<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Filtering scripts в EPP]]></title><description><![CDATA[<p dir="auto">Добрый день!<br />
Имеется скрипт</p>
<pre><code>subnets = [];

for (p : $node.parents) if (classof(p) == "Subnet") subnets.append(p.alias);

$event.addParameter("subnets", subnets.join(", "));

return true;
</code></pre>
<p dir="auto">Прицепляющий alias подсети к ивенту SYS_NODE_ADDED<br />
В EPP созданы 2 правила на тот же ивент, отличающиеся действием и Filter скриптами<br />
1-ый вроде как должен фильтровать ивенты, где в alias нет dc и ts</p>
<pre><code>sub main() {

    subnet = tolower($event-&gt;subnets);



    // Быстрая проверка по ключевым словам

    if(contains(subnet, "dc") ||

       contains(subnet, "ts")) {

        nxlog(4, "FILTER: Blocked DC subnet - " . $event-&gt;subnets);

        return false;

    }



    return true;

}
</code></pre>
<p dir="auto">2-ой - где alias содержит dc и ts</p>
<pre><code>sub main() {

    subnet = tolower($event-&gt;subnets);



    // Быстрая проверка по ключевым словам

    if(contains(subnet, "dc") ||

       contains(subnet, "ts")) {

        return true;

    }

    nxlog(4, "FILTER: Blocked Users subnet - " . $event-&gt;subnets);

    return false;

}
</code></pre>
<p dir="auto">Если в ивенте действительно ЕСТЬ dc или ts - приходит 1 ивент в нужный топик. Но если в alias нет dc\ts - алармы сыпятся в оба топика, что на 1-ый фильтр, что на второй<br />
Вот пример такого ивента</p>
<pre><code>{
  "id": 180591103,
  "rootId": 0,
  "code": 1,
  "name": "SYS_NODE_ADDED",
  "timestamp": 1769568582,
  "originTimestamp": 1769568582,
  "origin": 0,
  "source": 1051263,
  "zone": 0,
  "dci": 0,
  "severity": 0,
  "message": "Node added",
  "lastAlarmKey": "",
  "lastAlarmMessage": "",
  "tags": [
    "NewObject"
  ],
  "parameters": [
    {
      "name": "nodeOrigin",
      "value": "1"
    },
    {
      "name": "subnets",
      "value": "KRS_Gaydashovka_UC"
    }
  ]
}
</code></pre>
<p dir="auto">Что я сделал не так с этими фильтрами? ::)</p>
]]></description><link>https://forum.netxms.org/topic/8313/filtering-scripts-в-epp</link><generator>RSS for Node</generator><lastBuildDate>Fri, 13 Nov 2026 06:15:40 GMT</lastBuildDate><atom:link href="https://forum.netxms.org/topic/8313.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 28 Jan 2026 03:19:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Filtering scripts в EPP on Thu, 30 Jul 2026 10:47:42 GMT]]></title><description><![CDATA[<p dir="auto">Замена contains на like проблему не решила — оба регистрозависимы. В текущем виде фильтр не сработает ни на одной записи с кириллицей, а ASCII-записи ("7-zip", "adobe reader") это маскируют.</p>
<p dir="auto">Проверено на nxscript 6.2.0:</p>
<pre><code>s = "Средства Проверки Microsoft Edge";

s like "*Средства Проверки*"     // true  - регистр совпадает
s like "*средства проверки*"     // false - регистр не совпадает
s.contains("Средства Проверки")  // true
s ilike "*средства проверки*"    // true  - ilike регистронезависим
</code></pre>
<p dir="auto">Регистронезависимый оператор — ilike, а не like. Среди методов строки аналога contains без учёта регистра нет, equalsIgnoreCase сравнивает строку целиком.</p>
<p dir="auto">Почему исходный вариант с contains выглядел нерабочим: по приложенному логу toLowerCase на вашем сервере отработал корректно — "агент администрирования kaspersky security center". Значит и contains работал, а пакеты из трейса (Kaspersky Security Center, Microsoft Edge) просто не входили в список из 60 записей, и правило отфильтровало их правильно. Исходный скрипт был в порядке.</p>
<p dir="auto">Деталь, которая здесь важнее: toLowerCase, toUpperCase, ilike и equalsIgnoreCase для не-ASCII зависят от локали процесса. LC_CTYPE подхватывается только если он есть в окружении, а systemd-юнит его не задаёт — при запуске из пакета netxmsd может работать в локали C. Тогда toLowerCase молча оставляет кириллицу без изменений, а ilike и equalsIgnoreCase на кириллице возвращают false, без записи в лог. Тикет на это: <a href="https://github.com/netxms/netxms/issues/3483" rel="nofollow ugc">https://github.com/netxms/netxms/issues/3483</a></p>
<p dir="auto">Проверка:</p>
<pre><code>println("Средства".toLowerCase());   // ожидается "средства"
</code></pre>
<p dir="auto">Если вывод пустой или регистр не изменился, локали нет — задаётся через LANG=C.UTF-8 в /etc/default/netxmsd.</p>
<p dir="auto">Для списка из 60 наименований надёжнее не приводить регистр вручную: либо сравнивать через ilike при рабочей локали, либо сопоставлять точным регистром через contains — второй вариант от локали не зависит вообще. Вариант с Mapping tables, предложенный выше, здесь удобнее обоих: список правится в Configuration без редактирования скрипта, GetMappingTableKeys() отдаёт его массивом.</p>
]]></description><link>https://forum.netxms.org/post/35695</link><guid isPermaLink="true">https://forum.netxms.org/post/35695</guid><dc:creator><![CDATA[alk]]></dc:creator><pubDate>Thu, 30 Jul 2026 10:47:42 GMT</pubDate></item><item><title><![CDATA[Reply to Filtering scripts в EPP on Tue, 10 Feb 2026 07:46:19 GMT]]></title><description><![CDATA[<p dir="auto">Вот в таком виде фильтр отрабатывает вроде как корректно.</p>
<pre><code>sub main() {
packageName = $event.getParameter("name");
//trace(0, "From EPP rule " .. typeof(packageName) .. " " .. packageName); //можно логить в серверный лог чтоб разобраться что происходит
if (packageName == null) return false;

packageName = packageName.toLowerCase();

if ((packageName like "*7-zip*") ||
    (packageName like "*adobe reader*") ||
    (packageName like "*средства проверки правописания microsoft*"))
	{
     return false;
}
trace(0, "From EPP rule " .. typeof(packageName) .. " " .. packageName); //Лог, чтобы видеть разрешенные к алертам записи
return true;
}
</code></pre>
]]></description><link>https://forum.netxms.org/post/35125</link><guid isPermaLink="true">https://forum.netxms.org/post/35125</guid><dc:creator><![CDATA[Argonauts]]></dc:creator><pubDate>Tue, 10 Feb 2026 07:46:19 GMT</pubDate></item><item><title><![CDATA[Reply to Filtering scripts в EPP on Fri, 30 Jan 2026 11:42:22 GMT]]></title><description><![CDATA[<p dir="auto">Да, по ссылке актуальная документация.<br />
Можно на любой ноде сделать Execute script, там packageName задать вручную, а не из ивента и посмотреть что будет, у меня вот это выдает false:</p>
<pre><code>sub main() {
  packageName = "2026-01 Обновление для системы безопасности";
  if (packageName == null) return false;
  packageName = packageName.toLowerCase();
  if ((packageName.contains("для системы безопасности")) ||
      (packageName.contains("adobe reader")) ||
      (packageName.contains("средства проверки правописания microsoft")))
  {
    return false;
  }
  return true;
}
</code></pre>
<p dir="auto">И, кстати, в Configuration есть такая штука как Mapping tables, там можно вести табличку с названиями ненужного софта, в колонке Key, Value можно не заполнять, из NXSL это будет доступно в виде массива через функцию GetMappingTableKeys()</p>
]]></description><link>https://forum.netxms.org/post/35091</link><guid isPermaLink="true">https://forum.netxms.org/post/35091</guid><dc:creator><![CDATA[Filipp Sudanov]]></dc:creator><pubDate>Fri, 30 Jan 2026 11:42:22 GMT</pubDate></item><item><title><![CDATA[Reply to Filtering scripts в EPP on Fri, 30 Jan 2026 08:29:49 GMT]]></title><description><![CDATA[<p dir="auto">Я скриптом с #3 попытался отфильтровать EPP, которое кучу алармов генерирует при удалении\установке\изменении пакета приложений на ноде - дефолтная EPP 42. Так как бы не пробовал, но алармы проходят фильтр, хотя вроде как не должны</p>
<pre><code>sub main() {
packageName = $event.getParameter("name");
trace(0, "From EPP rule " .. typeof(packageName) .. " " .. packageName); //можно логить в серверный лог чтоб разобраться что происходит
if (packageName == null) return false;
packageName = packageName.toLowerCase();
if ((packageName.contains("7-zip")) ||
    (packageName.contains("adobe reader")) ||
    (packageName.contains("средства проверки правописания microsoft")))
       {
     return false;
}
return true;
}
</code></pre>
<p dir="auto"> Пакетов там что-то около 60 указано, я сократил текст<br />
Пример события</p>
<pre><code>{
  "id": 181445587,
  "rootId": 0,
  "code": 87,
  "name": "SYS_PACKAGE_INSTALLED",
  "timestamp": 1769740202,
  "originTimestamp": 1769740202,
  "origin": 0,
  "source": 236657,
  "zone": 0,
  "dci": 0,
  "severity": 0,
  "message": "Package Intel(R) ME UninstallLegacy 1.0.1.0 installed",
  "lastAlarmKey": "",
  "lastAlarmMessage": "",
  "tags": null,
  "parameters": [
    {
      "name": "name",
      "value": "Intel(R) ME UninstallLegacy"
    },
    {
      "name": "version",
      "value": "1.0.1.0"
    }
  ]
}
</code></pre>
<p dir="auto">В логах вроде как parameter корректно отбирается</p>
<pre><code>2026.01.30 10:22:06.023 *I* [nxsl.trace         ] From EPP rule string Агент администрирования Kaspersky Security Center
2026.01.30 10:22:06.023 *I* [nxsl.trace         ] From EPP rule string LowerCase агент администрирования kaspersky security center
2026.01.30 10:22:09.734 *I* [nxsl.trace         ] From EPP rule string Агент администрирования Kaspersky Security Center
2026.01.30 10:22:09.734 *I* [nxsl.trace         ] From EPP rule string LowerCase агент администрирования kaspersky security center
2026.01.30 10:22:46.525 *I* [nxsl.trace         ] From EPP rule string Агент администрирования Kaspersky Security Center
2026.01.30 10:22:58.159 *I* [nxsl.trace         ] From EPP rule string Microsoft Edge
</code></pre>
<p dir="auto"><a href="https://netxms.org/documentation/nxsl-latest/" rel="nofollow ugc">https://netxms.org/documentation/nxsl-latest/</a> Тут актуальный док выложен по языку?<br />
Вроде как скрипт подходит, в строчке нужная инфа есть, но сравнение выдает false.<br />
Т.е. условный "2026-01 Обновление для системы безопасности" не содержит в себе "для системы безопасности"?</p>
]]></description><link>https://forum.netxms.org/post/35088</link><guid isPermaLink="true">https://forum.netxms.org/post/35088</guid><dc:creator><![CDATA[Argonauts]]></dc:creator><pubDate>Fri, 30 Jan 2026 08:29:49 GMT</pubDate></item><item><title><![CDATA[Reply to Filtering scripts в EPP on Fri, 30 Jan 2026 07:39:16 GMT]]></title><description><![CDATA[<p dir="auto">Скрипт заводится из EPP по событию SYS_NODE_ADDED, опять же на форуме подсказали. С уведомлениями по подсетям я вроде разобрался, сейчас в таком виде</p>
<pre><code>sub main() {

    subnet_dc = $event.subnets;



    // Быстрая проверка по ключевым словам

    if(($event.subnets like "*DC*") ||

       ($event.subnets like "*TS*")) {

        return true;

    }

    return false;

}
</code></pre>
<pre><code>sub main() {

    subnet = $event.subnets;



    // Быстрая проверка по ключевым словам

    if(($event.subnets like "*DC*") ||

       ($event.subnets like "*TS*")) {

        return false;

    }



    return true;

}
</code></pre>
<p dir="auto">Вроде как корректно фильтрует по нужным действиям</p>
]]></description><link>https://forum.netxms.org/post/35087</link><guid isPermaLink="true">https://forum.netxms.org/post/35087</guid><dc:creator><![CDATA[Argonauts]]></dc:creator><pubDate>Fri, 30 Jan 2026 07:39:16 GMT</pubDate></item><item><title><![CDATA[Reply to Filtering scripts в EPP on Thu, 29 Jan 2026 14:19:41 GMT]]></title><description><![CDATA[<p dir="auto">А скрипт которые параметр subnets прикрепляет к событию - он откуда запускается?</p>
<p dir="auto">Ну и там нет такого, что в filter script в этих правилах EPP могут попадать события, у которых нет этого параметра?</p>
<p dir="auto">Eсли параметра нет, то при обращении к $event.subnets скрипт завалится с ошибкой Unknown object's attribute. Безопаснее использовать метод:</p>
<pre><code>$event.getParameter("subnets")
</code></pre>
<p dir="auto">если параметра нет, он вернет null, но скрипт не завалится.</p>
<pre><code>subnet_dc = $event.getParameter("subnets");
trace(0, "From EPP rule " .. typeof(subnet_dc) .. " " .. subnet_dc); // можно логить в серверный лог чтоб разобраться что происходит
if (subnet_dc == null) return false;

subnet_dc = subnet_dc.toLowerCase();

if (subnet_dc.contains("dc") || subnet_dc.contains("ts"))
{
    return true;
}
return false;
</code></pre>
<p dir="auto">sub main() для EPP скриптов можно не писать, это актуально когда определяется функция, которую вызывают другие скрипты. И вместо sub теперь используется function.</p>
]]></description><link>https://forum.netxms.org/post/35084</link><guid isPermaLink="true">https://forum.netxms.org/post/35084</guid><dc:creator><![CDATA[Filipp Sudanov]]></dc:creator><pubDate>Thu, 29 Jan 2026 14:19:41 GMT</pubDate></item><item><title><![CDATA[Reply to Filtering scripts в EPP on Thu, 29 Jan 2026 02:34:11 GMT]]></title><description><![CDATA[<p dir="auto">А он давал такую ошибку, да. Но на линию 2, сейчас там</p>
<pre><code>    subnet = toLowerCase($event.subnets);
</code></pre>
<p dir="auto">Собственно в таком виде</p>
<pre><code>sub main() {
    subnet_dc = toLowerCase($event.subnets);

    // Быстрая проверка по ключевым словам
    if(subnet_dc.contains("dc") ||
       subnet_dc.contains("ts")) {
        return true;
    }
    return false;
}
</code></pre>
<p dir="auto">Все равно не работает корректно - уведомления продолжают идти в оба топика. Ошибки видел на линию 2 Function not found<br />
Если верить <a href="https://netxms.org/documentation/nxsl-latest/#class-event" rel="nofollow ugc">https://netxms.org/documentation/nxsl-latest/#class-event</a> parameterNames существует в виде array - поиск по нему в таком виде вообще возможен? Или я изначально накосячил</p>
<p dir="auto">Референсом было вот это</p>
<pre><code>sub main() {
    packageName = toLowerCase($alarm.key);

    // Быстрая проверка по ключевым словам
    if(packageName.contains("7-zip") ||
       packageName.contains("adobe reader")) {
        nxlog(4, "FILTER: Blocked package - " . $alarm-&gt;key);
        return false;
    }

    return true;
}
</code></pre>
<p dir="auto">Как оказалось по логам - оно так же не работает, жалуясь Function or operation argument is not an object на линию</p>
<pre><code>packageName = toLowerCase($alarm.key);
</code></pre>
]]></description><link>https://forum.netxms.org/post/35082</link><guid isPermaLink="true">https://forum.netxms.org/post/35082</guid><dc:creator><![CDATA[Argonauts]]></dc:creator><pubDate>Thu, 29 Jan 2026 02:34:11 GMT</pubDate></item><item><title><![CDATA[Reply to Filtering scripts в EPP on Wed, 28 Jan 2026 10:58:39 GMT]]></title><description><![CDATA[<p dir="auto">contains это метод строки. Функции с таким именем нет. По идее в лог сервера должны сыпаться ошибки "Function not found" и создаваться ивенты SYS_SCRIPT_ERROR.</p>
<p dir="auto">А надо так:</p>
<p dir="auto">subnet.contains("dc")</p>
]]></description><link>https://forum.netxms.org/post/35078</link><guid isPermaLink="true">https://forum.netxms.org/post/35078</guid><dc:creator><![CDATA[Filipp Sudanov]]></dc:creator><pubDate>Wed, 28 Jan 2026 10:58:39 GMT</pubDate></item></channel></rss>