Integrating OpenNMS and EMC/SMARTS InCharge

From OpenNMS

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.

Personal tools
DevJam 2008 Sponsors
DevJam 2008 Sponsor: Google
DevJam 2008 Sponsor: Netregistry
DevJam 2008 Sponsor: Papa John's
NewEdge Networks
OpenNMS takes home the gold award!
Join the Free Software Foundation
Support This Project Commercial OpenNMS Support OpenNMS Italia Get OpenNMS at SourceForge.net. Fast, secure and Free Open Source software downloads Our Network Simulator Our Java Profiler