LoginSignup
2
4

More than 5 years have passed since last update.

snmpttconvertmibでのエラー対処

Last updated at Posted at 2017-10-18

やりたいこと

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';
2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4