Network map link status based on DCI?

Started by Akira, September 22, 2021, 08:37:14 AM

Previous topic - Next topic

Akira

Я пока вижу, что состояние линков можно привязать к объектам, например интерфейсу.
Я же хочу привязать к состоянию DCI IPSEC uptime, т.е. сущности не имеющей объекта.

Как это можно сделать?

DCI уже есть, как к линку привязать?

Alex Kirhenshtein

Самое простое решение - в настройках линка выбрать Color -> Script выбрать скрипт, который будет возвращать цвет на основе DCI (при помощи одной из GetDCIValue* функций - https://www.netxms.org/documentation/nxsl-latest/#func-getdcivalue).
Скрипт берется из Scripting Library и должен возвращать цвет - в виде строки или числа.
Строка - как в CSS, название цвета или любой из вариантов "#RRGGBB", "0xRRGGBB", "rgb(R, G, B)", где R, G и B - компоненты цвета красный-зеленый-синий. Список цветов можно посмотреть тут: https://github.com/netxms/netxms/blob/master/src/libnetxms/tools.cpp#L4292
Так же можно вернуть число, с цветом побайтно - 0xRRGGBB (например красный - 0xFF0000, эквивалентно 16711680).

Кроме обычных функций и глобальных переменных, в скрипте так же доступны две переменные "$endpoint1" и "$endpoint2", которые указывают на ноды линка.

Второй вариант - сделать ноду с IP=0.0.0.0, на ней сделать dummy DCI с флагом "Use this DCI for node status calculation" и скриптом, который будет возвращать статус 0-6 (normal, warning, minor, major, etc.)

Akira

Quote from: Alex Kirhenshtein on September 22, 2021, 11:36:19 AM
Самое простое решение - в настройках линка выбрать Color -> Script выбрать скрипт, который будет возвращать цвет на основе DCI (при помощи одной из GetDCIValue* функций - https://www.netxms.org/documentation/nxsl-latest/#func-getdcivalue).

Но, как я вижу, не получится сделать некий универсальный скрипт, и для каждого линка нужен будет отдельный скрипт, который будет брать состояние определенного DCI

Alex Kirhenshtein

Это зависит уже от конкретных метрик. Скрипт может взять данные с любой ноды (как через $endpoint1/$endpoint2, так и через FindNodeObject(null, "server1")), дальше уже вопрос поиска нужного DCI на ноде.
Если DCI никак не определить из скрипта, можно прописать его ID в custom attribute на ноде и доставать таким образом - вариантов много, надо знать детальные требования, чтоб предложить оптимальный путь.

Akira

#4
Quote from: Alex Kirhenshtein on September 22, 2021, 01:36:12 PM
Это зависит уже от конкретных метрик. Скрипт может взять данные с любой ноды (как через $endpoint1/$endpoint2, так и через FindNodeObject(null, "server1")), дальше уже вопрос поиска нужного DCI на ноде.
Если DCI никак не определить из скрипта, можно прописать его ID в custom attribute на ноде и доставать таким образом - вариантов много, надо знать детальные требования, чтоб предложить оптимальный путь.

Не понял как в линке привязаться к ноде для custom attribute. Т.е. если я привяжу линк к ноде, то он же будет статус самой ноды транслировать, а мне это не надо.
Скрин вложил.

Мне надо отображать состояние линка на основании DCI, находящегося в данном случае в ноде "CISCO ASA5506-MSK"
DCI отображает целое число, когда IPSEC туннель активен и мне нужен алерт, когда число 0.

Т.е. нужно масштабируемое решение, когда мне надо будет видеть состояние 20 линков прявязанных к состоянию 20 IPSEC

Alex Kirhenshtein

#5
Эти 20 линков будут на одной циске? Или линк будет между уникальными парами устройств?

EDIT: хотя полюбому, можно же сматчить линк по обеим нодам. Как еще один вариант - если имена нод похожие, то можно просто брать конец имени, и собирать название DCI (e.g. MSK-APR")

Alex Kirhenshtein

Вот пример, что можно сделать:

trace(0, "Calculating link color for " . $endpoint1->name . " -> " . $endpoint2->name);

match1 = $endpoint1->name match ".*ASA-(.*)$";
match2 = $endpoint2->name match ".*ASA-(.*)$";

if (match1 and match2) {
key = "Dummy(ipsec-uptime-" . lower(match1[1]) . "-" . lower(match2[1]) . ")";
trace(0, "Searching for " . key . " on " . $endpoint1->name);
value = GetDCIValueByName($endpoint1, key);
if (not value) {
key = "Dummy(ipsec-uptime-" . lower(match2[1]) . "-" . lower(match1[1]) . ")";
trace(0, "Searching for " . key . " on " . $endpoint2->name);
value = GetDCIValueByName($endpoint2, key);
}

if (value != null) {
trace(0, "Got value " . value);
if (value > 0) {
return "green";
}
}
}

return "red";