在上一篇文章OpenNMS全接触-事件及通知(八)中,介绍了OpenNMS在收到受管设备发出的SNMP Trap之后,如何将收到的SNMP Trap与eventconf.xml文件中定义的事件(event)进行匹配,从而触发该事件的发生。主要是引入了<mask>标签元素。在此基础上,OpenNMS还提供了根据SNMP Trap带上来的varbinds对SNMP Trap进一步过滤。

我们还是以ciscoC3800SysAggregateStatusChange事件为例,当Cisco C3800的Aggregate状态发生变化时,便会发出SNMP Trap,并触发该事件。然而该事件的严重度如何?该状态变化是“好”(比如由不可操作变为可操作)还是“坏”(由可操作变为不可操作)?其实这个信息在发上来的SNMP Trap中就已经包含了,其对应的就是parm中的第三个参数,即trap的严重度等级。

OpenNMS从1.1版本开始,就加入了根据varbinds对SNMP trap进行过滤的功能。这也是通过在<mask>中实现的,我们可以重写OpenNMS全接触-事件及通知(八)中提到的event中的mask元素:

 

  1. <mask> 
  2.   <maskelement> 
  3.     <mename>id</mename> 
  4.     <mevalue>.1.3.6.1.4.1.9.9.70.2</mevalue> 
  5.   </maskelement> 
  6.   <maskelement> 
  7.     <mename>generic</mename> 
  8.     <mevalue>6</mevalue> 
  9.   </maskelement> 
  10.   <maskelement> 
  11.     <mename>specific</mename> 
  12.     <mevalue>17</mevalue> 
  13.   </maskelement> 
  14.   <varbind> 
  15.     <vbnumber>3</vbnumber> 
  16.     <vbvalue>3</vbvalue> 
  17.   </varbind> 
  18. </mask> 

在原来的基础上加入了<varbind>元素,加入该元素后,那么该匹配条件就更严格,在原来的基础上,即OID为.1.3.6.1.4.1.9.9.70.2,且generic为6,而specific为17,又加入了对第三个参数即trap serverity只

关注等级为3的snmp trap,当然这里的等级3是由设备在发送snmp trap时确定的。比如这里的3代表着Cisco给定的等级“主要的”。

当然,我们还可以通过多个varbinds对snmp trap进行过滤。例如:

 

  1. <varbind> 
  2.   <vbnumber>3</vbnumber> 
  3.   <vbvalue>2</vbvalue> 
  4.   <vbvalue>3</vbvalue> 
  5. </varbind> 
  6. <varbind> 
  7.   <vbnumber>4</vbnumber> 
  8.   <vbvalue>2</vbvalue> 
  9.   <vbvalue>3</vbvalue> 
  10. </varbind> 

该过滤条件将匹配出第3个参数为2或者3,第4个参数为2或者3的snmp trap。

从OpenNMS1.6版本开始,还加入了通过正则表达式对varbinds的值进行过滤,只要在表达式之前加~

 

  1. <varbind> 
  2.   <vbnumber>1</vbnumber> 
  3.   <vbvalue>~[Dd]own</vbvalue> 
  4. </varbind> 

该过滤条件将过滤出第1个参数取值为“Down”或者“down"。

另外还可以通过通配符%进行快速前缀匹配,如:

 

  1. <varbind> 
  2.   <vbnumber>1</vbnumber> 
  3.   <vbvalue>Error:%</vbvalue> 
  4. </varbind> 

这将会匹配出所有第一个参数以Error:开头的所有值。

很多MIB库对某些OID的值进行了编码,即分配了一些特定值,例如snmp agent对ifAdminStatus及ifOperStatus就进行了编码处理:1代表Up,2代表Down。

而因为OpenNMS没有自带的Mib Browser,所以OpenNMS是将这种映射关系定义在event的事件描述中的。只要event配置正确,也可以在event的logmsg中将snmp trap中带的数值转换为更有意义的字符描述信息。

让我们以Cisco HSRP 的状态变化为例,(该trap对应的OID .1.3.6.1.4.1.9.9.106.2 generic 6 and specific 1),对应的事件为uei.opennms.org/vendor/Cisco/traps/cHsrpStateChange。

该trap中包含有一个varbind,其名称为cHsrpGrpStandbyState,其取值范围为从1到6,含义如下:

initial(1) learn(2) listen(3) speak(4) standby(5) active(6).

该事件的原始定义如下:

 

  1. <event> 
  2.  <mask> 
  3.   <maskelement> 
  4.    <mename>id</mename> 
  5.    <mevalue>.1.3.6.1.4.1.9.9.106.2</mevalue> 
  6.   </maskelement> 
  7.   <maskelement> 
  8.    <mename>generic</mename> 
  9.    <mevalue>6</mevalue> 
  10.   </maskelement> 
  11.   <maskelement> 
  12.    <mename>specific</mename> 
  13.    <mevalue>1</mevalue> 
  14.   </maskelement> 
  15.  </mask> 
  16.  <uei>uei.opennms.org/vendor/Cisco/traps/cHsrpStateChange</uei> 
  17.  <event-label>CISCO-HSRP-MIB defined trap event: cHsrpStateChange</event-label> 
  18.  <descr><p>A cHsrpStateChange notification is sent when a 
  19.  cHsrpGrpStandbyState transitions to either active or 
  20.  standby state, or leaves active or standby state. There 
  21.  will be only one notification issued when the state change 
  22.  is from standby to active and vice versa.</p><table> 
  23.  <tr><td><b> 
  24.  cHsrpGrpStandbyState</b></td><td>%parm[#1]% 
  25.  </td><td><p;> 
  26.  initial(1) learn(2) listen(3) speak(4) standby(5) active(6)</p> 
  27.  </td;></tr></table> 
  28.  </descr> 
  29.  <logmsg dest='logndisplay'><p>Cisco Event: HSRP State Change.</p></logmsg> 
  30.  <severity>Minor</severity> 
  31.  </event> 

现在我们要求在事件的logmsg中看到状态变化的值,即要求包含有cHsrpGrpStandbyState的当前值。而直接将其取值如2,显示在logmsg中是没有多大意义的,除非用户自己知道

这个数字的含义。那么现在我们就可以通过varbind解码的方法将这个值映射为其字符串描述即learn。

 

  1. <event> 
  2.  <mask> 
  3.   <maskelement> 
  4.    <mename>id</mename> 
  5.    <mevalue>.1.3.6.1.4.1.9.9.106.2</mevalue> 
  6.   </maskelement> 
  7.   <maskelement> 
  8.    <mename>generic</mename> 
  9.    <mevalue>6</mevalue> 
  10.   </maskelement> 
  11.   <maskelement> 
  12.    <mename>specific</mename> 
  13.    <mevalue>1</mevalue> 
  14.   </maskelement> 
  15.  </mask> 
  16.  <uei>uei.opennms.org/vendor/Cisco/traps/cHsrpStateChange</uei> 
  17.  <event-label>CISCO-HSRP-MIB defined trap event: cHsrpStateChange</event-label> 
  18.  <descr><p>A cHsrpStateChange notification is sent when a 
  19.  cHsrpGrpStandbyState transitions to either active or 
  20.  standby state, or leaves active or standby state. There 
  21.  will be only one notification issued when the state change 
  22.  is from standby to active and vice versa.</p><table> 
  23.  <tr><td><b> 
  24.  cHsrpGrpStandbyState</b></td><td>%parm[#1]% 
  25.  </td><td><p;> 
  26.  initial(1) learn(2) listen(3) speak(4) standby(5) active(6)</p> 
  27.  </td;></tr></table> 
  28.  </descr> 
  29.  <logmsg dest='logndisplay'><p>Cisco Event: HSRP State Change to %parm[#1]%.</p></logmsg> 
  30.  <severity>Minor</severity> 
  31.  <varbindsdecode> 
  32.  <parmid>parm[#1]</parmid> 
  33.  <decode varbindvalue="1" varbinddecodedstring="initial"/> 
  34.  <decode varbindvalue="2" varbinddecodedstring="learn"/> 
  35.  <decode varbindvalue="3" varbinddecodedstring="listen"/> 
  36.  <decode varbindvalue="4" varbinddecodedstring="speak"/> 
  37.  <decode varbindvalue="5" varbinddecodedstring="standby"/> 
  38.  <decode varbindvalue="6" varbinddecodedstring="active"/> 
  39.  </varbindsdecode> 
  40. </event> 

那么在该定义中,第一个参数varbind将通过<varbindsdecode>定义的映射关系将其取值替换为字符描述。例如,如果该snmp trap的第一个参数其值为6的话,则在logmsg中将显示:

<p>Cisco Event: HSRP State Change to active</p>

在后续文章中将介绍如何根据MIB库中定义的trap转换为eventconf.xml文件中的事件。