Как описана подсеть на маршрутизаторах - фичреквест и пример интеграции

Started by enp, November 13, 2012, 08:32:16 AM

Previous topic - Next topic

enp

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

Нашей смене очень интересно, как описаны подсети из дерева объектов на маршрутизаторах. В описаниях упоминаются как минимум номера вланов и при исчезновении какой-то ноды есть о чем жаловаться "начальнику транспортного цеха" - последний предоставляет исключительно L2 и видит только вланы и мак-адреса.

Наверное, стоило бы сделать дополнительную вкладку со списком всех найденных интерфейсов из заданной сети (с описаниями и т.д.) - тем более, что вся необходимая информация в БД NetXMS уже есть. Но я только сейчас это сообразил, после того, как реализовал опрос маршрутизаторов по SNMP для вытягивания интерфейсов и отображения в комментариях к подсетям. Покажу, чтоб не потерялось и в качестве рекламы Groovy для интеграционных задач :)


#!/usr/bin/groovy

import org.apache.commons.net.util.SubnetUtils

import org.netxms.client.NXCSession

import org.snmp4j.CommunityTarget
import org.snmp4j.PDU
import org.snmp4j.Snmp
import org.snmp4j.mp.SnmpConstants
import org.snmp4j.smi.GenericAddress
import org.snmp4j.smi.OID
import org.snmp4j.smi.OctetString
import org.snmp4j.smi.VariableBinding
import org.snmp4j.transport.DefaultUdpTransportMapping
import org.snmp4j.util.DefaultPDUFactory
import org.snmp4j.util.RetrievalEvent
import org.snmp4j.util.TableUtils

def get(Snmp snmp, CommunityTarget target, String oid) {
PDU pdu = new PDU()
pdu.add(new VariableBinding(new OID(oid)))
pdu.type = PDU.GET
snmp.send(pdu, target, null).response.get(0).variable
}

def routers = [
[ "router1", "udp:192.168.1.1/161", "public" ],
[ "router2", "udp:192.168.1.2/161", "private" ]
]

def subnets = []

routers.each { router ->

def target = new CommunityTarget(
community : new OctetString(router[2]),
address : GenericAddress.parse(router[1]),
version : SnmpConstants.version2c
)

def snmp = new Snmp(new DefaultUdpTransportMapping())
snmp.listen()

def table = new TableUtils(snmp, new DefaultPDUFactory())

OID[] oids = [
new OID(".1.3.6.1.2.1.4.20.1.1"),
new OID(".1.3.6.1.2.1.4.20.1.2")
]

table.getTable(target, oids, null, null).each { event ->
if (event.status == RetrievalEvent.STATUS_OK) {
def columns = event.columns;
def address = columns[0].variable
def index = columns[1].variable
def descr = get(snmp, target, ".1.3.6.1.2.1.2.2.1.2.${index}")
def alias = get(snmp, target, ".1.3.6.1.2.1.31.1.1.1.18.${index}")
subnets << [router[0], "${address}", ("${descr} ${alias}").trim()]
}
}

snmp.close()

}

def session = new NXCSession("monitor", "pusher", "pushpwd")
session.connect()

session.syncObjects()
session.getAllObjects().each { object ->
if (object.getObjectClassName() == "Subnet") {
def desc = []
subnets.each { subnet ->
if (new SubnetUtils(object.getObjectName()).info.isInRange(subnet[1]))
desc << "${subnet[0]} - ${subnet[2]}"
}
if (desc)
session.updateObjectComments(object.getObjectId(), "${desc.unique()}")
}
}

session.disconnect()