Zabbixでsnmptrapdを使い、VMwareのホストから受信(zabbixスクリプト編 その1)

Zabbixでsnmptrapdを使い、VMwareのホストから受信(snmptrapd編 その1)これと
Zabbixでsnmptrapdを使い、VMwareのホストから受信(snmptrapd編 その2)これの続き。

[root@mngsv ~]# cat /tmp/zabbix_snmptrap.log
/usr/local/bin/zabbix_snmptrap.sh: line 41: read: `disman-event-mib': not a valid identifier
/usr/local/bin/zabbix_snmptrap.sh: line 51: unexpected EOF while looking for matching ``'
/usr/local/bin/zabbix_snmptrap.sh: line 57: syntax error: unexpected end of file
エラー

前回はこんなエラーが出ていたというところで終わっていた。既存スクリプトが間違っているかと思ったところ。

■zabbix_snmptrap.shの解析

ログをチェックするとエラーが出ていた。

zabbixに登録された値を見ると

SNMPv2-SMI::enterprises.6876.4.3.301 = STRING: "host"
SNMPv2-SMI::enterprises.6876.4.3.302 = STRING: "192.168.11.111"

この2つだけ取得できているといえる・・・
つまり、read文で標準入力から取得したうちの一部ということ。

/usr/local/bin/zabbix_snmptrap.sh これをブロック単位で動作検証してみる。

----
     33 read hostname
     34 read ip
     35 read uptime
     36 read oid
     37 read address
     38 read community
     39 read enterprise
     40 #read DISMAN-EVENT-MIB
     41 read disman-event-mib
----

スクリプトの上記の部分を目視で確認できるように書き加える。

echo $hostname,$ip,$uptime,$oid,$address,$community,$enterprise,$disman

上記のような部分を書いて、どんな入力があるのかlogに出してみることにした。
snmptrapd.confはこのようにしていたので。(再掲)

traphandle default /bin/bash /usr/local/bin/zabbix_snmptrap.sh >> /tmp/zabbix_snmptrap.log 2>&1

zabbix.redalarm.jp,
UDP: [192.168.11.11]:37864,
DISMAN-EVENT-MIB::sysUpTimeInstance 0:0:00:00.00,
SNMPv2-MIB::snmpTrapOID.0 SNMPv2-MIB::coldStart,
SNMP-COMMUNITY-MIB::snmpTrapAddress.0 127.0.0.1,
SNMP-COMMUNITY-MIB::snmpTrapCommunity.0 "snmptest",
SNMPv2-MIB::snmpTrapEnterprise.0 NET-SNMP-MIB::netSnmp.99999,

入力が上記のような書き方だから、`echo $oid|cut -f2 -d’ ‘`こんな感じで全ての入力に施して抽出するらしい。
となると、VMwareから来るsnmptrapdパケットが問題と思われる。

/var/log/messagesに残っているVMwareからのパケットをもう一度見てみる。

SNMPv2-SMI::enterprises.6876.4.3 Enterprise Specific Trap (201) Uptime: 37 days, 22:20:57.99 
SNMPv2-SMI::enterprises.6876.4.3.301 = STRING: "host" 
SNMPv2-SMI::enterprises.6876.4.3.302 = STRING: "192.168.11.111" 
SNMPv2-SMI::enterprises.6876.4.3.303 = ""

この部分はずれているけれど、取れているようだ。

SNMPv2-SMI::enterprises.6876.4.3.304 = Hex-STRING: E7 B7 92 
SNMPv2-SMI::enterprises.6876.4.3.305 = Hex-STRING: E9 BB 84 ff ff B2 
SNMPv2-SMI::enterprises.6876.4.3.306 = Hex-STRING: 73 6E 6D 70 74 72  20 2D 20 E3 83 A1 E3 83 88 E3 83 AA E3 83 83 E3 82 AF 20 E4 BD BF E7 94 A8 E9 87 8F 20 3D 20 35 25 20 E3 E3 81 AF 20 E3 83 A1 E3 83 88 E3 83 AA E3 E4 BD BF E7 94 A8 E9 87 8F 20 3D 20 38 38 25 20 E3 81 BE E3 81 9F E3 81 AF 20 E3 83 A1 E3 83 88 E3 83 AA E3 83 83 E3 82 AF 20 E4 BD BF E7  20 31 25 20 E3 81 BE E3 81 9F E3 A1 E3 83 88 E3

でも、特にこの3点がHex-STRINGとなっていて、読めない=値として取得できない。

■日本語Hexをzabbixで取得している話はないだろうかと探した。

Hexはどうやら日本語ではないだろうかという指摘。
http://www.zabbix.jp/modules/newbb/viewtopic.php?topic_id=603&forum=6

http://www.casupport.jp/resources/bab9l/tec/021011514.htm
出力元で英語出力にしたら良いというものが。

■VMwareのSNMPを内部でどのように処理しているかをteeで取得することにした。

traphandle default /usr/bin/tee -a /tmp/zabbix_vmware.snmpoutput | /bin/bash /usr/local/bin/zabbix_snmptrap.sh >> /tmp/zabbix_snmptrap.log 2>&1

■テストコマンド

# snmptrap -v 1 -c snmptest 192.168.11.11 .1.3.6.1.4.1.8072.99999 localhost .1.3.6.1.4.1.8072.99999.1 s "Test Message"

■結果

 
# cat /tmp/zabbix_vmware.snmpoutput
----
zabbix.redalarm.jp
UDP: [192.168.11.11]:51530
DISMAN-EVENT-MIB::sysUpTimeInstance 0:0:00:00.00
SNMPv2-MIB::snmpTrapOID.0 SNMPv2-MIB::coldStart
SNMP-COMMUNITY-MIB::snmpTrapAddress.0 127.0.0.1
SNMP-COMMUNITY-MIB::snmpTrapCommunity.0 "snmptest"
SNMPv2-MIB::snmpTrapEnterprise.0 NET-SNMP-MIB::netSnmp.99999
 
2回目
----
zabbix.redalarm.jp
UDP: [192.168.11.11]:36036
DISMAN-EVENT-MIB::sysUpTimeInstance 0:0:00:00.00
SNMPv2-MIB::snmpTrapOID.0 SNMPv2-MIB::coldStart
SNMP-COMMUNITY-MIB::snmpTrapAddress.0 127.0.0.1
SNMP-COMMUNITY-MIB::snmpTrapCommunity.0 "snmptest"
SNMPv2-MIB::snmpTrapEnterprise.0 NET-SNMP-MIB::netSnmp.99999

次は前置きが長くなったけれど、日本語HEX変換について