1. 程式人生 > >golang snmp開發學習筆記(一)

golang snmp開發學習筆記(一)

概述

  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