// 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) }