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 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
+ [![Build Status](https://travis-ci.org/warmfusion/sensu-extension-snmptrap.svg)](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'
@@ -0,0 +1,9 @@
1
+ module SensuPluginsSnmptrapExtension
2
+ module Version
3
+ MAJOR = 0
4
+ MINOR = 1
5
+ PATCH = 0
6
+
7
+ VER_STRING = [MAJOR, MINOR, PATCH].compact.join('.')
8
+ end
9
+ end
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: