Active Discovery bugs

Started by enp, December 20, 2013, 08:40:53 AM

Previous topic - Next topic

enp

Здравствуйте!

Включил Active Discovery для сети 192.168.191.0/24, но он нашел ноды из сети 10.11.80.0/22, которые точно не имеют интерфейсов в сети 192.168.191.0/24 - см. приложенную картинку. Есть две ноды, присутствующие в обеих сетях - но они давно добавлены вручную. Я что-то неправильно сделал или это баг?

Да, найденные ноды видны только в Entire network и не видны Infrastructure Services. Как поместить их в какой-нибудь контейнер в Infrastructure Services?

kozlov_ao

#1
Приветствую!
Нет, это не баг. Просто наверняка имеется какой-либо маршрут и т.п. шляпа, например, на сеть провайдера. В моей практике часто встречаются ситуации, когда сетка провайдера просматривается по SNMP... как то они не беспокоятся о безопасности ))
Чтобы ловились только твои хосты - пропиши фильтр.

Чтобы хосты раскидывались по Infrastructure Services - можно создать правила авто-маппинга (properties - automatic bind rules)... ну или в ручную, тыкаешь правой кнопкой по нужной папке и выбираешь "Bind..."

enp

Quote from: kozlov_ao on December 20, 2013, 08:54:55 AM
Чтобы ловились только твои хосты - пропиши фильтр.

А в чем тогда разница между Active Discovery Targets и Address Filters?

Quote from: kozlov_ao on December 20, 2013, 08:54:55 AM
Чтобы хосты раскидывались по Infrastructure Services - можно создать правила авто-маппинга (properties - automatic bind rules)...

А как написать правило: класть в этот контейнер те ноды, которых нет ни в каких других контейнерах?

kozlov_ao

В таргет, он прошерстит все что сможет, начиная с указанного диапазона + все зависимости.. это позволит составить карту сети.
Фильтр ему аппетит немного попортит...

QuoteА как написать правило: класть в этот контейнер те ноды, которых нет ни в каких других контейнерах?
ммм... ну тут я пас )) ни разу не ходил от обратного :)

enp

Active Discovery Targets - обязательный параметр или достаточно Address Filters?

enp

А как хотя бы вручную добавить ноду в контейнер, если она видна исключительно в Entire Network? Там у нод ничего похожего по смыслу в контекстном меню я не вижу.

kozlov_ao

тыкай не по ноде, а по папке в Infrastructure Services

enp

Quote from: kozlov_ao on December 20, 2013, 09:33:22 AM
тыкай не по ноде, а по папке в Infrastructure Services

понял, спасибо

enp

Quote from: enp on December 20, 2013, 09:26:31 AM
Active Discovery Targets - обязательный параметр или достаточно Address Filters?

Кстати, ни одного не достаточно. В обоих параметрах у меня 192.168.191.0/24, Filter / Custom script для фильтрации выглядит так:


trace(0, "New node address = " . $1->ipAddr);
return false;


В логе:

Dec 20 13:16:17 monitor netxmsd[11538]: New node address = 10.11.80.71


Предполагать, что Filter выполняется раньше, чем Active Discovery Targets и Address Filters, вроде глупо - или это так? Я могу, наверное, и в скрипте фильтровать по сети/диапазону - но зачем тогда нужны Active Discovery Targets и Address Filters? Мне бы хотелось, чтобы не интересующие меня сети вообще не опрашивались - это можно сделать?

kozlov_ao

#9
Обязательный Target, Filter - не обязательный...

Фильтруй так:

enp

Все правильно, в документации http://wiki.netxms.org/wiki/UM:Network_Discovery написано:

Quote"Address Filters" Section

In this section you can define address ranges for automatically generated discovery filter. This list has no effect if discovery is off or filter is not set to "Automatically generated script".

Т.е. без галочки "Accept node if it is within given range or subnet" писать что-либо в Address Filters нет никакого смысла.

Active Discovery Targets нужен только для активного опроса с помощью ICMP. Соответственно, ноды из других подсетей я вижу благодаря обязательным "ARP and routing information". Не помешал бы, кстати, вариант "Active only".

С учетом необходимости добавления новых нод в специально выделенный для этих целей контейнер мне, видимо, нужен такой Filter / Custom script:


if (AddrInSubnet($1->ipAddr, "192.168.191.0", "255.255.255.0")) {
BindObject(FindObject("Discovered"), $node);
return true;
} else {
return false;
}

kozlov_ao

Я показал как сделано у меня... как сделаете Вы - решать вам.
У меня ноды разных типов раскидываются по разным контейнерам.

enp

Quote from: enp on December 20, 2013, 12:43:48 PM
С учетом необходимости добавления новых нод в специально выделенный для этих целей контейнер мне, видимо, нужен такой Filter / Custom script:


if (AddrInSubnet($1->ipAddr, "192.168.191.0", "255.255.255.0")) {
BindObject(FindObject("Discovered"), $1);
return true;
} else {
return false;
}


Нет, не работает - Function or operation argument is not an object на строчке с BindObject. Подозрение на то, что в $1 попадает экземпляр NewNode, а ожидается Node или NetObj. Можно ли преобразовать NewNode в Node или при выполнении скрипта Node еще не существует и задача нерешаемая?

Можно, конечно, сделать иначе: периодически выбирать ноды без контейнеров и их уже складывать в контейнер через Java API - но эта идея мне совсем не нравится.

enp

Я попробовал зайти еще с одной стороны и написал такой скрипт в Automatic Bind Rules для контейнера Discovered:

parents = GetNodeParents($node);

foreach(p : parents)
trace(1, "Parent object: name='" . p->name . "' id=" . p->id);

if (p == null)
return true;
else
return false;


Еще не успело ничего найтись, как в этот контейнер были добавлена куча нод, принадлежащая другим контейнерам. Т.е. функция GetNodeParents для них вернула null. Что же тогда понимается под родителями нод и есть ли способ узнать, принадлежит ли нода какому-либо контейнеру?

Victor Kirhenshtein

Проверьте что CheckTrustedNodes в настройках сервера выставлен в 0.