はじめに
以前、Go言語からSNMPのアクセスをするプログラムの説明で
という記事を書きました。その余談に書いた、もっと人にやさしくする方法の解説です。
SNMPのMIBファイルをASN.1といフォーマットで定義します。
このファイルを読み込めるgosmiパッケージ
の紹介です。
gosnmiのパース処理のサンプル
https://github.com/sleepinggenius2/gosmi/tree/master/cmd/parse
にMIBファイルを読み込むサンプルプログラムがあります。
package main
import (
"log"
"os"
"github.com/alecthomas/repr"
"github.com/sleepinggenius2/gosmi/parser"
)
func main() {
module, err := parser.ParseFile(os.Args[1])
if err != nil {
log.Fatalln(err)
}
_ = module
repr.Println(module)
}
だけで引数で指定したMIBファイルを読み込んで構造を表示できます。
サンプルと同じディレクトリにtest.mib
というテスト用のファイルがあります。
これでテストができます。
実行例
SNMPのMIBファイルRFC1213-MIBでテストすると
$go run main.go RFC1213-MIB.txt
&parser.Module{
Pos: Position{Filename: "RFC1213-MIB.txt", Offset: 0, Line: 1, Column: 1},
Name: types.SmiIdentifier("RFC1213-MIB"),
Body: parser.ModuleBody{
Pos: Position{Filename: "RFC1213-MIB.txt", Offset: 35, Line: 3, Column: 1},
Imports: []parser.Import{
{
Pos: Position{Filename: "RFC1213-MIB.txt", Offset: 51, Line: 4, Column: 9},
Names: []types.SmiIdentifier{
types.SmiIdentifier("mgmt"),
types.SmiIdentifier("NetworkAddress"),
types.SmiIdentifier("IpAddress"),
types.SmiIdentifier("Counter"),
types.SmiIdentifier("Gauge"),
types.SmiIdentifier("TimeTicks"),
},
Module: types.SmiIdentifier("RFC1155-SMI"),
},
{
Pos: Position{Filename: "RFC1213-MIB.txt", Offset: 163, Line: 7, Column: 9},
Names: []types.SmiIdentifier{
types.SmiIdentifier("OBJECT-TYPE"),
},
Module: types.SmiIdentifier("RFC-1212"),
},
},
|
のような感じの表示なります。
構造体を表示するパッケージ
構造体を表示するためには、
というパッケージを使っています。
Pythonのrepr()という関数のGo言語版のようです。
moduleの中の情報
moduleの中にMIBの定義を読み込めました。TWSNMPシリーズでは読み込んだMIBファイルから必要な情報を取り出して、
- MIBモジュールリスト
- MIBツリー
- MIBオブジェクトの説明
- オブジェクトの型
に使っています。
TWSNMP FKのMIB管理の画面
で表示するMIBのモジュール名などです。
モジュールの名前は
module.Name
です。
モジュールのOIDは
module.Body.Identity
に定義されています。
タイプの定義は
module.Body.Types
の中に配列(スライス)で定義されています。
MIBのオブジェクトは
module.Body.Nodes
の中に配列(スライス)で定義されています。
ここから、うまく取り出してTWSNMPので使えるようにしています。