1
1

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パッケージgosnmpでTRAPを送信する方法

Posted at

はじめに

Go言語のSNMPパッケージgosnmpを紹介するシリーズの5回目です。
前回は

の記事でTRAPを受信する方法について説明しました。

今回は、TRAPを送信する方法について説明します。

TRAPを送信するプログラム

gosnmpパッケージでSNMPv2cのTRAPを送信するプログラムは


package main

import (
	"log"

	g "github.com/gosnmp/gosnmp"
)

func main() {
	g.Default.Target = "192.168.1.250"
	g.Default.Port = 162
	g.Default.Community = "trap"
	err := g.Default.Connect()
	if err != nil {
		log.Fatalf("Connect() err: %v", err)
	}
	defer g.Default.Conn.Close()
	vbs := []g.SnmpPDU{
		g.SnmpPDU{
			Name:  ".1.3.6.1.6.3.1.1.4.1.0",
			Type:  g.ObjectIdentifier,
			Value: "1.3.6.1.6.3.1.1.5.1", // cloldStart
		},
	}
	trap := g.SnmpTrap{
		Variables: vbs,
	}
	_, err = g.Default.SendTrap(trap)
	if err != nil {
		log.Fatalf("SendTrap() err: %v", err)
	}
}

です。

このプログラムのポイントについて説明します。

宛先を指定

	g.Default.Target = "192.168.1.250"
	g.Default.Port = 162

宛先のIPアドレスとポートを指定します。

TRAPの種類を指定

	vbs := []g.SnmpPDU{
		g.SnmpPDU{
			Name:  ".1.3.6.1.6.3.1.1.4.1.0",
			Type:  g.ObjectIdentifier,
			Value: "1.3.6.1.6.3.1.1.5.1", // cloldStart
		},
	}

の部分でTRAPの種類を表すsnmpTrapOID.0にcoldStartを設定しています。
数値のOIDで指定していますが

の記事で紹介したパッケージを使えば名前で指定できます。

SNMPv3対応にする

先ほどのプログラムをSNMPv3対応したプログラムが

package main

import (
	"fmt"
	"log"
	"time"

	g "github.com/gosnmp/gosnmp"
)

func main() {
	g.Default.Target = "192.168.1.250"
	g.Default.Community = "trap"
	g.Default.Port = 162
+	g.Default.Version = g.Version3
+	g.Default.SecurityModel = g.UserSecurityModel
+	g.Default.MsgFlags = g.AuthPriv
+	engineID := fmt.Sprintf("17861:%d", time.Now().Unix())
+	g.Default.SecurityParameters = &g.UsmSecurityParameters{
+		UserName:                 "test",
+		AuthoritativeEngineID:    engineID,
+		AuthenticationProtocol:   g.SHA,
+		AuthenticationPassphrase: "password",
+		PrivacyProtocol:          g.AES,
+		PrivacyPassphrase:        "password",
+	}
	err := g.Default.Connect()
	if err != nil {
		log.Fatalf("Connect() err: %v", err)
	}
	defer g.Default.Conn.Close()
	vbs := []g.SnmpPDU{
		{
			Name:  ".1.3.6.1.6.3.1.1.4.1.0",
			Type:  g.ObjectIdentifier,
			Value: "1.3.6.1.6.3.1.1.5.1", // cloldStart
		},
	}
	trap := g.SnmpTrap{
		Variables: vbs,
	}
	_, err = g.Default.SendTrap(trap)
	if err != nil {
		log.Fatalf("SendTrap() err: %v", err)
	}
}

です。

送信結果

SNMPv2cとSNMPv3のどちらも同じ結果になります。
TWSNMP FCで受信した場合です。

image.png

余談

この方法を使ってPCのCPUやメモリーの使用率が一定以上になった時、SNMPのTRAPを送信するプログラムを開発しました。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?