Автобинд в контейнеры

Started by SKYnv, August 22, 2012, 08:34:05 PM

Previous topic - Next topic

SKYnv

Чтот никак не получается привязать ноду к контейнеру через скрипт, уже и id указал напрямую, все равно никак... В чем проблемы

пишет на этом например

[Minor]   netxms   Script (Container::test::35662) execution error: Error 14 in line 3: Function or operation argument is not an object

sub main()
{
BindObject(FindObject(35662),FindObject(3718));
//return 0;
}


хотя например такой отрабатывает без ошибок, но в контейнере пусто

sub main()
{
FindObject(3718);
//return FindObject("192.168.1.51");
}

Victor Kirhenshtein

Ошибка вызвана скорее всего тем, что какой-то из вызовов FindObject возвращает NULL. А какое значение у конфигурационного параметра CheckTrustedNodes (см. здесь почему это важно: http://wiki.netxms.org/wiki/SG:Security_Issues).

SKYnv

Quote from: Victor Kirhenshtein on August 24, 2012, 12:30:50 PM
Ошибка вызвана скорее всего тем, что какой-то из вызовов FindObject возвращает NULL. А какое значение у конфигурационного параметра CheckTrustedNodes (см. здесь почему это важно: http://wiki.netxms.org/wiki/SG:Security_Issues).

CheckTrustedNodes = 1

спасибо поэкспериментирую с 0

SKYnv

#3
и так CheckTrustedNodes = 0

такой скрипт висит в правилах автобинда на контейнер. отрабатывает без ошибок (они не сыплятся в алярмы)
Quotesub main()
{
BindObject(FindObject(36420),FindObject(3718));
BindObject(FindObject(36420),FindObject(2218));
}
реакции 0
выполняю через exec в консоли сервера, ноды биндятся на контейнер мгновенно.

udp
странно, а после перезапуска сервера добавляет мгновенно... правда из классической консоли.

udp
да, если писать в ява консоли правила для автобинда в контейнер это не оказывает никакого эффекта. Если из классической, то все отрабатывает мгновенно. Другое дело что в классической нет галки на анбинд при несовпадении...

Victor Kirhenshtein

Автобинд скрипты на контейнерах работают немного по другому - там не надо вызывать BindObject. Автобинд скрипт контейнера вызывается для каждой ноды во время configuration poll, и должен вернуть TRUE если ноду надо добавить в контейнер, и FALSE если нет. Функция BindObject задумывалась для скриптов, которые вызываются в других местах - например как реакция на событие.

SKYnv

Quote from: Victor Kirhenshtein on August 27, 2012, 12:55:55 PM
Автобинд скрипты на контейнерах работают немного по другому - там не надо вызывать BindObject. Автобинд скрипт контейнера вызывается для каждой ноды во время configuration poll, и должен вернуть TRUE если ноду надо добавить в контейнер, и FALSE если нет. Функция BindObject задумывалась для скриптов, которые вызываются в других местах - например как реакция на событие.
то есть достаточно будет?

Quotesub main()
{
findobject(123);
findobject(435);
}

Victor Kirhenshtein

Нет, не так. Автобинд скрипты задуманы для добавления нод в контейнеры по определенным признакам. Например, я хочу собрать в контейнер все Windows хосты с агентами. Тогда автобинд скрипт будет выглядеть так:


return $node->isAgent && ($node->platformName like "windows-*");


SKYnv

Quote from: Victor Kirhenshtein on August 27, 2012, 03:07:29 PM
Нет, не так. Автобинд скрипты задуманы для добавления нод в контейнеры по определенным признакам. Например, я хочу собрать в контейнер все Windows хосты с агентами. Тогда автобинд скрипт будет выглядеть так:


return $node->isAgent && ($node->platformName like "windows-*");

или как я понимаю

return $node->isSNMP && ($node->ipAddr like "192.168.1.10");


похоже что
BindObject(FindObject(36420),FindObject(3718)); в скриптах автобинда временами убивает сервер.

Victor Kirhenshtein

Quote from: SKYnv on August 27, 2012, 04:03:10 PM
или как я понимаю

return $node->isSNMP && ($node->ipAddr like "192.168.1.10");


Да. Для точного сравнения можно == использовать:

return $node->isSNMP && ($node->ipAddr == "192.168.1.10");

Ну и есть две полезные функции: http://wiki.netxms.org/wiki/NXSL:AddrInSubnet и http://wiki.netxms.org/wiki/NXSL:AddrInRange.

glebofff

Приветствую. Чтобы темы не плодить, пишу здесь.

Узел, по которому выполняется скрипт - $node. А как узнать контейнер, к которому пытаемся биндить испытуемый узел?

Мне нужно перебрать Custom Attributes контейнера (как, кстати, по ним сделать итерацию?), и на основе определённых значений уже принять решение, подходит узел или нет.

Victor Kirhenshtein

Автобинд скрипт - это атрибут контейнера, и всегда выполняется только для того контейнера, в котором определен. Если вы используете общий скрипт из библиотеки, то при вызове из каждого конкретного контейнера можно передавать его имя или идентификатор как параметр. Перебрать все custom attributes нельзя, надо знать их имена.