GoSNMP is an SNMP client library fully written in Go. It provides Get, GetNext, GetBulk, Walk, BulkWalk, Set and Traps. It supports IPv4 and IPv6, using SNMPv2c or SNMPv3. Builds are tested against linux/amd64 and linux/386.
About
soniah/gosnmp was originally based on alouca/gosnmp, but has been completely rewritten. Many thanks to Andreas Louca, other contributors (AUTHORS.md) and these project collaborators:
Overview
GoSNMP has the following SNMP functions:
- Get (single or multiple OIDs)
- GetNext
- GetBulk
- Walk - retrieves a subtree of values using GETNEXT.
- BulkWalk - retrieves a subtree of values using GETBULK.
- Set - supports Integers and OctetStrings.
- SendTrap - send SNMP TRAPs.
- Listen - act as an NMS for receiving TRAPs.
GoSNMP has the following helper functions:
*big.Int
soniah/gosnmp has completely diverged from alouca/gosnmp, your code will require modification in these (and other) locations:
ConnectGoSNMPgosnmp.Defaultgosnmp.Logger
type Logger interface { Print(v ...interface{}) Printf(format string, v ...interface{}) }
Installation
go get github.com/soniah/gosnmp
Documentation
Usage
examples/example.go
// Default is a pointer to a GoSNMP struct that contains sensible defaults // eg port 161, community public, etc g.Default.Target = "192.168.1.10" 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.4.0", "1.3.6.1.2.1.1.7.0"} result, err2 := g.Default.Get(oids) // Get() accepts up to g.MAX_OIDS if err2 != nil { log.Fatalf("Get() err: %v", err2) } for i, variable := range result.Variables { fmt.Printf("%d: oid: %s ", i, variable.Name) // the Value of each variable returned by Get() implements // interface{}. You could do a type switch... switch variable.Type { case g.OctetString: bytes := variable.Value.([]byte) fmt.Printf("string: %s\n", string(bytes)) 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(variable.Value)) } }
Running this example gives the following output (from my printer):
% go run example.go 0: oid: 1.3.6.1.2.1.1.4.0 string: Administrator 1: oid: 1.3.6.1.2.1.1.7.0 number: 104
examples/example2.goexample.go&GoSNMPg.Defaultexamples/walkexample.goBulkWalkexamples/example3.goSNMPv3examples/trapserver.go
Contributions
Contributions are welcome, especially ones that have packet captures (see below).
If you've never contributed to a Go project before, here is an example workflow.
go get github.com/soniah/gosnmpcd $GOPATH/src/github.com/soniah/gosnmpgit remote rename origin upstreamgit remote add origin git@github.com:/gosnmp.gitgit checkout -b developmentgit push -u origin development
Packet Captures
Create your packet captures in the following way:
Expected output, obtained via an snmp command. For example:
% snmpget -On -v2c -c public 203.50.251.17 1.3.6.1.2.1.1.7.0 \ 1.3.6.1.2.1.2.2.1.2.6 1.3.6.1.2.1.2.2.1.5.3 .1.3.6.1.2.1.1.7.0 = INTEGER: 78 .1.3.6.1.2.1.2.2.1.2.6 = STRING: GigabitEthernet0 .1.3.6.1.2.1.2.2.1.5.3 = Gauge32: 4294967295
A packet capture, obtained while running the snmpget. For example:
sudo tcpdump -s 0 -i eth0 -w foo.pcap host 203.50.251.17 and port 161
Bugs
Rane's document SNMP: Simple? Network Management Protocol was useful when learning the SNMP protocol.
Please create an issue on Github with packet captures (upload capture to Google Drive, Dropbox, or similar) containing samples of missing BER types, or of any other bugs you find. If possible, please include 2 or 3 examples of the missing/faulty BER type.
The following BER types have been implemented:
- 0x02 Integer
- 0x04 OctetString
- 0x06 ObjectIdentifier
- 0x40 IPAddress (IPv4 & IPv6)
- 0x41 Counter32
- 0x42 Gauge32
- 0x43 TimeTicks
- 0x44 Opaque (Float & Double)
- 0x46 Counter64
- 0x47 Uinteger32
- 0x80 NoSuchObject
- 0x81 NoSuchInstance
- 0x82 EndOfMibView
The following (less common) BER types haven't been implemented, as I ran out of time or haven't been able to find example devices to query:
- 0x00 EndOfContents
- 0x01 Boolean
- 0x03 BitString
- 0x07 ObjectDescription
- 0x45 NsapAddress
Running the Tests
export GOSNMP_TARGET=1.2.3.4 export GOSNMP_PORT=161 export GOSNMP_TARGET_IPV4=1.2.3.4 export GOSNMP_PORT_IPV4=161 export GOSNMP_TARGET_IPV6='0:0:0:0:0:ffff:102:304' export GOSNMP_PORT_IPV6=161 go test -v -tags all # for example go test -v -tags helper # for example
Tests are grouped as follows:
marshal_test.gomisc_test.gogosnmp_api_test.gogeneric_e2e_test.go
generic_e2e_test.go
To profile cpu usage:
go test -cpuprofile cpu.out go test -c go tool pprof gosnmp.test cpu.out
To profile memory usage:
go test -memprofile mem.out go test -c go tool pprof gosnmp.test mem.out
To check test coverage:
go get github.com/axw/gocov/gocov go get github.com/matm/gocov-html gocov test github.com/soniah/gosnmp | gocov-html > gosnmp.html && firefox gosnmp.html &
License
Parts of the code are taken from the Golang project (specifically some functions for unmarshaling BER responses), which are under the same terms and conditions as the Go language. The rest of the code is under a BSD license.
See the LICENSE file for more details.
The remaining code is Copyright 2012-2018 the GoSNMP Authors - see AUTHORS.md for a list of authors.