gosnmp
116 строк · 2.7 Кб
1// Copyright 2020 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
5package main
6
7import (
8"fmt"
9"log"
10"net"
11"time"
12
13gosnmp "github.com/gosnmp/gosnmp"
14)
15
16func main() {
17log.Println("Starting")
18
19var port uint16 = 2162
20go Start(fmt.Sprintf("tcp://0.0.0.0:%d", port))
21
22gosnmp.Default.Target = "127.0.0.1"
23gosnmp.Default.Transport = "tcp"
24gosnmp.Default.Port = port
25gosnmp.Default.Community = "public"
26gosnmp.Default.Version = gosnmp.Version1
27time.Sleep(time.Duration(1) * time.Second)
28
29oid := gosnmp.SnmpPDU{
30Name: "1.3.6.1.2.1.1.6",
31Type: gosnmp.ObjectIdentifier,
32Value: "1.3.6.1.2.1.1.6.10",
33}
34oid1 := gosnmp.SnmpPDU{
35Name: "1.3.6.1.2.1.1.7",
36Type: gosnmp.OctetString,
37Value: "Testing TCP trap...",
38}
39oid2 := gosnmp.SnmpPDU{
40Name: "1.3.6.1.2.1.1.8",
41Type: gosnmp.Integer,
42Value: 123,
43}
44
45cou := 5
46for cou > 0 {
47time.Sleep(time.Duration(1) * time.Second)
48err := gosnmp.Default.Connect()
49if err != nil {
50log.Fatal(err)
51}
52defer gosnmp.Default.Conn.Close()
53//RebuildCron()
54log.Printf("Running (%d)\n", cou)
55
56trap := gosnmp.SnmpTrap{
57Variables: []gosnmp.SnmpPDU{oid, oid1, oid2},
58Enterprise: ".1.3.6.1.6.3.1.1.5.1",
59AgentAddress: "127.0.0.1",
60GenericTrap: 0,
61SpecificTrap: 0,
62Timestamp: 300,
63}
64_, err = gosnmp.Default.SendTrap(trap)
65if err != nil {
66log.Fatalf("SendTrap() err: %v\n", err)
67}
68
69cou--
70}
71//time.Sleep(time.Duration(10) * time.Second)
72
73log.Println("Stop...")
74}
75
76// Start SNMP server
77func Start(address string) {
78
79log.Printf("Starting SNMP TRAP Server on: %s\n", address)
80tl := gosnmp.NewTrapListener()
81tl.OnNewTrap = myTrapHandlerTCP
82tl.Params = gosnmp.Default
83
84err := tl.Listen(address)
85if err != nil {
86time.Sleep(1 * time.Second)
87log.Fatalf("Error in TRAP listen: %s\n", err)
88}
89}
90
91func myTrapHandlerTCP(packet *gosnmp.SnmpPacket, addr *net.UDPAddr) {
92log.Printf("SNMP trap received from: %s:%d. Community:%s, SnmpVersion:%s\n",
93addr.IP, addr.Port, packet.Community, packet.Version)
94for i, variable := range packet.Variables {
95var val string
96switch variable.Type {
97case gosnmp.OctetString:
98val = string(variable.Value.([]byte))
99case gosnmp.ObjectIdentifier:
100val = fmt.Sprintf("%s", variable.Value)
101case gosnmp.TimeTicks:
102a := gosnmp.ToBigInt(variable.Value)
103val = fmt.Sprintf("%d", (*a).Int64())
104case gosnmp.Null:
105val = ""
106default:
107// ... or often you're just interested in numeric values.
108// ToBigInt() will return the Value as a BigInt, for plugging
109// into your calculations.
110a := gosnmp.ToBigInt(variable.Value)
111val = fmt.Sprintf("%d", (*a).Int64())
112}
113log.Printf("- oid[%d]: %s (%s) = %v \n", i, variable.Name, variable.Type, val)
114
115}
116}
117