sensu-extensions-snmp-trap 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5697ed45cacaa3306fc6043caeb89d62d5d24b67
4
+ data.tar.gz: 3822e4f9bbbb4f8f0cc720df3190d5619dbd8329
5
+ SHA512:
6
+ metadata.gz: 84107ce785291471c9df0876a5ba06ec682dacd346f83813529a16caf4a12056c548d6053e6c6f74ff2d0ed1b9aba649318319ae9ef0c0cfb719683ec9f8bd8d
7
+ data.tar.gz: d9b4158296fc6352715f2348328fdad82e3d29ec5a76f447e4c21bda29da4d480fc56b69065d65bbded17f4546bde930bc6454e01e043afe11405a0d9ffacc48
data/CHANGELOG.md ADDED
@@ -0,0 +1,30 @@
1
+ # Change Log
2
+
3
+ This project adheres to [Semantic Versioning](http://semver.org/).
4
+
5
+ This CHANGELOG follows the format listed at [Keep A Changelog](http://keepachangelog.com/).
6
+
7
+ ## [Unreleased]
8
+
9
+ ### Fixed
10
+
11
+ ### Added
12
+
13
+ ### Changed
14
+
15
+ ## [1.0.0] - 2016-01-31
16
+
17
+ ### Fixed
18
+
19
+ ### Added
20
+
21
+ ### Changed
22
+
23
+ ## 0.0.1 - 2016-01-31
24
+
25
+ ### Added
26
+
27
+ - Initial release.
28
+
29
+ [Unreleased]: https://github.com/sensu-extensions/sensu-extensions-template/compare/v1.0.0...HEAD
30
+ [1.0.0]: https://github.com/sensu-extensions/sensu-extensions-template/compare/v0.0.1...v1.0.0
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2016 Sensu-Extensions
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,11 @@
1
+ # Sensu::Extensions::Template
2
+
3
+ Welcome to the Sensu Extensions repository template! In this repository, you will find the files you need to be able to author your own Sensu Extension for Sensu Core (>= 0.26).
4
+
5
+ ## Usage
6
+
7
+ 1. Fork this repository and name the fork after your new extension, e.g. `"sensu-extensions-docker"`
8
+
9
+ 2. Write your extension (with tests!)
10
+
11
+ 3. Create a GitHub issue on [sensu-extensions/template](https://github.com/sensu-extensions/template/issues) to request a review of your extension, to determine if it is ready to be moved to the [sensu-extensions GitHub organization](https://github.com/sensu-extensions) to be shared with the Sensu community!
@@ -0,0 +1,156 @@
1
+ require "sensu/extension"
2
+ require "thread"
3
+ require "snmp"
4
+
5
+ module Sensu
6
+ module Extension
7
+ class SNMPTrap < Check
8
+
9
+ RESULT_MAP = [
10
+ [/checkname/i, :name],
11
+ [/notification/i, :output],
12
+ [/severity/i, :status]
13
+ ]
14
+
15
+ RUBY_ASN1_MAP = {
16
+ "INTEGER" => :to_i,
17
+ "OCTET STRING" => :to_s,
18
+ "OBJECT IDENTIFIER" => :to_s,
19
+ "IpAddress" => :to_s,
20
+ "Counter32" => :to_i,
21
+ "Gauge32" => :to_i,
22
+ "Unsigned32" => :to_i,
23
+ "TimeTicks" => :to_i,
24
+ "Opaque" => :to_s,
25
+ "Counter64" => :to_i
26
+ }
27
+
28
+ def name
29
+ "snmp_trap"
30
+ end
31
+
32
+ def description
33
+ "receives snmp traps and translates them to check results"
34
+ end
35
+
36
+ def definition
37
+ {
38
+ name: name,
39
+ publish: false
40
+ }
41
+ end
42
+
43
+ def options
44
+ return @options if @options
45
+ @options = {
46
+ :bind => "0.0.0.0",
47
+ :port => 1062,
48
+ :community => "public",
49
+ :handlers => ["default"],
50
+ :mibs_dir => "/etc/sensu/mibs"
51
+ }
52
+ @options.merge!(@settings[:snmp_trap]) if @settings[:snmp_trap].is_a?(Hash)
53
+ @options
54
+ end
55
+
56
+ def start_snmpv2_listener!
57
+ @listener = SNMP::TrapListener.new(
58
+ :host => options[:bind],
59
+ :port => options[:port],
60
+ :community => options[:community]) do |listener|
61
+ listener.on_trap_v2c do |trap|
62
+ @logger.debug("snmp trap check extension received a v2 trap")
63
+ @traps << trap
64
+ end
65
+ end
66
+ end
67
+
68
+ def load_mibs!
69
+ @logger.debug("snmp trap check extension importing mibs", :mibs_dir => options[:mibs_dir])
70
+ Dir.glob(File.join(options[:mibs_dir], "*")) do |mib_file|
71
+ @logger.debug("snmp trap check extension importing mib", :mib_file => mib_file)
72
+ SNMP::MIB.import_module(mib_file)
73
+ end
74
+ @mibs = SNMP::MIB.new
75
+ @logger.debug("snmp trap check extension loading mibs")
76
+ SNMP::MIB.list_imported.each do |module_name|
77
+ @logger.debug("snmp trap check extension loading mib", :module_name => module_name)
78
+ @mibs.load_module(module_name)
79
+ end
80
+ @mibs
81
+ end
82
+
83
+ def send_result(result)
84
+ socket = UDPSocket.new
85
+ socket.send(Sensu::JSON.dump(result), 0, "127.0.0.1", 3030)
86
+ socket.close
87
+ end
88
+
89
+ def determine_hostname(address)
90
+ begin
91
+ Resolv.getname(address)
92
+ rescue Resolv::ResolvError
93
+ @logger.debug("snmp trap check extension unable to resolve hostname", :address => address)
94
+ address
95
+ end
96
+ end
97
+
98
+ def determine_trap_oid(trap)
99
+ varbind = trap.varbind_list.detect do |varbind|
100
+ varbind.name.to_oid == SNMP::SNMP_TRAP_OID_OID
101
+ end
102
+ varbind.value.to_s rescue "trap_oid_unknown"
103
+ end
104
+
105
+ def process_trap(trap)
106
+ @logger.debug("snmp trap check extension processing a v2 trap")
107
+ result = {
108
+ :source => determine_hostname(trap.source_ip),
109
+ :handlers => options[:handlers]
110
+ }
111
+ trap.varbind_list.each do |varbind|
112
+ symbolic_name = @mibs.name(varbind.name.to_oid)
113
+ mapping = RESULT_MAP.detect do |mapping|
114
+ symbolic_name =~ mapping.first
115
+ end
116
+ if mapping && !result[mapping.last]
117
+ type_conversion = RUBY_ASN1_MAP[varbind.value.asn1_type]
118
+ if type_conversion
119
+ result[mapping.last] = varbind.value.send(type_conversion)
120
+ end
121
+ end
122
+ end
123
+ result[:name] ||= determine_trap_oid(trap)
124
+ result[:output] ||= trap.inspect
125
+ result[:status] ||= 3
126
+ send_result(result)
127
+ end
128
+
129
+ def start_trap_processor!
130
+ @processor = Thread.new do
131
+ load_mibs!
132
+ loop do
133
+ process_trap(@traps.pop)
134
+ end
135
+ end
136
+ @processor.abort_on_exception = true
137
+ @processor
138
+ end
139
+
140
+ def post_init
141
+ @traps = Queue.new
142
+ start_snmpv2_listener!
143
+ start_trap_processor!
144
+ end
145
+
146
+ def stop
147
+ @listener.kill if @listener
148
+ @processor.kill if @processor
149
+ end
150
+
151
+ def run(event, &callback)
152
+ yield "no-op", 0
153
+ end
154
+ end
155
+ end
156
+ end
metadata ADDED
@@ -0,0 +1,145 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sensu-extensions-snmp-trap
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Sensu-Extensions and contributors
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-10-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: sensu-extension
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: snmp
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 1.2.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 1.2.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.6'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.6'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: sensu-logger
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: sensu-settings
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: Check extension to receive SNMP traps and translate them into check results
112
+ email:
113
+ - "<sensu-users@googlegroups.com>"
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - CHANGELOG.md
119
+ - LICENSE
120
+ - README.md
121
+ - lib/sensu/extensions/snmp-trap.rb
122
+ homepage: https://github.com/sensu-extensions/sensu-extensions-snmp-trap
123
+ licenses: []
124
+ metadata: {}
125
+ post_install_message:
126
+ rdoc_options: []
127
+ require_paths:
128
+ - lib
129
+ required_ruby_version: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - ">="
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ required_rubygems_version: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ requirements: []
140
+ rubyforge_project:
141
+ rubygems_version: 2.6.3
142
+ signing_key:
143
+ specification_version: 4
144
+ summary: Check extension to receive SNMP traps and translate them into check results
145
+ test_files: []