golang snmp開發學習筆記(一)
阿新 • • 發佈:2019-02-05
概述
soniah/gosnmp是一個純go語言編寫的SNMP包,基於alouca/gosnmp開發。目前提供GetRequest、GetNext、GetBulk、Walk和SetRequest功能,支援IPv4和IPv6, 支援SNMPv2c和SNMPv3。gosnmp還在開發,目前不支援Trap,Walk和SetRequest也還不夠完善,但作為一般的網路監控用途已經足夠,如果需要還可以直接對原始碼進行修改補充。
本文介紹soniah/gosnmp的GetRequest、GetNext和GetBulk操作。
資源
安裝
go get github.com/soniah/gosnmp
範例 1. GetRequest
package main
import (
"fmt"
"log"
g "github.com/soniah/gosnmp"
)
func main() {
// Default is a pointer to a GoSNMP struct that contains
// sensible defaults eg port 161, community public, etc
g.Default.Target = "172.18.0.2"
g.Default.Community = "community"
err := g.Default.Connect()
if err != nil {
log.Fatalf("Connect() err: %v", err)
}
defer g.Default.Conn.Close()
oids := []string{"1.3.6.1.2.1.1.5.0","1.3.6.1.2.1.1.7.0"}
result, err := g.Default.Get(oids) // Get() accepts up to g.MAX_OIDS
if err != nil {
log.Fatalf("Get() err: %v" , err)
}
for i, v := range result.Variables {
fmt.Printf("%d. oid: %s ", i, v.Name)
// the Value of each variable returned by Get() implements
// interface{}. You could do a type switch...
switch v.Type{
case g.OctetString:
fmt.Printf("string: %s\n", string(v.Value.([]byte)))
default:
// ... or often you're just interested in numeric values.
// ToBigInt() will return the Value as a BigInt, for plugging
// into your calculations.
fmt.Printf("number: %d\n", g.ToBigInt(v.Value))
}
}
}
輸出結果:
0. oid: .1.3.6.1.2.1.1.5.0 string: YD_WLZX1F_S2652
1. oid: .1.3.6.1.2.1.1.7.0 number: 3
範例 2. 自己構造GoSNMP結構
package main
import (
"fmt"
"log"
"time"
g "github.com/soniah/gosnmp"
)
func main() {
// build our own GoSNMP struct, rather than using g.Default
snmp := &g.GoSNMP{
Target: "172.18.0.2",
Port: 161,
Community: "community",
Version: g.Version2c,
Timeout: time.Duration(2) * time.Second,
}
err := snmp.Connect()
if err != nil {
log.Fatalf("Connect() err: %v", err)
}
defer snmp.Conn.Close()
oids := []string{"1.3.6.1.2.1.1.5.0","1.3.6.1.2.1.1.7.0"}
result, err := snmp.Get(oids)
if err != nil {
log.Fatalf("Get() err: %v", err)
}
for i, v := range result.Variables {
fmt.Printf("%d. oid: %s ", i, v.Name)
switch v.Type{
case g.OctetString:
fmt.Printf("string: %s\n", string(v.Value.([]byte)))
default:
fmt.Printf("number: %d\n", g.ToBigInt(v.Value))
}
}
}
輸出結果:
0. oid: .1.3.6.1.2.1.1.5.0 string: YD_WLZX1F_S2652
1. oid: .1.3.6.1.2.1.1.7.0 number: 3
範例 3. SNMPv3
package main
import (
"fmt"
"log"
"time"
g "github.com/soniah/gosnmp"
)
func main() {
snmp := &GoSNMP{
Target: "172.17.0.10",
Port: 161,
Community: "community",
Version: g.Version3,
Timeout: time.Duration(30) * time.Second,
SecurityModel: g.UserSecurityModel,
MsgFlags: g.AuthPriv, //認證且加密
SecurityParameters: &g.UsmSecurityParameters {
UserName: "user",
AuthenticationProtocol: g.SHA,
AuthenticationPassphrase: "password",
PrivacyProtocol: g.DES,
PrivacyPassphrase: "password",
},
}
err := snmp.Connect()
if err != nil {
log.Fatalf("Connect() err: %v", err)
}
defer snmp.Conn.Close()
oids := []string{"1.3.6.1.2.1.1.5.0","1.3.6.1.2.1.1.7.0"}
result, err := snmp.Get(oids)
if err != nil {
log.Fatalf("Get() err: %v", err)
}
for i, v := range result.Variables {
fmt.Printf("%d. oid: %s ", i, v.Name)
switch v.Type{
case g.OctetString:
fmt.Printf("string: %s\n", string(v.Value.([]byte)))
default:
fmt.Printf("number: %d\n", g.ToBigInt(v.Value))
}
}
}
todo: 範例3程式碼未驗證。
範例 4. GetNext
package main
import (
"fmt"
"log"
g "github.com/soniah/gosnmp"
)
func main() {
g.Default.Target = "172.18.0.2"
g.Default.Community = "community"
err := g.Default.Connect()
if err != nil {
log.Fatalf("Connect() err: %v", err)
}
defer g.Default.Conn.Close()
oids := []string{"1.3.6.1.2.1.1.5", "1.3.6.1.2.1.2.2.1.10"}
result, err := g.Default.GetNext(oids)
if err != nil {
log.Fatalf("Get() err: %v", err)
}
for i, v := range result.Variables {
fmt.Printf("%d. oid: %s ", i, v.Name)
switch v.Type{
case g.OctetString:
fmt.Printf("string: %s\n", string(v.Value.([]byte)))
default:
fmt.Printf("number: %d\n", g.ToBigInt(v.Value))
}
}
}
輸出結果:
0. oid: .1.3.6.1.2.1.1.5.0 string: YD_WLZX1F_S2652
1. oid: .1.3.6.1.2.1.2.2.1.10.1 number: 144611
範例 5. GetBulk
package main
import (
"fmt"
"log"
g "github.com/soniah/gosnmp"
)
func main() {
g.Default.Target = "172.18.0.2"
g.Default.Community = "community"
err := g.Default.Connect()
if err != nil {
log.Fatalf("Connect() err: %v", err)
}
defer g.Default.Conn.Close()
oids := []string{
"1.3.6.1.2.1.1.2", //sysObjectID
"1.3.6.1.2.1.1.5", //sysName
"1.3.6.1.2.1.2.2.1.1", //ifIndex
"1.3.6.1.2.1.2.2.1.10", //ifInOctets
"1.3.6.1.2.1.2.2.1.16", //ifOutOctets
}
//前2個oid不重複,後3個重複10次,相當於執行5次GetNext
result, err := g.Default.GetBulk(oids, 2, 5)
if err != nil {
log.Fatalf("Get() err: %v", err)
}
for i, v := range result.Variables {
fmt.Printf("%d: %s = ", i, v.Name)
switch v.Type{
case g.OctetString:
fmt.Printf("%s\n", string(v.Value.([]byte)))
default:
fmt.Printf("%d\n", g.ToBigInt(v.Value))
}
}
}
輸出結果:
0: .1.3.6.1.2.1.1.2.0 = 0
1: .1.3.6.1.2.1.1.5.0 = YD_WLZX1F_S2652
2: .1.3.6.1.2.1.2.2.1.1.1 = 1
3: .1.3.6.1.2.1.2.2.1.10.1 = 144611
4: .1.3.6.1.2.1.2.2.1.16.1 = 539306284
5: .1.3.6.1.2.1.2.2.1.1.2 = 2
6: .1.3.6.1.2.1.2.2.1.10.2 = 0
7: .1.3.6.1.2.1.2.2.1.16.2 = 0
8: .1.3.6.1.2.1.2.2.1.1.3 = 3
9: .1.3.6.1.2.1.2.2.1.10.3 = 70688630
10: .1.3.6.1.2.1.2.2.1.16.3 = 216291621
11: .1.3.6.1.2.1.2.2.1.1.4 = 4
12: .1.3.6.1.2.1.2.2.1.10.4 = 129777391
13: .1.3.6.1.2.1.2.2.1.16.4 = 1052726443
14: .1.3.6.1.2.1.2.2.1.1.5 = 5
15: .1.3.6.1.2.1.2.2.1.10.5 = 169733222
16: .1.3.6.1.2.1.2.2.1.16.5 = 641244267