1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Go言語でSNMPのMIBファイルを読み込む方法

Posted at

はじめに

以前、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管理の画面

image.png

で表示するMIBのモジュール名などです。

モジュールの名前は

module.Name

です。

モジュールのOIDは

 module.Body.Identity

に定義されています。

タイプの定義は

 module.Body.Types

の中に配列(スライス)で定義されています。

MIBのオブジェクトは

module.Body.Nodes

の中に配列(スライス)で定義されています。

ここから、うまく取り出してTWSNMPので使えるようにしています。

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?