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("<.*>", " ").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("<.*>", " ").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.






