Как правильно создать шаблон

Started by Harun, August 06, 2015, 11:59:42 AM

Previous topic - Next topic

Harun

Бьюсь, не могу разобраться, как правильно создать шаблон с Instance Dicsovery.

Например, мне нужно снимать сигнал/шум для некоторых интерфейсов по условию:

Для всех интерфейсов, у которых ifTable.ifEntry.ifType = 129 нужно создавать DCI  SNMP OID .1.3.6.1.2.1.10.127.1.1.4.1.5.<ID>, где <ID> - id интерфейса.

В Data Parametr я ввожу .1.3.6.1.2.1.10.127.1.1.4.1.5.{instance}, в Instance Dicsovery добавляю в поле Base SNMP OID .1.3.6.1.2.1.2.2.1.3 (ifTable.ifEntry.ifType), ставлю метод SNMP Walk - OIDs. Как теперь правильно создать filter script?

Harun

Покопался в примерах, сделал такое:

SNMP Walk - OID
Base SNMP OID = .1.3.6.1.2.1.2.2.1.1

transport = CreateSNMPTransport($node);
if (transport == null)
return false;
x = SNMPGet(transport, ".1.3.6.1.2.1.2.2.1.3." . $1);
if (x == null)
return false;
if (x->value == "129")
return true;
return false;

Работает!

Есть вопрос. Каким способом в Description добавлять имя интерфейса? Сейчас Description = SignalToNoise {instance}, что неинформативно.

Victor Kirhenshtein

Из фильтра можно возвращать измененый instance и instance name. Можно попробовать такой скрипт:


transport = CreateSNMPTransport($node);
if (transport == null)
return false;
type = SNMPGet(transport, ".1.3.6.1.2.1.2.2.1.3." . $1);
if (type == null)
return false;
if (type->value != 129)
return false;

name = SNMPGetValue(transport, ".1.3.6.1.2.1.2.2.1.2." . $1);  // ifDescr
if (name == null)
        name = $1; // use interface index as fallback

return %(true, $1, name);


и в параметре использовать {instance-name} там где надо подставить имя интерфейса.

Harun

https://www.netxms.org/forum/configuration/interface-names-in-instance-discovery/msg15724/#msg15724
Тут советуют следующее - зачем запрашивать по SNMP лишнюю информацию, если она есть в самой системе. Окончательный вариант:


transport = CreateSNMPTransport($node);
if (transport == null)
return false;
x = SNMPGet(transport, ".1.3.6.1.2.1.2.2.1.3." . $1);
if (x == null)
return false;
if (x->value != 129)
return false;
i = GetInterfaceObject($node, $1);
if (i != null && i->adminState == 1)
{
  return %(true, $1, i->name);
}
return false;

Спасибо за помощь, всё работает как надо!

Victor Kirhenshtein

Логично на самом деле. Тип тоже можно ведь достать из объекта интерфейса - поле ifType.

Harun

Тогда всё значительно упрощается

i = GetInterfaceObject($node, $1);
if ( i != null && i->adminState == 1 && i->ifType == 129)
{
  return %(true, $1, i->name);
}
return false;

Harun

После обновления до версии 2.0-RC1 шаблон перестал работать, видит только первый интерфейс, а остальные пропали.
Видимо это та же проблема:
https://www.netxms.org/forum/announcements/netxms-2-0-rc1-released/msg17520/#msg17520

2.0-RC2 - исправлено