sensu-plugins-snmptrap-extension 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +18 -0
- data/LICENSE +22 -0
- data/README.md +96 -0
- data/bin/extension-snmptrap.rb +239 -0
- data/lib/sensu-plugins-snmptrap-extension.rb +1 -0
- data/lib/sensu-plugins-snmptrap-extension/version.rb +9 -0
- metadata +241 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b9ade74acbf2e688353c1fbe51c10fb310d33993
|
4
|
+
data.tar.gz: 183bbd5e5cdb31f9a0af9ed1a1f22344da3b5eeb
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1bd4fb7ba9941e00a1deadcd5d6b10232824a87b7156b684702a85aaffc55471ca0fb34be1cb1bc038587b0d3b6959b28db88232f253af6c564897f719b7b47f
|
7
|
+
data.tar.gz: 686ece3016f49c2e329ee4988f84b2831d1cbccf1c06452cff74ab96197ac8acf7e2e692767494c3940ddbecc39f1da9b306bb71782c4eb79e3b24d011fd29ae
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#Change Log
|
2
|
+
This project adheres to [Semantic Versioning](http://semver.org/).
|
3
|
+
|
4
|
+
This CHANGELOG follows the format listed at [Keep A Changelog](http://keepachangelog.com/)
|
5
|
+
|
6
|
+
## Unreleased
|
7
|
+
### Added
|
8
|
+
- Rake, gemspecs and basic core test code
|
9
|
+
- This CHANGELOG
|
10
|
+
- Travis configuration for test building
|
11
|
+
|
12
|
+
### Changed
|
13
|
+
- Moved script to bin sub-directory as part of refactor to adhere to sensu-plugin conventions
|
14
|
+
|
15
|
+
|
16
|
+
## 0.0.1 - 2015-05-20
|
17
|
+
### Added
|
18
|
+
- initial release
|
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2015 Sensu-Plugins
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
# Sensu SNMP Trap Extension
|
2
|
+
|
3
|
+
Creates an SNMP trap listening to all incoming traps on the configured interface and triggers events into sensu as JIT events when specifying the source of the event.
|
4
|
+
|
5
|
+
[](https://travis-ci.org/warmfusion/sensu-extension-snmptrap)
|
6
|
+
|
7
|
+
## TODO
|
8
|
+
|
9
|
+
Also able to run as a 'polling' service in either Check or Metrics mode where values can be directly compared against expectations (eg value > 10)
|
10
|
+
or where values are sent to Sensu as metrics values for charting or other purposes.
|
11
|
+
|
12
|
+
|
13
|
+
## Configuration
|
14
|
+
|
15
|
+
The SNMPTrap configuration is defined in a json file inside conf.d/extensions (or anywhere sensu consumes configuration)
|
16
|
+
and includes a traps configuration element that describes:
|
17
|
+
|
18
|
+
* An array of traps that the extension will monitor for events (from any host) which includes
|
19
|
+
* `trap_oid` - the identity of the trap
|
20
|
+
* `trap` - A hash of key/value pairs that can be used as template values in the event
|
21
|
+
* `event` - The template event to send to Sensu, including {template} variables for customisation based on the message
|
22
|
+
|
23
|
+
|
24
|
+
### Templating
|
25
|
+
|
26
|
+
Any value defined in `trap` that contains an OID that is included in the incoming trap can be used as part of any element of the
|
27
|
+
event being sent to Sensu. This includes handlers, names (Only AlphaNumeric allow), status etc etc.
|
28
|
+
|
29
|
+
Simply wrap your template in braces and it will be automatically replaced during processing. See the heartbeatrate in the example
|
30
|
+
below.
|
31
|
+
|
32
|
+
> Note: The 'source' and 'hostname' variables are automatically provided to you. Hostname contains the FQDN name of the server (or the IP if it
|
33
|
+
> can't get resolved) and 'source' contains the IP address (with no lookups)
|
34
|
+
|
35
|
+
### Basic Extension Configuration
|
36
|
+
|
37
|
+
|
38
|
+
{
|
39
|
+
"snmp": {
|
40
|
+
|
41
|
+
}
|
42
|
+
}
|
43
|
+
|
44
|
+
### Trap Configuration
|
45
|
+
|
46
|
+
Each SNMP Trap is configured in its own configuration file. This lets you easily create configuration through Puppet/Chef etc without
|
47
|
+
having to manipulate the same configuration file.
|
48
|
+
|
49
|
+
Simply create a uniquely named json file in `/etc/sensu/traps.d` containing the definition of the trap(s) you wish to capture and
|
50
|
+
act upon.
|
51
|
+
|
52
|
+
|
53
|
+
[
|
54
|
+
{
|
55
|
+
"trap_oid": "1.3.6.1.4.1.8072.2.3.0.1",
|
56
|
+
"trap": {
|
57
|
+
"heartbeatrate": "1.3.6.1.4.1.8072.2.3.2.1"
|
58
|
+
},
|
59
|
+
"event": {
|
60
|
+
"name": "snmp-trap-{hostname}",
|
61
|
+
"status": 1,
|
62
|
+
"output": "Heartbeat Rate {heartbeatrate}",
|
63
|
+
"handler": "default"
|
64
|
+
}
|
65
|
+
},
|
66
|
+
...
|
67
|
+
]
|
68
|
+
|
69
|
+
The JSON file is an array of trap definitions containing:
|
70
|
+
|
71
|
+
* trap_oid
|
72
|
+
* Definition: (String) The OID to monitor for events on
|
73
|
+
* trap
|
74
|
+
* Definition: (Array) Key/Value pairs representing named variables (key) against the OID values of the message elements (value)
|
75
|
+
which can then be used as template values in the event section
|
76
|
+
* event
|
77
|
+
* Definition: (Hash) The event to trigger if the SNMP trap is recieved - Accepts any value that will then get sent to sensu
|
78
|
+
as a normal check event - this includes handlers, subdues, or custom key/value pairs as you require.
|
79
|
+
* name
|
80
|
+
* Definition: (String) The name of the sensu check that is sent to the sensu-client - ALPHANUMERIC and should be fairly unique (Required)
|
81
|
+
* status
|
82
|
+
* Definition: (Numeric) The numeric status of the status (0-OK, 1-Warning, 2-Critical, 3-Unknown) (Required)
|
83
|
+
* output
|
84
|
+
* Definition: (String) The message to send to the sensu client (Required)
|
85
|
+
* handler
|
86
|
+
* Definition: (String) The handler that the sensu-server should use to process this event (Optional)
|
87
|
+
|
88
|
+
|
89
|
+
## Appendix
|
90
|
+
|
91
|
+
Handy Test script:
|
92
|
+
|
93
|
+
snmptrap -v 2c -c public localhost:1062 "" NET-SNMP-EXAMPLES-MIB::netSnmpExampleHeartbeatNotification netSnmpExampleHeartbeatRate i 123456
|
94
|
+
|
95
|
+
|
96
|
+
Released under the same terms as Sensu (the MIT license).
|
@@ -0,0 +1,239 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# extension-snmptrap.rb
|
4
|
+
#
|
5
|
+
# DESCRIPTION:
|
6
|
+
# Handles incoming SNMP Traps and emits sensu events
|
7
|
+
# Creates an SNMP trap listening to all incoming traps on any interface and triggers events into sensu as JIT clients specifying the source of the event.
|
8
|
+
#
|
9
|
+
# Also able to run as a 'polling' service in either Check or Metrics mode
|
10
|
+
# where values can be directly compared against expectations (eg value > 10)
|
11
|
+
# or where values are sent to Sensu as metrics values for charting or
|
12
|
+
# other purposes.
|
13
|
+
#
|
14
|
+
# {
|
15
|
+
# "snmp": { }
|
16
|
+
# }
|
17
|
+
#
|
18
|
+
# OUTPUT:
|
19
|
+
# N/A - Extension submits multiple events of different types based on snmp configuration
|
20
|
+
#
|
21
|
+
# PLATFORMS:
|
22
|
+
# Linux
|
23
|
+
#
|
24
|
+
# DEPENDENCIES:
|
25
|
+
# gem: snmp
|
26
|
+
#
|
27
|
+
# USAGE:
|
28
|
+
# Traps are configured in /etc/sensu/traps.d directory, one json file containing one or more trap configurations
|
29
|
+
# as described in the README.md that accompanies this script.
|
30
|
+
#
|
31
|
+
# NOTES:
|
32
|
+
# No special notes. This should be fairly straight forward.
|
33
|
+
#
|
34
|
+
# LICENSE:
|
35
|
+
# Toby Jackson <toby@warmfusion.co.uk>
|
36
|
+
# Peter Daugavietis <pdaugavietis@gmail.com>
|
37
|
+
# Released under the same terms as Sensu (the MIT license); see LICENSE
|
38
|
+
# for details.
|
39
|
+
#
|
40
|
+
#
|
41
|
+
# ##############################
|
42
|
+
# Handy Test script:
|
43
|
+
# snmptrap -v 2c -c public localhost:1062 "" NET-SNMP-EXAMPLES-MIB::netSnmpExampleHeartbeatNotification netSnmpExampleHeartbeatRate i 123456
|
44
|
+
#
|
45
|
+
# Useful SNMP browser to help find things:
|
46
|
+
# http://tools.cisco.com/Support/SNMP/do/BrowseOID.do?local=en&translate=Translate&objectInput=1.3.6.1.2.1.1.5
|
47
|
+
#
|
48
|
+
# http://www.net-snmp.org/docs/mibs/ucdavis.html#laTable
|
49
|
+
# Load Average Last Minute - .1.3.6.1.4.1.2021.10.1.3.1
|
50
|
+
#
|
51
|
+
require 'net/http'
|
52
|
+
require 'snmp'
|
53
|
+
require 'json'
|
54
|
+
include SNMP
|
55
|
+
|
56
|
+
module Sensu
|
57
|
+
module Extension
|
58
|
+
class SNMPTrapHandler < Check
|
59
|
+
# assume the /etc/sensu/extensions folder as location for relative
|
60
|
+
data_path = File.expand_path(File.dirname(__FILE__) + '/../mibs')
|
61
|
+
|
62
|
+
DEFAULT_MIB_PATH = nil
|
63
|
+
if File.exist?(data_path)
|
64
|
+
DEFAULT_MIB_PATH = data_path
|
65
|
+
else
|
66
|
+
@logger.info "Could not find default MIB directory, tried:\n #{data_path}"
|
67
|
+
end
|
68
|
+
|
69
|
+
def name
|
70
|
+
'SnmpTrapHandler'
|
71
|
+
end
|
72
|
+
|
73
|
+
def description
|
74
|
+
'SNMP Extension that handles/traps SNMP events'
|
75
|
+
end
|
76
|
+
|
77
|
+
def options
|
78
|
+
return @options if @options
|
79
|
+
@options = {
|
80
|
+
bind: '0.0.0.0',
|
81
|
+
port: 1062,
|
82
|
+
community: 'public',
|
83
|
+
handler: 'default',
|
84
|
+
send_interval: 60,
|
85
|
+
trapdefs_dir: '/etc/sensu/traps.d',
|
86
|
+
mibs_dir: '/etc/sensu/mibs'
|
87
|
+
}
|
88
|
+
@options.merge!(@settings[:snmp]) if @settings[:snmp].is_a?(Hash)
|
89
|
+
@options
|
90
|
+
end
|
91
|
+
|
92
|
+
def definition
|
93
|
+
{
|
94
|
+
type: 'extension',
|
95
|
+
name: name,
|
96
|
+
publish: false # Don't run this extension as a check
|
97
|
+
}
|
98
|
+
end
|
99
|
+
|
100
|
+
def post_init
|
101
|
+
# Setup SNMPTrap
|
102
|
+
@logger.debug "Loading SNMPTrap definitions from #{options[:trapdefs_dir]}"
|
103
|
+
@trapdefs = []
|
104
|
+
Dir.glob(options[:trapdefs_dir] + '/*.json') do |file|
|
105
|
+
# do something with the file here
|
106
|
+
@logger.info file
|
107
|
+
@trapdefs.concat Array(JSON.parse(File.read(file)))
|
108
|
+
end
|
109
|
+
|
110
|
+
@logger.debug @trapdefs.to_json
|
111
|
+
|
112
|
+
@mibs = []
|
113
|
+
Dir.glob(options[:mibs_dir] + '/*.yaml') do |file|
|
114
|
+
# do something with the file here
|
115
|
+
@logger.debug "Reading MIB configuration from #{File.basename(file, '.yaml')}"
|
116
|
+
@mibs << File.basename(file, '.yaml')
|
117
|
+
end
|
118
|
+
@logger.debug @mibs.to_json
|
119
|
+
|
120
|
+
start_trap_listener
|
121
|
+
end
|
122
|
+
|
123
|
+
def run(_data = nil, _options = {}, &callback)
|
124
|
+
@logger.warn('SNMP Trap: Run called as a check - this is not supported')
|
125
|
+
output = 'SNMPHandler extension should not be called as a standalone check'
|
126
|
+
callback.call(output, 3)
|
127
|
+
end
|
128
|
+
|
129
|
+
def start_trap_listener
|
130
|
+
@logger.info('Starting SNMP Trap listener...')
|
131
|
+
|
132
|
+
SNMP::TrapListener.new(Host: options[:bind], Port: options[:port]) do |manager|
|
133
|
+
# Need patched Gem to allow the following functions/lookups
|
134
|
+
# Need to copy the MIBs from somewhere to the Gem location needed (or fix the importing mechanism too)
|
135
|
+
|
136
|
+
# If the following MIB code is used, SNMPTrap hangs up and stops working... dont know why - possibly
|
137
|
+
# an implicit .join() somewhere locking things up ?
|
138
|
+
# SNMP::MIB.import_modules(@mibs)
|
139
|
+
# manager.load_modules(@mibs, DEFAULT_MIB_PATH)
|
140
|
+
# @mib = manager.mib
|
141
|
+
|
142
|
+
manager.on_trap_v1 do |trap|
|
143
|
+
@logger.info('v1-Trap caught')
|
144
|
+
@logger.info trap.to_json
|
145
|
+
end
|
146
|
+
|
147
|
+
manager.on_trap_v2c do |trap|
|
148
|
+
@logger.info('v2-Trap caught')
|
149
|
+
@logger.info(trap.to_json)
|
150
|
+
|
151
|
+
processed = false
|
152
|
+
@trapdefs.each do |trapdef|
|
153
|
+
if !trapdef['trap_oid'].nil?
|
154
|
+
trapdef_oid = SNMP::ObjectId.new(trapdef['trap_oid'])
|
155
|
+
else
|
156
|
+
trapdef_oid = SNMP::ObjectId.new(@mib.oid(trapdef[:trap_name]))
|
157
|
+
end
|
158
|
+
@logger.debug 'trapdef ' + trapdef_oid.inspect
|
159
|
+
@logger.debug 'trap ' + trap.trap_oid.inspect
|
160
|
+
# only accept configured traps
|
161
|
+
if trap.trap_oid == trapdef_oid
|
162
|
+
@logger.info "Processing known v2 trap #{trap.trap_oid}"
|
163
|
+
process_v2c_trap trap, trapdef
|
164
|
+
processed = true
|
165
|
+
break
|
166
|
+
end
|
167
|
+
@logger.debug "Ignoring unrecognised trap: #{trap.trap_oid}" unless processed
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
@logger.info("SNMP Trap listener has started on #{options[:bind]}:#{options[:port]}")
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
private
|
176
|
+
|
177
|
+
# Doesn't appear to be possible to ping Sensu directly for async event triggering
|
178
|
+
# even though we're inside Sensu right now...
|
179
|
+
def publish_check_result(check)
|
180
|
+
# a little risky: we're assuming Sensu-Client is listening on Localhost:3030
|
181
|
+
# for submitted results : https://sensuapp.org/docs/latest/clients#client-socket-input
|
182
|
+
@logger.info "Sending SNMP check event: #{check.to_json}"
|
183
|
+
|
184
|
+
host = settings[:client][:bind] ||= '127.0.0.1'
|
185
|
+
port = settings[:client][:port] ||= '3030'
|
186
|
+
t = TCPSocket.new host, port
|
187
|
+
t.write(check.to_json + "\n")
|
188
|
+
end
|
189
|
+
|
190
|
+
def process_v2c_trap(trap, trapdef)
|
191
|
+
hostname = trap.source_ip
|
192
|
+
begin
|
193
|
+
hostname = Resolv.getname(trap.source_ip)
|
194
|
+
rescue Resolv::ResolvError
|
195
|
+
@logger.debug("Unable to resolve name for #{trap.source_ip}")
|
196
|
+
end
|
197
|
+
|
198
|
+
fields = {}
|
199
|
+
fields[:source] = trap.source_ip
|
200
|
+
fields[:hostname] = hostname
|
201
|
+
|
202
|
+
@logger.debug('Checking trap definition for key/value template pairs')
|
203
|
+
Array(trapdef['trap']).each do |key, value|
|
204
|
+
begin
|
205
|
+
value = SNMP::ObjectId.new(value)
|
206
|
+
rescue
|
207
|
+
value = SNMP::ObjectId.new(@mib.oid(value))
|
208
|
+
end
|
209
|
+
|
210
|
+
@logger.debug key.inspect + ', ' + value.inspect
|
211
|
+
@logger.debug trap.varbind_list.inspect
|
212
|
+
val = trap.varbind_list.find { |vb| vb.name == value }
|
213
|
+
if val.nil?
|
214
|
+
@logger.warn("trap.#{key} has OID(#{value}) that was not found in incoming trap - Check your configuration")
|
215
|
+
end
|
216
|
+
@logger.debug("Discovered value of #{key} is '#{val}'")
|
217
|
+
fields[key] = val.value unless val.nil?
|
218
|
+
end
|
219
|
+
|
220
|
+
@logger.debug("Template fields are: #{fields.inspect}")
|
221
|
+
|
222
|
+
# Replace any {template} values in the event with the value of
|
223
|
+
# snmp values defined in the traps configuration
|
224
|
+
fields.each do |key, value|
|
225
|
+
trapdef['event'].each do |k, v|
|
226
|
+
@logger.debug("Looking for #{key} in #{trapdef['event'][k]}")
|
227
|
+
begin
|
228
|
+
trapdef['event'][k] = v.gsub("{#{key}}", value.to_s.gsub('/', '-'))
|
229
|
+
rescue
|
230
|
+
trapdef['event'][k] = v
|
231
|
+
end
|
232
|
+
end
|
233
|
+
end
|
234
|
+
@logger.debug trapdef['event']
|
235
|
+
publish_check_result trapdef['event']
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'sensu-plugins-snmptrap-extension/version'
|
metadata
ADDED
@@ -0,0 +1,241 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sensu-plugins-snmptrap-extension
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Toby Jackson <toby@warmfusion.co.uk>
|
8
|
+
- Peter Daugavietis <pdaugavietis@gmail.com>
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain:
|
12
|
+
- certs/sensu-plugins.pem
|
13
|
+
date: 2016-06-04 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: snmp
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
requirements:
|
19
|
+
- - '='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 1.2.0
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - '='
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
version: 1.2.0
|
29
|
+
- !ruby/object:Gem::Dependency
|
30
|
+
name: sensu-plugin
|
31
|
+
requirement: !ruby/object:Gem::Requirement
|
32
|
+
requirements:
|
33
|
+
- - '='
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: 1.2.0
|
36
|
+
type: :runtime
|
37
|
+
prerelease: false
|
38
|
+
version_requirements: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - '='
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 1.2.0
|
43
|
+
- !ruby/object:Gem::Dependency
|
44
|
+
name: net
|
45
|
+
requirement: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - '>='
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0'
|
50
|
+
type: :runtime
|
51
|
+
prerelease: false
|
52
|
+
version_requirements: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - '>='
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
- !ruby/object:Gem::Dependency
|
58
|
+
name: json
|
59
|
+
requirement: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - '>='
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
type: :runtime
|
65
|
+
prerelease: false
|
66
|
+
version_requirements: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
- !ruby/object:Gem::Dependency
|
72
|
+
name: bundler
|
73
|
+
requirement: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '1.7'
|
78
|
+
type: :development
|
79
|
+
prerelease: false
|
80
|
+
version_requirements: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - ~>
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '1.7'
|
85
|
+
- !ruby/object:Gem::Dependency
|
86
|
+
name: codeclimate-test-reporter
|
87
|
+
requirement: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - ~>
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '0.4'
|
92
|
+
type: :development
|
93
|
+
prerelease: false
|
94
|
+
version_requirements: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - ~>
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0.4'
|
99
|
+
- !ruby/object:Gem::Dependency
|
100
|
+
name: github-markup
|
101
|
+
requirement: !ruby/object:Gem::Requirement
|
102
|
+
requirements:
|
103
|
+
- - ~>
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: '1.3'
|
106
|
+
type: :development
|
107
|
+
prerelease: false
|
108
|
+
version_requirements: !ruby/object:Gem::Requirement
|
109
|
+
requirements:
|
110
|
+
- - ~>
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '1.3'
|
113
|
+
- !ruby/object:Gem::Dependency
|
114
|
+
name: pry
|
115
|
+
requirement: !ruby/object:Gem::Requirement
|
116
|
+
requirements:
|
117
|
+
- - ~>
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '0.10'
|
120
|
+
type: :development
|
121
|
+
prerelease: false
|
122
|
+
version_requirements: !ruby/object:Gem::Requirement
|
123
|
+
requirements:
|
124
|
+
- - ~>
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '0.10'
|
127
|
+
- !ruby/object:Gem::Dependency
|
128
|
+
name: rake
|
129
|
+
requirement: !ruby/object:Gem::Requirement
|
130
|
+
requirements:
|
131
|
+
- - ~>
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '10.0'
|
134
|
+
type: :development
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
requirements:
|
138
|
+
- - ~>
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
version: '10.0'
|
141
|
+
- !ruby/object:Gem::Dependency
|
142
|
+
name: rspec
|
143
|
+
requirement: !ruby/object:Gem::Requirement
|
144
|
+
requirements:
|
145
|
+
- - ~>
|
146
|
+
- !ruby/object:Gem::Version
|
147
|
+
version: '3.1'
|
148
|
+
type: :development
|
149
|
+
prerelease: false
|
150
|
+
version_requirements: !ruby/object:Gem::Requirement
|
151
|
+
requirements:
|
152
|
+
- - ~>
|
153
|
+
- !ruby/object:Gem::Version
|
154
|
+
version: '3.1'
|
155
|
+
- !ruby/object:Gem::Dependency
|
156
|
+
name: rubocop
|
157
|
+
requirement: !ruby/object:Gem::Requirement
|
158
|
+
requirements:
|
159
|
+
- - '='
|
160
|
+
- !ruby/object:Gem::Version
|
161
|
+
version: 0.32.1
|
162
|
+
type: :development
|
163
|
+
prerelease: false
|
164
|
+
version_requirements: !ruby/object:Gem::Requirement
|
165
|
+
requirements:
|
166
|
+
- - '='
|
167
|
+
- !ruby/object:Gem::Version
|
168
|
+
version: 0.32.1
|
169
|
+
- !ruby/object:Gem::Dependency
|
170
|
+
name: redcarpet
|
171
|
+
requirement: !ruby/object:Gem::Requirement
|
172
|
+
requirements:
|
173
|
+
- - ~>
|
174
|
+
- !ruby/object:Gem::Version
|
175
|
+
version: '3.2'
|
176
|
+
type: :development
|
177
|
+
prerelease: false
|
178
|
+
version_requirements: !ruby/object:Gem::Requirement
|
179
|
+
requirements:
|
180
|
+
- - ~>
|
181
|
+
- !ruby/object:Gem::Version
|
182
|
+
version: '3.2'
|
183
|
+
- !ruby/object:Gem::Dependency
|
184
|
+
name: yard
|
185
|
+
requirement: !ruby/object:Gem::Requirement
|
186
|
+
requirements:
|
187
|
+
- - ~>
|
188
|
+
- !ruby/object:Gem::Version
|
189
|
+
version: '0.8'
|
190
|
+
type: :development
|
191
|
+
prerelease: false
|
192
|
+
version_requirements: !ruby/object:Gem::Requirement
|
193
|
+
requirements:
|
194
|
+
- - ~>
|
195
|
+
- !ruby/object:Gem::Version
|
196
|
+
version: '0.8'
|
197
|
+
description: Sensu extension for trapping SNMP events and reemiting as templated events
|
198
|
+
email: <toby@warmfusion.co.uk>
|
199
|
+
executables:
|
200
|
+
- extension-snmptrap.rb
|
201
|
+
extensions: []
|
202
|
+
extra_rdoc_files: []
|
203
|
+
files:
|
204
|
+
- bin/extension-snmptrap.rb
|
205
|
+
- lib/sensu-plugins-snmptrap-extension/version.rb
|
206
|
+
- lib/sensu-plugins-snmptrap-extension.rb
|
207
|
+
- LICENSE
|
208
|
+
- README.md
|
209
|
+
- CHANGELOG.md
|
210
|
+
homepage: https://github.com/warmfusion/sensu-sensu-extension-snmptrap
|
211
|
+
licenses:
|
212
|
+
- MIT
|
213
|
+
metadata:
|
214
|
+
maintainer: '@warmfusion'
|
215
|
+
development_status: active
|
216
|
+
production_status: unstable - testing recommended
|
217
|
+
release_draft: 'false'
|
218
|
+
release_prerelease: 'false'
|
219
|
+
post_install_message: You can use the embedded Ruby by setting EMBEDDED_RUBY=true
|
220
|
+
in /etc/default/sensu
|
221
|
+
rdoc_options: []
|
222
|
+
require_paths:
|
223
|
+
- lib
|
224
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
225
|
+
requirements:
|
226
|
+
- - '>='
|
227
|
+
- !ruby/object:Gem::Version
|
228
|
+
version: 1.9.3
|
229
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
230
|
+
requirements:
|
231
|
+
- - '>='
|
232
|
+
- !ruby/object:Gem::Version
|
233
|
+
version: '0'
|
234
|
+
requirements: []
|
235
|
+
rubyforge_project:
|
236
|
+
rubygems_version: 2.0.14.1
|
237
|
+
signing_key:
|
238
|
+
specification_version: 4
|
239
|
+
summary: Sensu extension to capture SNMP trap events
|
240
|
+
test_files: []
|
241
|
+
has_rdoc:
|