snmpttconvertmibでのエラー対処

# やりたいこと

snmptt用のsnmptrap設定ファイル生成(snmpttconvermib)時に発生するエラーに対応します。
ここでは、私が経験した２エラーを取り上げます。
 １つめは、普通のSNMPエラーですが、２つめは、SNMPTT特有のエラーで面白いので取り上げました。

# エラー情報

## (１つめ)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設定内の５４行目にて、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)を持ってきてあげましょう。
それで解決です。


## (２つめ)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
```

### エラー内容
最後を見るように、１トラップだけ、トランスレーションが失敗しているとのこと。
エラー箇所は、エラーメッセージに以下のように書かれている。
* Line: 18
* Looking up via snmptranslate: CISCO-L4L7MODULE-RESOURCE-LIMIT-MIB::Counter64

よって、MIBファイル(CISCO-L4L7MODULE-RESOURCE-LIMIT-MIB.my)の１８行目を見ると

```
     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設定内です。が、前回(１つめ)とは違います。
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は素晴らしく、監視ツールのトラップ処理を行う上で必須のツールだと思います。（ただ、残念なことに、現在は活動がほぼ停止状態）
幾つかの改善点と、ユーザインターフェースさえできれば、最強のツール間違い無しだと思っています（いつか作りたいな〜）。

# おまけ
エラー(２つめ)の対応方法として、
ベンダ（今回は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';
```