@@ -31,6 +31,22 @@ type mibEntry struct {
31
31
type SnmpTrap struct {
32
32
ServiceAddress string `toml:"service_address"`
33
33
Timeout internal.Duration `toml:"timeout"`
34
+ Version string `toml:"version"`
35
+
36
+ // Settings for version 3
37
+ ContextName string `toml:"context_name"`
38
+ // Values: "noAuthNoPriv", "authNoPriv", "authPriv"
39
+ SecLevel string `toml:"sec_level"`
40
+ SecName string `toml:"sec_name"`
41
+ // Values: "MD5", "SHA", "". Default: ""
42
+ AuthProtocol string `toml:"auth_protocol"`
43
+ AuthPassword string `toml:"auth_password"`
44
+ // Values: "DES", "AES", "". Default: ""
45
+ PrivProtocol string `toml:"priv_protocol"`
46
+ PrivPassword string `toml:"priv_password"`
47
+ EngineID string `toml:"-"`
48
+ EngineBoots uint32 `toml:"-"`
49
+ EngineTime uint32 `toml:"-"`
34
50
35
51
acc telegraf.Accumulator
36
52
listener * gosnmp.TrapListener
@@ -58,6 +74,24 @@ var sampleConfig = `
58
74
# service_address = "udp://:162"
59
75
## Timeout running snmptranslate command
60
76
# timeout = "5s"
77
+ ## Snmp version, defaults to 2c
78
+ # version = "2c"
79
+ ## SNMPv3 authentication and encryption options.
80
+ ##
81
+ ## Security Name.
82
+ # sec_name = "myuser"
83
+ ## Authentication protocol; one of "MD5", "SHA" or "".
84
+ # auth_protocol = "MD5"
85
+ ## Authentication password.
86
+ # auth_password = "pass"
87
+ ## Security Level; one of "noAuthNoPriv", "authNoPriv", or "authPriv".
88
+ # sec_level = "authNoPriv"
89
+ ## Context Name.
90
+ # context_name = ""
91
+ ## Privacy protocol used for encrypted messages; one of "DES", "AES", "AES192", "AES192C", "AES256", "AES256C" or "".
92
+ # priv_protocol = ""
93
+ ## Privacy password used for encrypted messages.
94
+ # priv_password = ""
61
95
`
62
96
63
97
func (s * SnmpTrap ) SampleConfig () string {
@@ -78,6 +112,7 @@ func init() {
78
112
timeFunc : time .Now ,
79
113
ServiceAddress : "udp://:162" ,
80
114
Timeout : defaultTimeout ,
115
+ Version : "2c" ,
81
116
}
82
117
})
83
118
}
@@ -105,6 +140,85 @@ func (s *SnmpTrap) Start(acc telegraf.Accumulator) error {
105
140
s .listener .OnNewTrap = makeTrapHandler (s )
106
141
s .listener .Params = gosnmp .Default
107
142
143
+ switch s .Version {
144
+ case "3" :
145
+ s .listener .Params .Version = gosnmp .Version3
146
+ case "2c" :
147
+ s .listener .Params .Version = gosnmp .Version2c
148
+ case "1" :
149
+ s .listener .Params .Version = gosnmp .Version1
150
+ default :
151
+ s .listener .Params .Version = gosnmp .Version2c
152
+ }
153
+
154
+ if s .listener .Params .Version == gosnmp .Version3 {
155
+ s .listener .Params .ContextName = s .ContextName
156
+ s .listener .Params .SecurityModel = gosnmp .UserSecurityModel
157
+
158
+ switch strings .ToLower (s .SecLevel ) {
159
+ case "noauthnopriv" , "" :
160
+ s .listener .Params .MsgFlags = gosnmp .NoAuthNoPriv
161
+ case "authnopriv" :
162
+ s .listener .Params .MsgFlags = gosnmp .AuthNoPriv
163
+ case "authpriv" :
164
+ s .listener .Params .MsgFlags = gosnmp .AuthPriv
165
+ default :
166
+ return fmt .Errorf ("unknown security level '%s'" , s .SecLevel )
167
+ }
168
+
169
+ var authenticationProtocol gosnmp.SnmpV3AuthProtocol
170
+ switch strings .ToLower (s .AuthProtocol ) {
171
+ case "md5" :
172
+ authenticationProtocol = gosnmp .MD5
173
+ case "sha" :
174
+ authenticationProtocol = gosnmp .SHA
175
+ //case "sha224":
176
+ // authenticationProtocol = gosnmp.SHA224
177
+ //case "sha256":
178
+ // authenticationProtocol = gosnmp.SHA256
179
+ //case "sha384":
180
+ // authenticationProtocol = gosnmp.SHA384
181
+ //case "sha512":
182
+ // authenticationProtocol = gosnmp.SHA512
183
+ case "" :
184
+ authenticationProtocol = gosnmp .NoAuth
185
+ default :
186
+ return fmt .Errorf ("unknown authentication protocol '%s'" , s .AuthProtocol )
187
+ }
188
+
189
+ var privacyProtocol gosnmp.SnmpV3PrivProtocol
190
+ switch strings .ToLower (s .PrivProtocol ) {
191
+ case "aes" :
192
+ privacyProtocol = gosnmp .AES
193
+ case "des" :
194
+ privacyProtocol = gosnmp .DES
195
+ case "aes192" :
196
+ privacyProtocol = gosnmp .AES192
197
+ case "aes192c" :
198
+ privacyProtocol = gosnmp .AES192C
199
+ case "aes256" :
200
+ privacyProtocol = gosnmp .AES256
201
+ case "aes256c" :
202
+ privacyProtocol = gosnmp .AES256C
203
+ case "" :
204
+ privacyProtocol = gosnmp .NoPriv
205
+ default :
206
+ return fmt .Errorf ("unknown privacy protocol '%s'" , s .PrivProtocol )
207
+ }
208
+
209
+ s .listener .Params .SecurityParameters = & gosnmp.UsmSecurityParameters {
210
+ AuthoritativeEngineID : s .EngineID ,
211
+ AuthoritativeEngineBoots : s .EngineBoots ,
212
+ AuthoritativeEngineTime : s .EngineTime ,
213
+ UserName : s .SecName ,
214
+ PrivacyProtocol : privacyProtocol ,
215
+ PrivacyPassphrase : s .PrivPassword ,
216
+ AuthenticationPassphrase : s .AuthPassword ,
217
+ AuthenticationProtocol : authenticationProtocol ,
218
+ }
219
+
220
+ }
221
+
108
222
// wrap the handler, used in unit tests
109
223
if nil != s .makeHandlerWrapper {
110
224
s .listener .OnNewTrap = s .makeHandlerWrapper (s .listener .OnNewTrap )
0 commit comments