sensu-plugins-ipmi-sensors 0.0.1

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: 6cd50e5f6e1100f3316e5b8182704137a989d146
4
+ data.tar.gz: 3e96ff9b07019093aa6b3700482d6aef7474f742
5
+ SHA512:
6
+ metadata.gz: 0d11309b9f857a456ab1275efd6758703feea73130ed5f43d3ab30a56492cfc35063756cfac2ffe379717d956420e6b0d515daa6e0eaf4a808f2e1e46c997fd7
7
+ data.tar.gz: 0fb17887d5f10c129338dfcfe49a5bb477713fad41ef6bcbabaf246746521eb6bfd192652d7dc7f8cb8dce3f7c8ce13f9cf2170e1e2ed071e4929a9bab90ba37
data/CHANGELOG.md ADDED
@@ -0,0 +1,10 @@
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
+
8
+ ## [0.0.1] - 2015-12-28
9
+ ### Added
10
+ - Initial release
data/LICENSE ADDED
@@ -0,0 +1,23 @@
1
+ Copyright (c) 2015 Matteo Cerutti
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.
23
+
data/README.md ADDED
@@ -0,0 +1,28 @@
1
+ # Sensu plugin for monitoring IPMI sensors
2
+
3
+ A sensu plugin to monitor IPMI sensors.
4
+
5
+ The plugin generates multiple OK/WARN/CRIT/UNKNOWN events via the sensu client socket (https://sensuapp.org/docs/latest/clients#client-socket-input)
6
+ so that you do not miss state changes when monitoring multiple sensors.
7
+
8
+ ## Usage
9
+
10
+ The plugin accepts the following command line options:
11
+
12
+ ```
13
+ Usage: check-ipmi-sensors.rb (options)
14
+ --driver <driver> IPMI driver (default: auto)
15
+ -H, --host <HOST> IPMI host (default: localhost)
16
+ --ignore-sensor <SENSOR> Comma separated list of IPMI sensors to ignore
17
+ --ignore-sensor-regex <SENSOR>
18
+ Comma separated list of IPMI sensors to ignore (regex)
19
+ -p, --password <PASSWORD> IPMI password (required)
20
+ --provider <PROVIDER> IPMI provider (default: auto)
21
+ --sensor <SENSOR> Comma separated list of IPMI sensors (default: ALL)
22
+ --sensor-regex <SENSOR> Comma separated list of IPMI sensors (regex)
23
+ -u, --user <USER> IPMI username (required)
24
+ -w, --warn Warn instead of throwing a critical failure
25
+ ```
26
+
27
+ ## Author
28
+ Matteo Cerutti - <matteo.cerutti@hotmail.co.uk>
@@ -0,0 +1,177 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # check-ipmi-sensors.rb
4
+ #
5
+ # Author: Matteo Cerutti <matteo.cerutti@hotmail.co.uk>
6
+ #
7
+
8
+ require 'sensu-plugin/check/cli'
9
+ require 'rubyipmi'
10
+ require 'json'
11
+ require 'socket'
12
+
13
+ class CheckIPMISensors < Sensu::Plugin::Check::CLI
14
+ option :user,
15
+ :description => "IPMI username",
16
+ :short => "-u <USER>",
17
+ :long => "--user <USER>",
18
+ :required => true
19
+
20
+ option :password,
21
+ :description => "IPMI password",
22
+ :short => "-p <PASSWORD>",
23
+ :long => "--password <PASSWORD>",
24
+ :required => true
25
+
26
+ option :host,
27
+ :description => "IPMI host (default: localhost)",
28
+ :short => "-H <HOST>",
29
+ :long => "--host <HOST>",
30
+ :default => "localhost"
31
+
32
+ option :provider,
33
+ :description => "IPMI provider (default: auto)",
34
+ :long => "--provider <PROVIDER>",
35
+ :in => ["any", "freeipmi", "openipmi"],
36
+ :default => "any"
37
+
38
+ option :driver,
39
+ :description => "IPMI driver (default: auto)",
40
+ :long => "--driver <driver>",
41
+ :in => ["auto", "lan15", "lan20", "open"],
42
+ :default => "auto"
43
+
44
+ option :sensor,
45
+ :description => "Comma separated list of IPMI sensors (default: ALL)",
46
+ :long => "--sensor <SENSOR>",
47
+ :proc => proc { |a| a.split(',') },
48
+ :default => []
49
+
50
+ option :sensor_regex,
51
+ :description => "Comma separated list of IPMI sensors (regex)",
52
+ :long => "--sensor-regex <SENSOR>",
53
+ :proc => proc { |a| a.split(',') },
54
+ :default => []
55
+
56
+ option :ignore_sensor,
57
+ :description => "Comma separated list of IPMI sensors to ignore",
58
+ :long => "--ignore-sensor <SENSOR>",
59
+ :proc => proc { |a| a.split(',') },
60
+ :default => []
61
+
62
+ option :ignore_sensor_regex,
63
+ :description => "Comma separated list of IPMI sensors to ignore (regex)",
64
+ :long => "--ignore-sensor-regex <SENSOR>",
65
+ :proc => proc { |a| a.split(',') },
66
+ :default => []
67
+
68
+ option :warn,
69
+ :description => "Warn instead of throwing a critical failure",
70
+ :short => "-w",
71
+ :long => "--warn",
72
+ :boolean => false
73
+
74
+ def initialize()
75
+ super
76
+ @ipmi = Rubyipmi.connect(config[:user], config[:password], config[:host], config[:provider], {:driver => config[:driver]})
77
+ end
78
+
79
+ def send_client_socket(data)
80
+ sock = UDPSocket.new
81
+ sock.send(data + "\n", 0, "127.0.0.1", 3030)
82
+ end
83
+
84
+ def send_ok(check_name, msg)
85
+ event = {"name" => check_name, "status" => 0, "output" => "OK: #{msg}", "handler" => config[:handler]}
86
+ send_client_socket(event.to_json)
87
+ end
88
+
89
+ def send_warning(check_name, msg)
90
+ event = {"name" => check_name, "status" => 1, "output" => "WARNING: #{msg}", "handler" => config[:handler]}
91
+ send_client_socket(event.to_json)
92
+ end
93
+
94
+ def send_critical(check_name, msg)
95
+ event = {"name" => check_name, "status" => 2, "output" => "CRITICAL: #{msg}", "handler" => config[:handler]}
96
+ send_client_socket(event.to_json)
97
+ end
98
+
99
+ def send_unknown(check_name, msg)
100
+ event = {"name" => check_name, "status" => 3, "output" => "UNKNOWN: #{msg}", "handler" => config[:handler]}
101
+ send_client_socket(event.to_json)
102
+ end
103
+
104
+ def get_ipmi_sensors()
105
+ sensors = {}
106
+
107
+ @ipmi.sensors.list.each do |name, sensor|
108
+ if config[:ignore_sensor].size > 0
109
+ next if config[:ignore_sensor].include?(name)
110
+ end
111
+
112
+ if config[:ignore_sensor_regex].size > 0
113
+ b = false
114
+ config[:ignore_sensor_regex].each do |sensor|
115
+ if name =~ Regexp.new(sensor)
116
+ b = true
117
+ break
118
+ end
119
+ end
120
+ next if b
121
+ end
122
+
123
+ if config[:sensor].size > 0
124
+ next unless config[:sensor].include?(name)
125
+ end
126
+
127
+ if config[:sensor_regex].size > 0
128
+ b = true
129
+ config[:sensor_regex].each do |sensor|
130
+ if name =~ Regexp.new(sensor)
131
+ b = false
132
+ break
133
+ end
134
+ end
135
+ next if b
136
+ end
137
+
138
+ sensors[name] = sensor
139
+ end
140
+
141
+ sensors
142
+ end
143
+
144
+ def run
145
+ problems = 0
146
+
147
+ ipmi_sensors = get_ipmi_sensors()
148
+ ipmi_sensors.each do |name, sensor|
149
+ check_name = "ipmi-sensor-#{name}"
150
+ case sensor[:unit].downcase
151
+ when "n/a", "nominal"
152
+ # life's good
153
+ next
154
+
155
+ when "warning"
156
+ send_critical(check_name, "IPMI sensor #{name} is not healthy (State: #{sensor[:state]})")
157
+ problems += 1
158
+
159
+ when "critical"
160
+ send_critical(check_name, "IPMI sensor #{name} is not healthy (State: #{sensor[:state]})")
161
+ problems += 1
162
+
163
+ else
164
+ send_ok(check_name, "IPMI sensor #{name} is healthy (State: #{sensor[:state]})")
165
+
166
+ end
167
+ end
168
+
169
+ if problems > 0
170
+ message "Found #{problems} problems"
171
+ warning if config[:warn]
172
+ critical
173
+ else
174
+ ok "All IPMI sensors (#{ipmi_sensors.keys.join(', ')}) are OK"
175
+ end
176
+ end
177
+ end
@@ -0,0 +1 @@
1
+ require 'sensu-plugins-ipmi-sensors/version'
@@ -0,0 +1,9 @@
1
+ module SensuPluginsIPMISensors
2
+ module Version
3
+ MAJOR = 0
4
+ MINOR = 0
5
+ PATCH = 1
6
+
7
+ VER_STRING = [MAJOR, MINOR, PATCH].compact.join('.')
8
+ end
9
+ end
metadata ADDED
@@ -0,0 +1,84 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sensu-plugins-ipmi-sensors
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Matteo Cerutti
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-12-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: sensu-plugin
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 1.2.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 1.2.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: rubyipmi
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 0.10.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 0.10.0
41
+ description: This plugin provides facilities for monitoring IPMI sensors
42
+ email: "<matteo.cerutti@hotmail.co.uk>"
43
+ executables:
44
+ - check-ipmi-sensors.rb
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - CHANGELOG.md
49
+ - LICENSE
50
+ - README.md
51
+ - bin/check-ipmi-sensors.rb
52
+ - lib/sensu-plugins-ipmi-sensors.rb
53
+ - lib/sensu-plugins-ipmi-sensors/version.rb
54
+ homepage: https://github.com/m4ce/sensu-plugins-ipmi-sensors
55
+ licenses:
56
+ - MIT
57
+ metadata:
58
+ maintainer: "@m4ce"
59
+ development_status: active
60
+ production_status: stable
61
+ release_draft: 'false'
62
+ release_prerelease: 'false'
63
+ post_install_message: You can use the embedded Ruby by setting EMBEDDED_RUBY=true
64
+ in /etc/default/sensu
65
+ rdoc_options: []
66
+ require_paths:
67
+ - lib
68
+ required_ruby_version: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: 1.9.3
73
+ required_rubygems_version: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ requirements: []
79
+ rubyforge_project:
80
+ rubygems_version: 2.4.5.1
81
+ signing_key:
82
+ specification_version: 4
83
+ summary: Sensu plugins for monitoring IPMI sensors
84
+ test_files: []