gosnmp
97 строк · 2.4 Кб
1// Copyright 2023 The GoSNMP Authors. All rights reserved. Use of this
2// source code is governed by a BSD-style license that can be found in the
3// LICENSE file.
4
5/*
6The developer of the trapserver code (https://github.com/jda) says "I'm working
7on the best level of abstraction but I'm able to receive traps from a Cisco
8switch and Net-SNMP".
9
10Pull requests welcome.
11*/
12
13package main14
15import (16"flag"17"fmt"18"log"19"net"20"os"21"path/filepath"22
23g "github.com/gosnmp/gosnmp"24)
25
26var secParamsList = []*g.UsmSecurityParameters{27{28UserName: "myuser",29AuthenticationProtocol: g.MD5,30AuthenticationPassphrase: "mypassword",31PrivacyProtocol: g.AES,32PrivacyPassphrase: "myprivacy",33},34{35UserName: "myuser2",36AuthenticationProtocol: g.SHA,37AuthenticationPassphrase: "mypassword2",38PrivacyProtocol: g.DES,39PrivacyPassphrase: "myprivacy2",40},41{42UserName: "myuser2",43AuthenticationProtocol: g.MD5,44AuthenticationPassphrase: "mypassword2",45PrivacyProtocol: g.AES,46PrivacyPassphrase: "myprivacy2",47},48}
49
50func main() {51flag.Usage = func() {52fmt.Printf("Usage:\n")53fmt.Printf(" %s\n", filepath.Base(os.Args[0]))54flag.PrintDefaults()55}56
57tl := g.NewTrapListener()58tl.OnNewTrap = myTrapHandler59
60usmTable := g.NewSnmpV3SecurityParametersTable(g.NewLogger(log.New(os.Stdout, "", 0)))61for _, sp := range secParamsList {62err := usmTable.Add(sp.UserName, sp)63if err != nil {64usmTable.Logger.Print(err)65}66}67
68gs := &g.GoSNMP{69Port: 161,70Transport: "udp",71Version: g.Version3, // Always using version3 for traps, only option that works with all SNMP versions simultaneously72SecurityModel: g.UserSecurityModel,73SecurityParameters: &g.UsmSecurityParameters{AuthoritativeEngineID: "12345"}, // Use for server's engine ID74TrapSecurityParametersTable: usmTable,75}76tl.Params = gs77tl.Params.Logger = g.NewLogger(log.New(os.Stdout, "", 0))78
79err := tl.Listen("0.0.0.0:9162")80if err != nil {81log.Panicf("error in listen: %s", err)82}83}
84
85func myTrapHandler(packet *g.SnmpPacket, addr *net.UDPAddr) {86log.Printf("got trapdata from %s\n", addr.IP)87for _, v := range packet.Variables {88switch v.Type {89case g.OctetString:90b := v.Value.([]byte)91fmt.Printf("OID: %s, string: %x\n", v.Name, b)92
93default:94log.Printf("trap: %+v\n", v)95}96}97}
98