Здравствуйте!
Нашей смене очень интересно, как описаны подсети из дерева объектов на маршрутизаторах. В описаниях упоминаются как минимум номера вланов и при исчезновении какой-то ноды есть о чем жаловаться "начальнику транспортного цеха" - последний предоставляет исключительно 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()