forked from gosnmp/gosnmp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtrap.go
72 lines (60 loc) · 1.56 KB
/
trap.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// Copyright 2012-2016 The GoSNMP Authors. All rights reserved. Use of this
// source code is governed by a BSD-style license that can be found in the
// LICENSE file.
package gosnmp
import (
"log"
"net"
)
// A TrapListener defineds parameters for running a SNMP Trap receiver.
// nil values will be replaced by default values.
type TrapListener struct {
OnNewTrap func(s *SnmpPacket, u *net.UDPAddr)
Params *GoSNMP
}
// Listen listens on the UDP address addr and calls the OnNewTrap
// function specified in *TrapListener for every trap recieved.
func (t *TrapListener) Listen(addr string) (err error) {
if t.Params == nil {
t.Params = Default
}
if t.OnNewTrap == nil {
t.OnNewTrap = debugTrapHandler
}
udpAddr, err := net.ResolveUDPAddr("udp", addr)
if err != nil {
return err
}
conn, err := net.ListenUDP("udp", udpAddr)
if err != nil {
return err
}
defer conn.Close()
for {
var buf [4096]byte
rlen, remote, err := conn.ReadFromUDP(buf[:])
if err != nil {
if t.Params.loggingEnabled {
t.Params.Logger.Printf("TrapListener: error in read %s\n", err)
}
}
msg := buf[:rlen]
traps := t.Params.unmarshalTrap(msg)
t.OnNewTrap(traps, remote)
}
}
// Default trap handler
func debugTrapHandler(s *SnmpPacket, u *net.UDPAddr) {
log.Printf("got trapdata from %+v: %+v\n", u, s)
}
// Unmarshal SNMP Trap
func (x *GoSNMP) unmarshalTrap(trap []byte) (result *SnmpPacket) {
result = new(SnmpPacket)
err := x.unmarshal(trap, result)
if err != nil {
if x.loggingEnabled {
x.Logger.Printf("unmarshalTrap: %s\n", err)
}
}
return result
}