NetXMS Support Forum

Russian Support => Общие вопросы => Topic started by: Argonauts on January 28, 2026, 05:19:35 AM

Title: Filtering scripts в EPP
Post by: Argonauts on January 28, 2026, 05:19:35 AM
Добрый день!
Имеется скрипт
subnets = [];

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

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

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

    subnet = tolower($event->subnets);

   

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

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

       contains(subnet, "ts")) {

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

        return false;

    }

   

    return true;

}
2-ой - где alias содержит dc и ts
sub main() {

    subnet = tolower($event->subnets);

   

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

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

       contains(subnet, "ts")) {

        return true;

    }

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

    return false;

}

Если в ивенте действительно ЕСТЬ dc или ts - приходит 1 ивент в нужный топик. Но если в alias нет dc\ts - алармы сыпятся в оба топика, что на 1-ый фильтр, что на второй
Вот пример такого ивента
{
  "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"
    }
  ]
}
Что я сделал не так с этими фильтрами? ::)
Title: Re: Filtering scripts в EPP
Post by: Filipp Sudanov on January 28, 2026, 12:58:39 PM
contains это метод строки. Функции с таким именем нет. По идее в лог сервера должны сыпаться ошибки "Function not found" и создаваться ивенты SYS_SCRIPT_ERROR.

А надо так:

subnet.contains("dc")
Title: Re: Filtering scripts в EPP
Post by: Argonauts on January 29, 2026, 04:34:11 AM
А он давал такую ошибку, да. Но на линию 2, сейчас там
    subnet = toLowerCase($event.subnets);Собственно в таком виде
sub main() {
    subnet_dc = toLowerCase($event.subnets);
   
    // Быстрая проверка по ключевым словам
    if(subnet_dc.contains("dc") ||
       subnet_dc.contains("ts")) {   
        return true;
    }
    return false;
}
Все равно не работает корректно - уведомления продолжают идти в оба топика. Ошибки видел на линию 2 Function not found
Если верить https://netxms.org/documentation/nxsl-latest/#class-event parameterNames существует в виде array - поиск по нему в таком виде вообще возможен? Или я изначально накосячил

Референсом было вот это
sub main() {
    packageName = toLowerCase($alarm.key);
   
    // Быстрая проверка по ключевым словам
    if(packageName.contains("7-zip") ||
       packageName.contains("adobe reader")) {
        nxlog(4, "FILTER: Blocked package - " . $alarm->key);
        return false;
    }
   
    return true;
}
Как оказалось по логам - оно так же не работает, жалуясь Function or operation argument is not an object на линию
packageName = toLowerCase($alarm.key);