sensu-plugins-snmptrap-extension 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b9ade74acbf2e688353c1fbe51c10fb310d33993
4
- data.tar.gz: 183bbd5e5cdb31f9a0af9ed1a1f22344da3b5eeb
3
+ metadata.gz: b9a0ba4669fb05ae1039fbf59f4bb0a282f593ab
4
+ data.tar.gz: 36686e2a0d14e5e979a9896e6be199cf12ddd507
5
5
  SHA512:
6
- metadata.gz: 1bd4fb7ba9941e00a1deadcd5d6b10232824a87b7156b684702a85aaffc55471ca0fb34be1cb1bc038587b0d3b6959b28db88232f253af6c564897f719b7b47f
7
- data.tar.gz: 686ece3016f49c2e329ee4988f84b2831d1cbccf1c06452cff74ab96197ac8acf7e2e692767494c3940ddbecc39f1da9b306bb71782c4eb79e3b24d011fd29ae
6
+ metadata.gz: 9b73adb6c909802ba22b8371de7a5fa019d8073f709604881e2498a67c7a6ce97a6d5f7463e49380290de05fc99d69877732c3a1148588a23197baebca6079b8
7
+ data.tar.gz: 0deabed059f0438d22a63f33207fb72f1c986273420755a93547f3388ba874fb56318c4f63842a3cf728932762a741d5a382b7481df4dd4592bbceb24f3ab3c5
data/CHANGELOG.md CHANGED
@@ -3,16 +3,28 @@ This project adheres to [Semantic Versioning](http://semver.org/).
3
3
 
4
4
  This CHANGELOG follows the format listed at [Keep A Changelog](http://keepachangelog.com/)
5
5
 
6
- ## Unreleased
6
+
7
+ ## [Unreleased]
8
+ ### Added
9
+
10
+ ### Changed
11
+
12
+ ## [0.2.0] - 2016-06-04
7
13
  ### Added
8
- - Rake, gemspecs and basic core test code
9
- - This CHANGELOG
10
- - Travis configuration for test building
14
+ - README: Instructions on installation
15
+
16
+ ### Fixed
17
+ - Log message handling from @amdprophet
18
+ - Autodiscovery of sensu-client's JIT event socket
19
+ - Better handling when the event socket is missing/unconfigured
20
+
11
21
 
12
22
  ### Changed
13
- - Moved script to bin sub-directory as part of refactor to adhere to sensu-plugin conventions
23
+ - README: Reformatting and extended examples
24
+ - Reduced the log noise by reducing the log severity on a number of messages
25
+
14
26
 
15
27
 
16
- ## 0.0.1 - 2015-05-20
28
+ ## [0.1.0] - 2016-06-04
17
29
  ### Added
18
30
  - initial release
data/README.md CHANGED
@@ -4,93 +4,193 @@ Creates an SNMP trap listening to all incoming traps on the configured interface
4
4
 
5
5
  [![Build Status](https://travis-ci.org/warmfusion/sensu-extension-snmptrap.svg)](https://travis-ci.org/warmfusion/sensu-extension-snmptrap)
6
6
 
7
- ## TODO
7
+ [![Gem Version](https://badge.fury.io/rb/sensu-plugins-snmptrap-extension.svg)](https://badge.fury.io/rb/sensu-plugins-snmptrap-extension)
8
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
9
 
10
+ # Installation
12
11
 
13
- ## Configuration
12
+ As sensu extensions cannot be dynamically loaded by sensu at runtime, you must
13
+ install the extension manually once the gem has installed.
14
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:
15
+ If you're using the EMBEDDED_RUBY from sensu;
17
16
 
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
17
+ ```
18
+ sensu-install -p sensu-plugins-snmptrap-extension
22
19
 
20
+ ln -s /opt/sensu/embedded/lib/ruby/gems/*/gems/sensu-plugins-snmptrap-extension-*/bin/extension-snmptrap.rb /etc/sensu/extensions/extension-snmptrap.rb
21
+ ```
23
22
 
24
- ### Templating
23
+ If using standalone ruby;
25
24
 
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.
25
+ ```
26
+ gem install sensu-plugins-snmptrap-extension
28
27
 
29
- Simply wrap your template in braces and it will be automatically replaced during processing. See the heartbeatrate in the example
30
- below.
28
+ ln -s $(gem environment gemdir)/gems/sensu-plugins-snmptrap-extension*/bin/extension-snmptrap.rb /etc/sensu/extensions/extension-snmptrap.rb
29
+ ```
31
30
 
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)
31
+ ## Configuration
34
32
 
35
- ### Basic Extension Configuration
33
+ The SNMPTrap configuration is defined in a json file inside conf.d/extensions (or anywhere sensu consumes configuration)
34
+ and includes a traps configuration element that describes:
36
35
 
36
+ * An array of traps that the extension will monitor for events (from any host) which includes
37
+ * `trap_oid` - the identity of the trap
38
+ * `trap` - A hash of key/value pairs that can be used as template values in the event
39
+ * `event` - The template event to send to Sensu, including {template} variables for customisation based on the message
37
40
 
38
- {
39
- "snmp": {
40
-
41
- }
42
- }
43
41
 
44
42
  ### Trap Configuration
45
43
 
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.
44
+ Each SNMP Trap is configured in its own configuration file. This lets you easily create configuration through Puppet/Chef etc without having to manipulate the same configuration file.
51
45
 
46
+ Simply create a uniquely named json file in `/etc/sensu/traps.d` containing the definition of the trap(s) you wish to capture and act upon.
52
47
 
48
+ ```
53
49
  [
54
50
  {
55
51
  "trap_oid": "1.3.6.1.4.1.8072.2.3.0.1",
56
52
  "trap": {
57
- "heartbeatrate": "1.3.6.1.4.1.8072.2.3.2.1"
53
+ "heartbeatrate": "1.3.6.1.4.1.8072.2.3.2.1"
58
54
  },
59
55
  "event": {
60
56
  "name": "snmp-trap-{hostname}",
61
57
  "status": 1,
62
- "output": "Heartbeat Rate {heartbeatrate}",
63
- "handler": "default"
58
+ "output": "Heartbeat Rate {heartbeatrate}",
59
+ "handler": "default",
60
+ "client": "{hostname}"
64
61
  }
65
62
  },
66
63
  ...
67
64
  ]
65
+ ```
68
66
 
69
67
  The JSON file is an array of trap definitions containing:
70
68
 
71
69
  * trap_oid
72
70
  * Definition: (String) The OID to monitor for events on
73
71
  * 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
72
+ * Definition: (Array) Key/Value pairs representing named variables (key)
73
+ against the OID values of the message elements (value) which can then be
74
+ used as template values in the event section
76
75
  * 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.
76
+ * Definition: (Hash) The event to trigger if the SNMP trap is received - Accepts any
77
+ value that will then get sent to sensu as a normal check event - this includes
78
+ handlers, subdues, or custom key/value pairs as you require.
79
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)
80
+ * Definition: (String) The name of the sensu check that is sent to the
81
+ sensu-client - ALPHANUMERIC and should be fairly unique (Required)
81
82
  * status
82
- * Definition: (Numeric) The numeric status of the status (0-OK, 1-Warning, 2-Critical, 3-Unknown) (Required)
83
+ * Definition: (Numeric) The numeric status of the status
84
+ (0-OK, 1-Warning, 2-Critical, 3-Unknown) (Required)
83
85
  * output
84
86
  * Definition: (String) The message to send to the sensu client (Required)
85
87
  * handler
86
88
  * Definition: (String) The handler that the sensu-server should use to process this event (Optional)
87
89
 
90
+ #### Templating
91
+
92
+ 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
93
+ event being sent to Sensu. This includes handlers, names (Only AlphaNumeric allow), status etc etc.
94
+
95
+ Simply wrap your template in braces and it will be automatically replaced during processing. See the heartbeatrate in the example
96
+ below.
97
+
98
+ > Note: The 'source' and 'hostname' variables are automatically provided to you. Hostname contains the FQDN name of the server (or the IP if it
99
+ > can't get resolved) and 'source' contains the IP address (with no lookups)
100
+
101
+ ### Override SNMP default configuration
102
+
103
+ The SNMPTrap extension provides some simple configuration options which are shown
104
+ below;
105
+
106
+ {
107
+ "snmp": {
108
+ bind: '0.0.0.0',
109
+ port: 1062,
110
+ community: 'public',
111
+ handler: 'default',
112
+ send_interval: 60,
113
+ trapdefs_dir: '/etc/sensu/traps.d',
114
+ mibs_dir: '/etc/sensu/mibs',
115
+ client_socket_bind: settings[:client][:socket][:bind],
116
+ client_socket_port: settings[:client][:socket][:port]
117
+ }
118
+ }
119
+
120
+ |param|type|default|description|
121
+ |----|----|----|---|
122
+ |:bind|:string|0.0.0.0| IP to bind the SNMPTrap listener to |
123
+ |:port|:integer|1062| Port to bind the SNMPTrap listener to |
124
+ |:community|:string|"public"| *NOT USED* |
125
+ |:handler|:string|"default"| *NOT USED* |
126
+ |:send_interval|:integer|60| *NOT USED* |
127
+ |:trapdefs_dir|:string|"/etc/sensu/traps.d"| Path to directory containing trap.json files to watch for |
128
+ |:mibs_dir|:string|"/etc/sensu/mibs"| *NOT USED* - Loading MIBs causes the extension to lock up |
129
+ |:client_socket_bind|:string| `settings[:client][:socket][:bind]` | IP to send events to when handled |
130
+ |:client_socket_port|:integer| `settings[:client][:socket][:port]` | Port to send events to when handled|
131
+
132
+ #### client_socket_xxx
133
+
134
+ SNMPTrap has to use the sensu client socket to emit events when traps arrive.
135
+ This is because there does not appear to be an asynchronous mechanism to send
136
+ event objects into sensu-client directly, so instead a brief TCP connection
137
+ to the sensu-client is made.
88
138
 
89
- ## Appendix
139
+ The extension tries to get the configuration from the sensu config.json, so
140
+ this should not require changing, but if you'd like to send events to another
141
+ sensu-client you can do so here.
90
142
 
91
- Handy Test script:
92
143
 
144
+ ## Appendix
145
+
146
+ ### snmp-mibs-downloader - My SNMP doesn't work
147
+
148
+ If youre using a Debian/Ubuntu based distro, you may find it hard to get SNMP working
149
+ as it doens't include the set of MIB definitions required for alot of common systems.
150
+
151
+ This is because those definitions have been copyrighted by various organisations and
152
+ as such can only be obtained on the 'non-free' channels.
153
+
154
+ To help get setup without having to install the non-free distribution, you can use
155
+ the following few commands to get updated (and therefore working) MIB lists
156
+
157
+
158
+ ```
159
+ apt-get install smistrip snmp
160
+ wget http://ftp.uk.debian.org/debian/pool/non-free/s/snmp-mibs-downloader/snmp-mibs-downloader_1.1_all.deb
161
+ dpkg -i snmp-mibs-downloader_1.1_all.deb
162
+ ```
163
+
164
+
165
+ ### Testing your configuration
166
+
167
+ Add a configuration file like this into `/etc/sensu/traps.d/example_heartbeat.json`
168
+
169
+ ```
170
+ [
171
+ {
172
+ "trap_oid": "1.3.6.1.4.1.8072.2.3.0.1",
173
+ "trap": {
174
+ "heartbeatrate": "1.3.6.1.4.1.8072.2.3.2.1"
175
+ },
176
+ "event": {
177
+ "name": "snmp-trap-{hostname}",
178
+ "status": 1,
179
+ "output": "Heartbeat Rate {heartbeatrate}",
180
+ "handler": "default"
181
+ }
182
+ }
183
+ ]
184
+ ```
185
+
186
+ And then run the following command;
187
+
188
+ ```
93
189
  snmptrap -v 2c -c public localhost:1062 "" NET-SNMP-EXAMPLES-MIB::netSnmpExampleHeartbeatNotification netSnmpExampleHeartbeatRate i 123456
190
+ ```
191
+
192
+ > Requires the `snmp` package to be installed
94
193
 
194
+ # License
95
195
 
96
- Released under the same terms as Sensu (the MIT license).
196
+ Released under the same terms as Sensu (the MIT license).
@@ -4,17 +4,29 @@
4
4
  #
5
5
  # DESCRIPTION:
6
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.
7
+ # Creates an SNMP trap listening to all incoming traps on any interface and
8
+ # triggers events into sensu as JIT clients specifying the source of the event.
8
9
  #
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
10
  #
14
11
  # {
15
12
  # "snmp": { }
16
13
  # }
17
14
  #
15
+ # Default options are;
16
+ # {
17
+ # "snmp": {
18
+ # bind: '0.0.0.0',
19
+ # port: 1062,
20
+ # community: 'public',
21
+ # handler: 'default',
22
+ # send_interval: 60,
23
+ # trapdefs_dir: '/etc/sensu/traps.d',
24
+ # mibs_dir: '/etc/sensu/mibs',
25
+ # client_socket_bind: settings[:client][:socket][:bind],
26
+ # client_socket_port: settings[:client][:socket][:port]
27
+ # }
28
+ # }
29
+ #
18
30
  # OUTPUT:
19
31
  # N/A - Extension submits multiple events of different types based on snmp configuration
20
32
  #
@@ -56,16 +68,6 @@ include SNMP
56
68
  module Sensu
57
69
  module Extension
58
70
  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
71
  def name
70
72
  'SnmpTrapHandler'
71
73
  end
@@ -83,7 +85,9 @@ module Sensu
83
85
  handler: 'default',
84
86
  send_interval: 60,
85
87
  trapdefs_dir: '/etc/sensu/traps.d',
86
- mibs_dir: '/etc/sensu/mibs'
88
+ mibs_dir: '/etc/sensu/mibs',
89
+ client_socket_bind: settings[:client][:socket][:bind],
90
+ client_socket_port: settings[:client][:socket][:port]
87
91
  }
88
92
  @options.merge!(@settings[:snmp]) if @settings[:snmp].is_a?(Hash)
89
93
  @options
@@ -97,37 +101,50 @@ module Sensu
97
101
  }
98
102
  end
99
103
 
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)))
104
+ def validate
105
+
106
+ if options[:client_socket_bind].nil?
107
+ @logger.warn "couldnt find client socket binding - is it defined? https://sensuapp.org/docs/latest/reference/clients.html#socket-attributes"
108
+ false
108
109
  end
110
+ true
111
+ end
109
112
 
110
- @logger.debug @trapdefs.to_json
113
+ def post_init
114
+ if !validate
115
+ @logger.error "failed to validate the #{name} extension"
116
+ else
117
+ # Setup SNMPTrap
118
+ @logger.debug "loading SNMPTrap definitions from #{options[:trapdefs_dir]}"
119
+ @trapdefs = []
120
+ Dir.glob(options[:trapdefs_dir] + '/*.json') do |file|
121
+ @logger.debug "Reading #{file}..."
122
+ @trapdefs.concat Array(::JSON.parse(File.read(file)))
123
+ end
111
124
 
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
125
+ @logger.debug "loaded trapdefs..."
126
+ @logger.debug @trapdefs.to_json
127
+
128
+ @mibs = []
129
+ Dir.glob(options[:mibs_dir] + '/*.yaml') do |file|
130
+ # do something with the file here
131
+ @logger.debug "reading MIB configuration from #{File.basename(file, '.yaml')}"
132
+ @mibs << File.basename(file, '.yaml')
133
+ end
134
+ @logger.debug @mibs.to_json
119
135
 
120
- start_trap_listener
136
+ start_trap_listener
137
+ end
121
138
  end
122
139
 
123
140
  def run(_data = nil, _options = {}, &callback)
124
- @logger.warn('SNMP Trap: Run called as a check - this is not supported')
141
+ @logger.warn('SNMP trap: run called as a check - this is not supported')
125
142
  output = 'SNMPHandler extension should not be called as a standalone check'
126
143
  callback.call(output, 3)
127
144
  end
128
145
 
129
146
  def start_trap_listener
130
- @logger.info('Starting SNMP Trap listener...')
147
+ @logger.info('starting SNMPTrap listener...')
131
148
 
132
149
  SNMP::TrapListener.new(Host: options[:bind], Port: options[:port]) do |manager|
133
150
  # Need patched Gem to allow the following functions/lookups
@@ -140,13 +157,11 @@ module Sensu
140
157
  # @mib = manager.mib
141
158
 
142
159
  manager.on_trap_v1 do |trap|
143
- @logger.info('v1-Trap caught')
144
- @logger.info trap.to_json
160
+ @logger.warn('SNMPTrap caught an snmp v1 trap which not currently handled')
145
161
  end
146
162
 
147
163
  manager.on_trap_v2c do |trap|
148
- @logger.info('v2-Trap caught')
149
- @logger.info(trap.to_json)
164
+ @logger.debug('v2-Trap caught')
150
165
 
151
166
  processed = false
152
167
  @trapdefs.each do |trapdef|
@@ -159,16 +174,16 @@ module Sensu
159
174
  @logger.debug 'trap ' + trap.trap_oid.inspect
160
175
  # only accept configured traps
161
176
  if trap.trap_oid == trapdef_oid
162
- @logger.info "Processing known v2 trap #{trap.trap_oid}"
177
+ @logger.info "SNMPTrap is processing a defined snmp v2 trap oid:#{trap.trap_oid}"
163
178
  process_v2c_trap trap, trapdef
164
179
  processed = true
165
180
  break
166
181
  end
167
- @logger.debug "Ignoring unrecognised trap: #{trap.trap_oid}" unless processed
182
+ @logger.debug "ignoring unrecognised trap: #{trap.trap_oid}" unless processed
168
183
  end
169
184
  end
170
185
 
171
- @logger.info("SNMP Trap listener has started on #{options[:bind]}:#{options[:port]}")
186
+ @logger.info("SNMPTrap listener has started on #{options[:bind]}:#{options[:port]}")
172
187
  end
173
188
  end
174
189
 
@@ -179,12 +194,18 @@ module Sensu
179
194
  def publish_check_result(check)
180
195
  # a little risky: we're assuming Sensu-Client is listening on Localhost:3030
181
196
  # for submitted results : https://sensuapp.org/docs/latest/clients#client-socket-input
182
- @logger.info "Sending SNMP check event: #{check.to_json}"
197
+ @logger.debug "sending SNMP check event: #{check.to_json}"
183
198
 
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")
199
+ host = options[:client_socket_bind]
200
+ port = options[:client_socket_port]
201
+
202
+ begin
203
+ @logger.debug "opening connection to #{host}:#{port}"
204
+ t = TCPSocket.new host, port
205
+ t.write(check.to_json + "\n")
206
+ rescue Exception => e
207
+ @logger.error(e)
208
+ end
188
209
  end
189
210
 
190
211
  def process_v2c_trap(trap, trapdef)
@@ -192,14 +213,14 @@ module Sensu
192
213
  begin
193
214
  hostname = Resolv.getname(trap.source_ip)
194
215
  rescue Resolv::ResolvError
195
- @logger.debug("Unable to resolve name for #{trap.source_ip}")
216
+ @logger.debug("unable to resolve name for #{trap.source_ip}")
196
217
  end
197
218
 
198
219
  fields = {}
199
220
  fields[:source] = trap.source_ip
200
221
  fields[:hostname] = hostname
201
222
 
202
- @logger.debug('Checking trap definition for key/value template pairs')
223
+ @logger.debug('checking trap definition for key/value template pairs')
203
224
  Array(trapdef['trap']).each do |key, value|
204
225
  begin
205
226
  value = SNMP::ObjectId.new(value)
@@ -211,19 +232,19 @@ module Sensu
211
232
  @logger.debug trap.varbind_list.inspect
212
233
  val = trap.varbind_list.find { |vb| vb.name == value }
213
234
  if val.nil?
214
- @logger.warn("trap.#{key} has OID(#{value}) that was not found in incoming trap - Check your configuration")
235
+ @logger.warn("trap.#{key} has OID(#{value}) that was not found in incoming trap - check your configuration")
215
236
  end
216
- @logger.debug("Discovered value of #{key} is '#{val}'")
237
+ @logger.debug("discovered value of #{key} is '#{val}'")
217
238
  fields[key] = val.value unless val.nil?
218
239
  end
219
240
 
220
- @logger.debug("Template fields are: #{fields.inspect}")
241
+ @logger.debug("template fields are: #{fields.inspect}")
221
242
 
222
243
  # Replace any {template} values in the event with the value of
223
244
  # snmp values defined in the traps configuration
224
245
  fields.each do |key, value|
225
246
  trapdef['event'].each do |k, v|
226
- @logger.debug("Looking for #{key} in #{trapdef['event'][k]}")
247
+ @logger.debug("looking for #{key} in #{trapdef['event'][k]}")
227
248
  begin
228
249
  trapdef['event'][k] = v.gsub("{#{key}}", value.to_s.gsub('/', '-'))
229
250
  rescue
@@ -1,7 +1,7 @@
1
1
  module SensuPluginsSnmptrapExtension
2
2
  module Version
3
3
  MAJOR = 0
4
- MINOR = 1
4
+ MINOR = 2
5
5
  PATCH = 0
6
6
 
7
7
  VER_STRING = [MAJOR, MINOR, PATCH].compact.join('.')
metadata CHANGED
@@ -1,11 +1,11 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sensu-plugins-snmptrap-extension
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
- - Toby Jackson <toby@warmfusion.co.uk>
8
- - Peter Daugavietis <pdaugavietis@gmail.com>
7
+ - Toby Jackson
8
+ - Peter Daugavietis
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: