NetXMS Support Forum

Russian Support => Общие вопросы => Topic started by: hsvt on June 16, 2016, 12:57:09 PM

Title: discovery or custom script?
Post by: hsvt on June 16, 2016, 12:57:09 PM
Добрый день! Возникла необходимость реализовать автоматическое распределение нод по контейнерам, а так же переименовыванием, если у ноды имя == IP (которое образуется в процессе NetworkDiscovery) - пихать эту ноду в "безымянный" контейнер для нод. Если у ноды вписано sysName - переименовываем ноду в этот sysName. На форуме были похожие примеры, часть скрипта я взял с форума.

sub main()
{
  if ($node->isSNMP)
   {
   transport = CreateSNMPTransport($node);
    if (transport == null)
    {
    return -1;
    }
   
    location = SNMPGetValue(transport, ".1.3.6.1.2.1.1.6.0"); // sysLocation
    sysname = SNMPGetValue(transport, ".1.3.6.1.2.1.1.5.0");  // sysName
    //nodename = FindObject($node);
   
if (sysname != null && sysname !="" && sysname !=" ")
    { 
         RenameObject($node, sysname);
    }         
           
    if ($node->name ~= "^10.10.|10.20")
    {
   
    BindObject(FindObject(15775), $node);
println ("true");
     
    }
   
    else
   
    println ("false");

   
   
}
   
}


15775 - id контейнера куда должны складываться ноды с IP в имени.

Но даже простой пример: (Execute server script)

sub main()
{
BindObject(FindObject(15775),FindObject(13471));
}

Error 14 in line 3: Function or operation argument is not an object


Ладно, я пошёл другим путём и сделал Auto bind на нужном контейнере:

return $node->isSNMP && ($node->name ~= "^10.10.|10.20");

Включил active and passive discovery с фильтром SNMP и address subnet.

Все ноды сразу же нашлись и забиндились в контейнер 15775, но они так же остаются и в Infrastructure Services, хотя там они естественно не нужны.

Так вот, что нужно сделать чтобы в Infrastructure Services они не биндились после Discovery и как мне совместить NetworkDiscovery по subnet + скрипт который будет переименовывать ноды? Или как правильно его назвать чтобы он вызывался при определённых Poll's
Title: Re: discovery or custom script?
Post by: Victor Kirhenshtein on July 07, 2016, 12:36:51 PM
Для всех опросов есть hook скрипты: Hook::ConfigurationPoll, Hook::sStatusPoll, и т.д. В данном случае похоже подойдет hook на configuration poll. Еще рекомендую отключить CheckTrustedNodes, иначе могут быть проблемы с поиском объектов.
Не совсем понял как ноды оказались в Infrastructure Services - сам по себе сервер их туда не помещает. В любом случае можно использовать UnbindObject в хуке чтобы убрать ноду оттуда.
Title: Re: discovery or custom script?
Post by: hsvt on July 07, 2016, 04:52:27 PM
Quote from: Victor Kirhenshtein on July 07, 2016, 12:36:51 PM
Для всех опросов есть hook скрипты: Hook::ConfigurationPoll, Hook::sStatusPoll, и т.д. В данном случае похоже подойдет hook на configuration poll. Еще рекомендую отключить CheckTrustedNodes, иначе могут быть проблемы с поиском объектов.
Не совсем понял как ноды оказались в Infrastructure Services - сам по себе сервер их туда не помещает. В любом случае можно использовать UnbindObject в хуке чтобы убрать ноду оттуда.

Спасибо за ответ, в принципе пока уже прошло время - решил проблему вроде бы. При discovery сервер именует ноды в IP, для таких создан специальный контейнер который туда их автоматически биндит. Дальше если у ноды настроено snmp sysName, то Hook::ConfigurationPoll переименовывает эту ноду в sysName и далее сервер кладёт их в конечный контейнер в котором уже правила такого вида: return $node->name ~= "^Name 33 ";

Если у ноды не указан sysName - ничего не делаем с ними.

На сколько костыльно или возможно не правильно я это всё сделал ? :) Может есть какие то замечания? Конечная цель получить полностью автоматическое распределение нод по контейнерам (улицам).

Получается какой то особенный network discovery скрипт мне не нужен?
Title: Re: discovery or custom script?
Post by: Victor Kirhenshtein on July 07, 2016, 05:21:47 PM
На мой взгляд совершенно правильно - каждый скрипт заимается своим делом.