You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

135 lines
3.9 KiB

// Local demonstration receiver/query tool. It never changes device settings.
package main
import (
"bufio"
"fmt"
"net"
"os"
"time"
"github.com/gosnmp/gosnmp"
)
func main() {
if len(os.Args) != 2 {
fmt.Fprintln(os.Stderr, "Usage: probe get|trap|syslog|getv3|trapv3|syslogtcp")
os.Exit(2)
}
switch os.Args[1] {
case "get", "getv3":
client := &gosnmp.GoSNMP{Target: "192.168.0.223", Port: 161, Community: "TERA_DEMO_RO", Version: gosnmp.Version2c, Timeout: 3 * time.Second, Retries: 1}
if os.Args[1] == "getv3" {
useV3(client, false)
}
if err := client.Connect(); err != nil {
fail(err)
}
defer client.Conn.Close()
packet, err := client.Get([]string{"1.3.6.1.2.1.1.6.0", "1.3.6.1.2.1.1.3.0"})
if err != nil {
fail(err)
}
if packet.Error != gosnmp.NoError {
fail(fmt.Errorf("SNMP error: %v index=%v", packet.Error, packet.ErrorIndex))
}
fmt.Printf("Response from 192.168.0.223 (SNMP %v)\n", client.Version)
for _, variable := range packet.Variables {
show(variable)
}
case "trap", "trapv3":
listener := gosnmp.NewTrapListener()
listener.Params = &gosnmp.GoSNMP{Version: gosnmp.Version2c}
v3 := os.Args[1] == "trapv3"
if v3 {
useV3(listener.Params, true)
}
listener.OnNewTrap = func(packet *gosnmp.SnmpPacket, source *net.UDPAddr) {
if source.IP.String() != "192.168.0.223" {
return
}
if v3 && packet.Version != gosnmp.Version3 {
return
}
if !v3 && (packet.Version != gosnmp.Version2c || packet.Community != "TERA_DEMO_TRAP") {
return
}
fmt.Printf("%s Trap from %s\n", time.Now().Format(time.RFC3339), source)
for _, variable := range packet.Variables {
show(variable)
}
}
fmt.Printf("Waiting on 192.168.0.100:2162 UDP, SNMP %v. Ctrl+C stops.\n", listener.Params.Version)
if err := listener.Listen("192.168.0.100:2162"); err != nil {
fail(err)
}
case "syslog":
connection, err := net.ListenUDP("udp", &net.UDPAddr{IP: net.ParseIP("192.168.0.100"), Port: 1514})
if err != nil {
fail(err)
}
defer connection.Close()
fmt.Println("Waiting on 192.168.0.100:1514 UDP. Ctrl+C stops.")
buffer := make([]byte, 65535)
for {
size, source, err := connection.ReadFromUDP(buffer)
if err != nil {
fail(err)
}
if source.IP.String() == "192.168.0.223" {
fmt.Printf("%s %s %s\n", time.Now().Format(time.RFC3339), source, buffer[:size])
}
}
case "syslogtcp":
listener, err := net.Listen("tcp", "192.168.0.100:1514")
if err != nil {
fail(err)
}
defer listener.Close()
fmt.Println("Waiting on 192.168.0.100:1514 TCP. Ctrl+C stops.")
for {
connection, err := listener.Accept()
if err != nil {
fail(err)
}
go func() {
defer connection.Close()
host, _, _ := net.SplitHostPort(connection.RemoteAddr().String())
if host != "192.168.0.223" {
return
}
scanner := bufio.NewScanner(connection)
scanner.Buffer(make([]byte, 4096), 1024*1024)
for scanner.Scan() {
fmt.Printf("%s %s %s\n", time.Now().Format(time.RFC3339), host, scanner.Text())
}
if err := scanner.Err(); err != nil {
fmt.Fprintln(os.Stderr, err)
}
}()
}
default:
fail(fmt.Errorf("unknown mode: %s", os.Args[1]))
}
}
func useV3(client *gosnmp.GoSNMP, trap bool) {
client.Version = gosnmp.Version3
client.SecurityModel = gosnmp.UserSecurityModel
client.MsgFlags = gosnmp.AuthPriv
security := &gosnmp.UsmSecurityParameters{UserName: "TERA_DEMO_V3", AuthenticationProtocol: gosnmp.SHA, AuthenticationPassphrase: "TeraDemoAuth0910", PrivacyProtocol: gosnmp.AES, PrivacyPassphrase: "TeraDemoPriv0910"}
if trap {
security.AuthoritativeEngineID = "TERA-DEMO-0910"
}
client.SecurityParameters = security
}
func show(variable gosnmp.SnmpPDU) {
if data, ok := variable.Value.([]byte); ok {
fmt.Printf("%s = %s\n", variable.Name, data)
} else {
fmt.Printf("%s = %v (%v)\n", variable.Name, variable.Value, variable.Type)
}
}
func fail(err error) { fmt.Fprintln(os.Stderr, "ERROR:", err); os.Exit(1) }