やりたいこと
snmptt用のsnmptrap設定ファイル生成(snmpttconvermib)時に発生するエラーに対応します。
ここでは、私が経験した2エラーを取り上げます。
1つめは、普通のSNMPエラーですが、2つめは、SNMPTT特有のエラーで面白いので取り上げました。
エラー情報
(1つめ)Cannot find module ....
エラー情報
# snmpttconvertmib --in=CISCO-SYSLOG-MIB.my --out=output
Cannot find module (CISCO-SMI): At line 54 in ./CISCO-SYSLOG-MIB.my
Did not find 'ciscoMgmt' in module #-1 (./CISCO-SYSLOG-MIB.my)
Unlinked OID in CISCO-SYSLOG-MIB: ciscoSyslogMIB ::= { ciscoMgmt 41 }
Undefined identifier: ciscoMgmt near line 59 of ./CISCO-SYSLOG-MIB.my
Cannot adopt OID in CISCO-SYSLOG-MIB: clogOriginIDGroup ::= { ciscoSyslogMIBGroups 4 }
Cannot adopt OID in CISCO-SYSLOG-MIB: clogServerGroup ::= { ciscoSyslogMIBGroups 3 }
Cannot adopt OID in CISCO-SYSLOG-MIB: clogNotificationsGroup ::= { ciscoSyslogMIBGroups 2 }
Cannot adopt OID in CISCO-SYSLOG-MIB: ciscoSyslogMIBGroup ::= { ciscoSyslogMIBGroups 1 }
Cannot adopt OID in CISCO-SYSLOG-MIB: clogOriginID ::= { clogBasic 7 }
Cannot adopt OID in CISCO-SYSLOG-MIB: clogOriginIDType ::= { clogBasic 6 }
Cannot adopt OID in CISCO-SYSLOG-MIB: clogMsgDrops ::= { clogBasic 5 }
エラー内容
snmptt特有のエラーではなく、snmp一般のエラーとなります。
上記にあるように、"Cannot find module"とかある場合、外部定義されたモジュールをインポートする際に失敗しています。
今回の場合ですと、IMPORTS設定内の54行目にて、ciscoMgmtを"CISCO-SMI"から読み込もうとしていますが、CISCO-SMIが無いので当エラーが発生。
33 IMPORTS
34 MODULE-IDENTITY,
35 NOTIFICATION-TYPE,
36 OBJECT-TYPE,
37 Integer32,
38 Counter32,
....
53 ciscoMgmt
54 FROM CISCO-SMI
....
エラー対応
素直に、MIBファイル(CISCO-SMI)を持ってきてあげましょう。
それで解決です。
(2つめ)Unknown object identifier: ....
こちらは、snmptt特有のエラーです。
エラー情報
# snmpttconvertmib --in=CISCO-L4L7MODULE-RESOURCE-LIMIT-MIB.my --out=output
............
Processing MIB: CISCO-L4L7MODULE-RESOURCE-LIMIT-MIB
#
Split line TRAP-TYPE / NOTIFICATION-TYPE found (Counter64).
Line: 18
NOTIFICATION-TYPE: Counter64
Enterprise: ciscoMgmt
Looking up via snmptranslate: CISCO-L4L7MODULE-RESOURCE-LIMIT-MIB::Counter64
Unknown object identifier: CISCO-L4L7MODULE-RESOURCE-LIMIT-MIB::Counter64
OID:
#
....................
Done
Total translations: 7
Successful translations: 6
Failed translations: 1
エラー内容
最後を見るように、1トラップだけ、トランスレーションが失敗しているとのこと。
エラー箇所は、エラーメッセージに以下のように書かれている。
- Line: 18
- Looking up via snmptranslate: CISCO-L4L7MODULE-RESOURCE-LIMIT-MIB::Counter64
よって、MIBファイル(CISCO-L4L7MODULE-RESOURCE-LIMIT-MIB.my)の18行目を見ると
12 IMPORTS
13 MODULE-IDENTITY,
14 OBJECT-TYPE,
15 Unsigned32,
16 Gauge32,
17 Counter32,
18 Counter64,
19 NOTIFICATION-TYPE
20 FROM SNMPv2-SMI
21 MODULE-COMPLIANCE,
....
また、IMPORTS設定内です。が、前回(1つめ)とは違います。
19行目に、"NOTIFICATION-TYPE"の定義があるために、snmpttconvertmibがTRAP(v2なのでNOTIFICATION-TYPE)の定義があると勘違いして、TRAP定義"Counter64,"として解釈しようとしているみたいです(プログラム読むとそんな感じ)。
エラー対応
プログラムのロジックに合うように、MIBファイルの19行目と20行目を以下のように結合します。するとプログラムは、IMPORTS内の記載と判断してくれますw。
12 IMPORTS
13 MODULE-IDENTITY,
14 OBJECT-TYPE,
15 Unsigned32,
16 Gauge32,
17 Counter32,
18 Counter64,
19 NOTIFICATION-TYPE FROM SNMPv2-SMI
20 MODULE-COMPLIANCE,
最後に
もちろん、上記だけがエラー原因・対処ではないですが、経験上上記のパターンが多いため記載しています。
また、snmpttは素晴らしく、監視ツールのトラップ処理を行う上で必須のツールだと思います。(ただ、残念なことに、現在は活動がほぼ停止状態)
幾つかの改善点と、ユーザインターフェースさえできれば、最強のツール間違い無しだと思っています(いつか作りたいな〜)。
おまけ
エラー(2つめ)の対応方法として、
ベンダ(今回はCISCO)提供のMIBファイルを修正するのは嫌ですね。
だったら、snmpttconvertmibをIMPORTS処理中にTRAP(NOTIFICATION-TYPE)を解釈しないように修正してあげましょう。
これで、CISCOのMIBファイルを修正しなくてもエラーなく読み込んでくれます。
--- /usr/bin/snmpttconvertmib.org 2012-10-23 01:15:48.000000000 +0900
+++ /usr/bin/snmpttconvertmib 2017-10-18 10:22:40.950540411 +0900
@@ -255,6 +255,7 @@ if ($net_snmp_perl == 1)
my $total_translations = 0;
my $successful_translations = 0;
my $failed_translations = 0;
+my $imports_reading = 0;
$currentline=0;
#if ($net_snmp_perl == 0)
@@ -297,6 +298,15 @@ if (1)
next;
}
+ if ( $line =~ /\s*IMPORTS.*/ || $imports_reading == 1) {
+ $imports_reading = 1;
+ $currentline++; # Increment to the next line
+ if ( $line =~ /(.*)\s*;.*/) {
+ $imports_reading = 0;
+ }
+ next;
+ }
+
# TRAP-TYPE (V1) / NOTIFICATION-TYPE (V2)
#
# eg: 'mngmtAgentTrap-23003 TRAP-TYPE';