Integrating OpenNMS and EMC/SMARTS InCharge
Subscribe

From OpenNMS

Jump to: navigation, search

It is a pretty simple matter to integrate OpenNMS with InCharge, using scriptd and sending certain OpenNMS events as SNMP traps.

Contents

The OpenNMS side

First, modify scriptd-configuration.xml to include:

<scriptd-configuration>
	<engine language="beanshell" className="bsh.util.BeanShellBSFEngine" extensions="bsh"/>

	<start-script language="beanshell">

		import org.opennms.netmgt.snmp.SnmpTrapBuilder;

		<!-- Note, in OpenNMS 1.3.2 and later use DataSourceFactory instead of DatabaseConnectionFactory -->
		import org.opennms.netmgt.config.DatabaseConnectionFactory;
		import org.opennms.netmgt.utils.SingleResultQuerier;

		log = bsf.lookupBean("log");
		snmpTrapHelper = new org.opennms.netmgt.scriptd.helper.SnmpTrapHelper();

	</start-script>

	<stop-script language="beanshell">

		snmpTrapHelper.stop();

		log.debug("executing a stop script");

	</stop-script>

	<event-script language="beanshell">

	event = bsf.lookupBean("event");

	if (event.uei.equals("uei.opennms.org/nodes/nodeUp") 
		|| event.uei.equals("uei.opennms.org/nodes/nodeDown")
		|| event.uei.equals("uei.opennms.org/nodes/interfaceDown") 
		|| event.uei.equals("uei.opennms.org/nodes/interfaceUp") 
		|| event.uei.equals("uei.opennms.org/nodes/nodeLostService") 
		|| event.uei.equals("uei.opennms.org/nodes/nodeRegainedService"))
	{

		try {

		log.debug("Forwarding an OpenNMS event.");

		SnmpTrapBuilder trap = snmpTrapHelper.createV1Trap(".1.3.6.1.4.1.5813.1", "10.84.245.21", 6, 1, 0);

		<!-- This sends an enterprise id of ".1.3.6.1.4.1.5813.1" from agent "10.84.245.21" (einstein), 
		which should be the IP address of the OpenNMS system, generic value of 6 and specific value of 1 -->

		t_dbid = Integer.toString(event.dbid);
		if (t_dbid != null)
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.1", "OctetString", "text", t_dbid);
		else
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.1", "OctetString", "text", "null");
		if (event.distPoller != null)
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.2", "OctetString", "text", event.distPoller);
		else
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.2", "OctetString", "text", "null");
		if (event.creationTime != null)
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.3", "OctetString", "text", event.creationTime);
		else
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.3", "OctetString", "text", "null");
		if (event.masterStation != null)
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.4", "OctetString", "text", event.masterStation);
		else
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.4", "OctetString", "text", "null");
		if (event.uei != null)
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.6", "OctetString", "text", event.uei);
		else
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.6", "OctetString", "text", "null");
		if (event.source != null)
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.7", "OctetString", "text", event.source);
		else
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.7", "OctetString", "text", "null");
		t_nodeid = Long.toString(event.nodeid);
		if (t_nodeid != null)
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.8", "OctetString", "text", t_nodeid);
		else
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.8", "OctetString", "text", "null");
		if (event.time != null)
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.9", "OctetString", "text", event.time);
		else
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.9", "OctetString", "text", "null");
		if (event.host != null)
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.10", "OctetString", "text", event.host);
		else
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.10", "OctetString", "text", "null");
		t_interface = event.getInterface();
		if (t_interface != null)
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.11", "OctetString", "text", t_interface);
		else
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.11", "OctetString", "text", "null");
		if (event.snmphost != null)
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.12", "OctetString", "text", event.snmphost);
		else
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.12", "OctetString", "text", "einstein.ntrs.com");

			<!-- The snmphost field must be changed to the hostname of the OpenNMS system sending the event -->

		if (event.service != null)
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.13", "OctetString", "text", event.service);
		else
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.13", "OctetString", "text", "null");
		if (event.descr != null) {
			descrString = event.descr.replaceAll("&lt;.*?&gt;", " ").replaceAll("\\s+", " ");
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.16", "OctetString", "text", descrString);
		}
		else
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.16", "OctetString", "text", "null");
		if (event.logmsg.content != null) {
			logString = event.logmsg.content.replaceAll("&lt;.*?&gt;", " ").replaceAll("\\s+", " ");
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.17", "OctetString", "text", logString);
		}
		else
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.17", "OctetString", "text", "null");
		if (event.severity != null)
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.18", "OctetString", "text", event.severity);
		else
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.18", "OctetString", "text", "null");
		if (event.pathoutage != null)
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.19", "OctetString", "text", event.pathoutage);
		else
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.19", "OctetString", "text", "null");
		if (event.operinstruct != null)
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.20", "OctetString", "text", event.operinstruct);
		else
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.20", "OctetString", "text", "null");

                if (t_interface != null) {
                        retParmVal = event.getInterface();
                        try {
                                java.net.InetAddress inet = java.net.InetAddress.getByName(retParmVal);
                                retParmVal = inet.getHostName();
                            } catch (java.net.UnknownHostException e) {
                            }
		} else {
			retParmVal = null;
		}
                if (retParmVal != null)
                        snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.21", "OctetString", "text", retParmVal);
                else
                        snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.21", "OctetString", "text", "null");

		if (t_nodeid != null) {
			<!-- Note, in OpenNMS 1.3.2 and later use DataSourceFactory instead of DatabaseConnectionFactory -->
			querier = new SingleResultQuerier(DatabaseConnectionFactory.getInstance(), "select nodeLabel from node where nodeId = ?");
			querier.execute(t_nodeid); // or whatever nodeId.. if this doesn't work you may need to do new Long(event.nodeid);
			label = (String)querier.getResult();
		} else {
			label = null;
		}
		if (label != null) 
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.22", "OctetString", "text", label);
		else
			snmpTrapHelper.addVarBinding(trap, ".1.3.6.1.4.1.5813.20.1.22", "OctetString", "text", "null");

		<!-- Note, in OpenNMS 1.3.2 and later, use trap.send("10.88.2.18", 162, "public"); -->
		snmpTrapHelper.sendTrap("10.88.2.18", 162, "public", trap);

		<!-- 10.88.2.18 is the destination for the trap, the port (162) and the community string (usually public for traps) -->

		}

		catch (e) {
		    sw = new StringWriter();
		    pw = new PrintWriter(sw);
		    e.printStackTrace(pw);
		    log.debug(sw.toString());
		}
	}

	</event-script>

</scriptd-configuration>

Note: see comments below about OpenNMS versions.

What This Does

This will send nodeUp/nodeDown, interfaceUp/interfaceDown, and nodeRegainedService/nodeLostService events to SMARTS, while stripping out HTML characters and whitespace.

The InCharge side

Next, you'll need to use the following configuration in InCharge:

# # ######################################### Begin OpenNMS MIB #####
# OpenNMS MIB update 12-1-05; 
BEGIN_TRAP .1.3.6.1.4.1.5813.* * *
	ClassName:		Host
	InstanceName:	$V19$
	ElementName:	$V19$
	EventName:	$V12$:$V5-EventMessage$ on $V19$
	EventText:	$V14$
	Expiration:     86400
	Severity:	$V15-Severity$
	State:	  	$V15-State$ 
	UserDefined1: 	EventID=$V1$ :: Event:$V5-message$ 
	UserDefined2: 	SEVERITY=$V15$
	UserDefined3: 	Interface=$V18$ \ Node=$V19$
	UserDefined4: 	
	UserDefined5: 	
	UserDefined6: 	Long Description:$V13$
	UserDefined7: 	Short Description:$V14$
	UserDefined8: 	SERVICE=$V12$ 
	UserDefined9: 	UNIX Team
	Map:	{
		V15-Severity
			Cleared = 5
			Critical = 1
			Indeterminate = 5
			Normal = 5
			Major = 1
			Minor = 2		
			Warning = 3
			default = 4				
		}
		{
		V15-State
			Cleared = CLEAR
			Indeterminate = CLEAR
			Normal = CLEAR
			Major = NOTIFY
			Minor = NOTIFY
			Warning = NOTIFY
			default = NOTIFY
		}
		{
		V5-message
			uei.opennms.org/nodes/nodeDown			= NodeDown
			uei.opennms.org/nodes/nodeUp			= NodeUp
			uei.opennms.org/nodes/nodeLostService		= ServiceDown
			uei.opennms.org/nodes/nodeRegainedService	= NodeRegainedService
			uei.opennms.org/nodes/interfaceDown		= InterfaceDown
			uei.opennms.org/nodes/interfaceUp		= InterfaceUp
			default = ReferToLogfile
		}
		{
		V5-EventMessage
			uei.opennms.org/nodes/nodeDown			= NodeDown
			uei.opennms.org/nodes/nodeUp			= NodeDown
			uei.opennms.org/nodes/nodeLostService		= ServiceDown
			uei.opennms.org/nodes/nodeRegainedService	= ServiceDown
			uei.opennms.org/nodes/interfaceUp		= InterfaceDown
			uei.opennms.org/nodes/interfaceDown		= InterfaceDown
			default = ReferToLogfile
		}
	LogFile: 		Trap-OpenNMS.log
END_TRAP


# # ######################################### End OpenNMS MIB #####

Note on OpenNMS versions

The above example is targeted for OpenNMS 1.2.x and 1.3.1. In 1.3.2 and later, replace DatabaseConnectionFactory with DataSourceFactory. And change:

snmpTrapHelper.sendTrap("10.88.2.18", 162, "public", trap);

To

trap.send("10.88.2.18", 162, "public");

Also, note that in pre-1.3.3 code (trunk revision 6235, probably earlier) you can filter the UEIs for which each script will be triggered by including one or more uei elements above the event-script body, eliminating the need for the "if" around the whole script. For example:

        <event-script language="beanshell">
        <uei name="uei.opennms.org/nodes/nodeLabelChanged" />

        event = bsf.lookupBean("event");
        try {

        log.debug("Forwarding an OpenNMS event.");

        <!-- Rest of script body follows here ... -->

        </event-script>

Filtering by this mechanism will also greatly reduce the noise level in scriptd.log, which will make debugging easier.