Menu

Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Show posts Menu

Messages - Argonauts

#1
Общие вопросы / Re: Filtering scripts в EPP
February 10, 2026, 09:46:19 AM
Вот в таком виде фильтр отрабатывает вроде как корректно.
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;
}
#2
Доброго дня!
Пытаюсь выцепить информацию о порте, куда подключен интерфейс ноды - вкладка Interfaces, столбцы Peer Node\Interface\IP. Не получается разобраться как их вообще запросить - класс Interface содержит в себе peerNode и peerInterface, но они оба отдают одинаковую инфу о именно комуте Cisco, куда подключено устройство
for (int : $node.interfaces){
if(int.ifIndex != 1){
macAd = int.macAddr;
iNode = int.peerNode;
println(iNode.ipAddr);
}
}
Если же обращаться далее к интерфейсам уже на комуте, на который попадаю, то интерфейсы могут отдать нормально инфу по имени интерфейса, alias, дескрипшену и т.п. но запрос peerNode или peerInterface отдает идентичный ответ на всех интерфейсах. Из UI клиента видно, что сама по себе инфа о интерфейсах на комуте корректная - разные подключения, мак адреса, ip, имена и т.п.
for (int : $node.interfaces){
if(int.ifIndex != 1){
macAd = int.macAddr;
iNode = int.peerNode;
for (ii : iNode.interfaces)
println(ii.peerNode);

}
}
Как мне выделить конкретно информацию о порте и адресе коммутатора, куда подключена нода?
Условно
#3
Спасибо, изменил параметры, понаблюдаю.
Таймер активного скана выставлен на 7200
А как оно работает при скане вообще? Радиус 10.6.1.1-10.6.254.254 точно содержит в себе ноды, но большая часть адресов здесь не активны. Проблема как раз в том, что у меня нет информации что активно, а что нет для сужения круга. Может быть проблема в том, что сильно растягивается скан из-за ожидания ответа от ICMP неактивных адресов?
#4
Я скриптом с #3 попытался отфильтровать EPP, которое кучу алармов генерирует при удалении\установке\изменении пакета приложений на ноде - дефолтная EPP 42. Так как бы не пробовал, но алармы проходят фильтр, хотя вроде как не должны
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;
}
Пакетов там что-то около 60 указано, я сократил текст
Пример события
{
  "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"
    }
  ]
}
В логах вроде как parameter корректно отбирается
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

https://netxms.org/documentation/nxsl-latest/ Тут актуальный док выложен по языку?
Вроде как скрипт подходит, в строчке нужная инфа есть, но сравнение выдает false.
Т.е. условный "2026-01 Обновление для системы безопасности" не содержит в себе "для системы безопасности"?
#5
Скрипт заводится из EPP по событию SYS_NODE_ADDED, опять же на форуме подсказали. С уведомлениями по подсетям я вроде разобрался, сейчас в таком виде
sub main() {

    subnet_dc = $event.subnets;

   

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

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

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

        return true;

    }

    return false;

}
sub main() {

    subnet = $event.subnets;

   

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

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

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

        return false;

    }

   

    return true;

}
Вроде как корректно фильтрует по нужным действиям
#6
А он давал такую ошибку, да. Но на линию 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);
#7
DBWriter.BackgroundWorkers 10

Как и
DBWriter.DataQueues 10
DBWriter.InsertParallelismDegree 10
DBWriter.UpdateParallelismDegree 10

По ключу DBWriter это все, что менял
#8
Общие вопросы / Filtering scripts в EPP
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"
    }
  ]
}
Что я сделал не так с этими фильтрами? ::)
#9
Добрый день.
Как можно проводить поиск по конкретным значениям какого-либо параметра в нодах?
В ветке Делимся скриптами сразу в шапке имелся скрипт поиска "в данном случае по snmp sysDescription коммутатора"
sub GetTree (nodeID)
{
Tree = FindObject(nodeID);
children = GetObjectChildren(Tree);

foreach (n : children)
{
    //println ("Name: " . n->name);
    if (n->name != null && classof(n) == "Node")
    {
        if (n->sysDescription ~= "^D-Link DES-3028" && n->comments == "")
    {   
        println ("Name: " . n->name . ", sysDescription: " . n->sysDescription . ", IP: " . n->ipAddr);
    }
}
GetTree(n->id);
  }
}

GetTree(2);
Который я попытался перенаправить на поиск нод, в которых Description на каком-то из интерфейсов имеет WAN.
sub GetTree (nodeID)
{
Tree = FindObject(nodeID);
children = GetObjectChildren(Tree);

foreach (n : children)
{
    //println ("Name: " . n->name);
    if (n->name != null && classof(n) == "Node")
    {
        if (n->interfaces.description ~= "WAN" && n->comments == "")
    {   
        println ("Name: " . n->name . ", interfaces.description: " . n->interfaces.description . ", IP: " . n->ipAddr);
    }
}
GetTree(n->id);
  }
}

GetTree(2);
Но оба скрипта падают в syntax error на линию 13. Что с того момента изменилось в синтаксе?
=================
Edited
В таком виде
sub GetTree(nodeID)
{
    Tree = FindObject(nodeID);
    children = GetObjectChildren(Tree);

    foreach (n : children)
    {
        if (n->name != null && classof(n) == "Node")
        {
            ifaces = n->interfaces;
            foreach (iface : ifaces)
            {
                if (iface->description ~= "WAN")
                {
                    println("Name: " , n->name , ", interface: " , iface->description , ", IP: " , iface->ipAddr);
                }
            }

            GetTree(n->id);
        }
    }
}

GetTree(2);
выполнение его проходит, но результат никакой не получается
*** FINISHED ***

Result:
#10
Общие вопросы / Re: FileSystem.Total
January 13, 2026, 11:27:07 AM
Теперь у меня другой вопрос
Как мне удалить все DCI, что я наплодил с созданием DCI под instance discovery? Со временем они появляются обратно ::)
#11
Общие вопросы / Re: FileSystem.Total
January 13, 2026, 11:25:20 AM
Вопрос снят. Что
WMI.Query(root\cimv2,SELECT * FROM Win32_LogicalDisk WHERE Name LIKE "'{instance}'", Size)Что
WMI.Query(root\cimv2,SELECT * FROM Win32_LogicalDisk WHERE Name LIKE '"{instance}"', Size)корректно отрабатывают
-_-
#12
Общие вопросы / Re: FileSystem.Total
January 13, 2026, 09:31:06 AM
Попытка реализовать этот момент через wmi запрос на win32_logicaldisk + внешний лист.
Запрос
WMI.Query(root\cimv2,SELECT * FROM Win32_LogicalDisk WHERE Name="'C:'", Size)В таком виде корректно запрашивается и выводится нужный показатель
Как мне оформить этот запрос для {instance}?
WMI.Query(root\cimv2,SELECT * FROM Win32_LogicalDisk WHERE Name LIKE "{instance}", Size)В созданном внешнем листе инфа лежит в виде X: - С:, D: и т.п.
Сам лист запрашивается через
ExternalList = LogicalDisk.DeviceID:powershell -NonInteractive -Command "Get-CimInstance -Namespace root\cimv2 -Query 'SELECT DeviceID FROM Win32_LogicalDisk WHERE DriveType=3' | Select-Object -ExpandProperty DeviceID"===========
WMI.Query(root\cimv2,SELECT * FROM Win32_LogicalDisk WHERE Name="'{instance}'", Size)Не работает, я так понимаю оно экранирует {instance} как строку, исключая переменную
WMI.Query(root\cimv2,SELECT * FROM Win32_LogicalDisk WHERE Name like '{instance}', Size)Не работает
WMI.Query(root\cimv2,SELECT * FROM Win32_LogicalDisk WHERE Name='{instance}', Size)Опять же нет
#13
Общие вопросы / FileSystem.Total
January 12, 2026, 11:54:31 AM
Добрый день

Как должно выглядеть создание DCI для получения объема логического диска? FileSystem.Total с instance discovery от шаблона Windows инстансы находит, dci по ним создаются - хоть и в нескольких экземплярах почему-то - но значений никаких не отдает, падает в Error. Параллельно с этим дефолтные DCI  процентного свободного места корректные значения имеют.
type = AgentReadParameter($node, "FileSystem.Type(" .. $1 .. ")");

if ((type == null) || (type == "") || (type == "CDFS")) 

   return false;

return true;
#14
Общие вопросы / Re: Wireless controller
January 12, 2026, 11:46:51 AM
Уточню у руководства и отпишусь
#15
Общие вопросы / Wireless controller
December 18, 2025, 06:21:45 AM
Доброго дня!

С какими контроллерами сейчас есть возможность взаимодействовать, только физическими или виртуальные тоже доступны? Хотел потрогать Wireless Domain фичу
На Ubuntu 24.04.2 LTS развернут контроллер Unifi-controller 9.5.21-31260-1, подкинул на него агента, но как Wireless Controller он не распознается.
Как и AP от них же не всегда распознаются как Wireless AP - UAP-LR, UAP-AC-Mesh, UAP-LR, U6+, UAP-AC-Lite
UAP-AC-Lite я видел ноды, что определялись как W.AP