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
135 lines
3.9 KiB
|
2 months ago
|
// 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) }
|