sensu-plugins-disk-checks 2.3.0 → 2.4.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 +4 -4
- data/CHANGELOG.md +8 -2
- data/README.md +7 -1
- data/bin/check-smart-status.rb +65 -19
- data/bin/check-smart.rb +50 -4
- data/lib/sensu-plugins-disk-checks/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5d69846d3e98c17975dccd7363228e869ac3b734
|
4
|
+
data.tar.gz: ddcb9c5ee9e02cca40778d1203a5544304a0dc52
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8313f14f4c20ca876ae5905cec5cef2fea5026c35d2c16f5bc27b2274005e9dc0f601b41818724a581b50d610e5b0484cfcb3e53d351bc5c6140ad01dfcd18cf
|
7
|
+
data.tar.gz: 293372a87d24a68f3e1d7f257ced4ecafd1657c6edd5f18e6afd6761112685e2a22be9fb157b0604d7df71814d305bd9e81a326d03b0a51619cf91738beefe18
|
data/CHANGELOG.md
CHANGED
@@ -1,10 +1,14 @@
|
|
1
|
-
#Change Log
|
1
|
+
# Change Log
|
2
2
|
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
6
|
## [Unreleased]
|
7
7
|
|
8
|
+
## [2.4.0] - 2017-07-20
|
9
|
+
- check-smart.rb: Add path overrides via smart.json (@ArakniD)
|
10
|
+
- check-smart-status.rb: Add path overrides via smart.json (@ArakniD)
|
11
|
+
|
8
12
|
## [2.3.0] - 2017-07-03
|
9
13
|
### Added
|
10
14
|
- travis testing on ruby 2.4.1 (@majormoses)
|
@@ -133,7 +137,9 @@ https://mathias-kettner.de/checkmk_filesystems.html
|
|
133
137
|
### Added
|
134
138
|
- initial release
|
135
139
|
|
136
|
-
[Unreleased]: https://github.com/sensu-plugins/sensu-plugins-disk-checks/compare/2.
|
140
|
+
[Unreleased]: https://github.com/sensu-plugins/sensu-plugins-disk-checks/compare/2.4.0...HEAD
|
141
|
+
[2.4.0]: https://github.com/sensu-plugins/sensu-plugins-disk-checks/compare/2.3.0...2.4.0
|
142
|
+
[2.3.0]: https://github.com/sensu-plugins/sensu-plugins-disk-checks/compare/2.2.0...2.3.0
|
137
143
|
[2.2.0]: https://github.com/sensu-plugins/sensu-plugins-disk-checks/compare/2.1.0...2.2.0
|
138
144
|
[2.1.0]: https://github.com/sensu-plugins/sensu-plugins-disk-checks/compare/2.0.1...2.1.0
|
139
145
|
[2.0.1]: https://github.com/sensu-plugins/sensu-plugins-disk-checks/compare/2.0.0...2.0.1
|
data/README.md
CHANGED
@@ -68,7 +68,7 @@ Check the status of SMART offline tests and optionally check if tests were execu
|
|
68
68
|
|
69
69
|
## Usage
|
70
70
|
|
71
|
-
This is a sample input file used by check-smart-status, see the script for further details.
|
71
|
+
This is a sample input file used by check-smart-status and check-smart, see the script for further details.
|
72
72
|
```json
|
73
73
|
{
|
74
74
|
"smart": {
|
@@ -89,6 +89,12 @@ This is a sample input file used by check-smart-status, see the script for furth
|
|
89
89
|
{ "id": 201, "name": "Unc_Soft_read_Err_Rate", "read": "left16bit" },
|
90
90
|
{ "id": 230, "name": "Life_Curve_Status", "crit_min": 100, "warn_min": 100, "warn_max": 100, "crit_max": 100 }
|
91
91
|
]
|
92
|
+
},
|
93
|
+
"hardware": {
|
94
|
+
"devices": [
|
95
|
+
{ "path": "sda", "ignore" : [ 187 ] },
|
96
|
+
{ "path": "sdb", "override": "/dev/twa0 -d 3ware,0" }
|
97
|
+
]
|
92
98
|
}
|
93
99
|
}
|
94
100
|
```
|
data/bin/check-smart-status.rb
CHANGED
@@ -61,6 +61,33 @@
|
|
61
61
|
require 'sensu-plugin/check/cli'
|
62
62
|
require 'json'
|
63
63
|
|
64
|
+
class Disk
|
65
|
+
# Setup variables
|
66
|
+
#
|
67
|
+
def initialize(name, override, ignore)
|
68
|
+
@device_path = "/dev/#{name}"
|
69
|
+
@override_path = override
|
70
|
+
@att_ignore = ignore
|
71
|
+
end
|
72
|
+
|
73
|
+
# Is the device SMART capable and enabled
|
74
|
+
#
|
75
|
+
def device_path
|
76
|
+
if @override_path.nil?
|
77
|
+
@device_path
|
78
|
+
else
|
79
|
+
@override_path
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def smart_ignore?(num)
|
84
|
+
return if @att_ignore.nil?
|
85
|
+
@att_ignore.include? num
|
86
|
+
end
|
87
|
+
|
88
|
+
public :device_path, :smart_ignore?
|
89
|
+
end
|
90
|
+
|
64
91
|
#
|
65
92
|
# Smart Check Status
|
66
93
|
#
|
@@ -130,6 +157,9 @@ class SmartCheckStatus < Sensu::Plugin::Check::CLI
|
|
130
157
|
@smart_attributes = JSON.parse(IO.read(config[:json]), symbolize_names: true)[:smart][:attributes]
|
131
158
|
@smart_debug = config[:debug] == 'on'
|
132
159
|
|
160
|
+
# Load in the device configuration
|
161
|
+
@hardware = JSON.parse(IO.read(config[:json]), symbolize_names: true)[:hardware][:devices]
|
162
|
+
|
133
163
|
# Set default threshold
|
134
164
|
default_threshold = config[:defaults].split(',')
|
135
165
|
raise 'Invalid default threshold parameter count' unless default_threshold.size == 4
|
@@ -160,7 +190,7 @@ class SmartCheckStatus < Sensu::Plugin::Check::CLI
|
|
160
190
|
att_check_list = find_attributes
|
161
191
|
|
162
192
|
# Devices to check
|
163
|
-
devices = config[:debug_file].nil? ? find_devices : ['sda']
|
193
|
+
devices = config[:debug_file].nil? ? find_devices : [Disk.new('sda', nil, nil)]
|
164
194
|
|
165
195
|
# Overall health and attributes parameter
|
166
196
|
parameters = '-H -A'
|
@@ -174,10 +204,10 @@ class SmartCheckStatus < Sensu::Plugin::Check::CLI
|
|
174
204
|
warnings = []
|
175
205
|
criticals = []
|
176
206
|
devices.each do |dev|
|
177
|
-
puts "#{config[:binary]} #{parameters}
|
207
|
+
puts "#{config[:binary]} #{parameters} #{dev.device_path}" if @smart_debug
|
178
208
|
# check if debug file specified
|
179
209
|
if config[:debug_file].nil?
|
180
|
-
output[dev] = `sudo #{config[:binary]} #{parameters}
|
210
|
+
output[dev] = `sudo #{config[:binary]} #{parameters} #{dev.device_path}`
|
181
211
|
else
|
182
212
|
test_file = File.open(config[:debug_file], 'rb')
|
183
213
|
output[dev] = test_file.read
|
@@ -186,13 +216,13 @@ class SmartCheckStatus < Sensu::Plugin::Check::CLI
|
|
186
216
|
|
187
217
|
# check overall helath status
|
188
218
|
if config[:overall] == 'on' && !output[dev].include?('SMART overall-health self-assessment test result: PASSED')
|
189
|
-
criticals << "Overall health check failed on #{dev}"
|
219
|
+
criticals << "Overall health check failed on #{dev.name}"
|
190
220
|
end
|
191
221
|
|
192
222
|
# #YELLOW
|
193
223
|
output[dev].split("\n").each do |line|
|
194
224
|
fields = line.split
|
195
|
-
if fields.size == 10 && fields[0].to_i != 0 && att_check_list.include?(fields[0].to_i)
|
225
|
+
if fields.size == 10 && fields[0].to_i != 0 && att_check_list.include?(fields[0].to_i) && (dev.smart_ignore?(fields[0].to_i) == false)
|
196
226
|
smart_att = @smart_attributes.find { |att| att[:id] == fields[0].to_i }
|
197
227
|
att_value = fields[9].to_i
|
198
228
|
att_value = send(smart_att[:read], att_value) unless smart_att[:read].nil?
|
@@ -235,24 +265,40 @@ class SmartCheckStatus < Sensu::Plugin::Check::CLI
|
|
235
265
|
# find all devices from /proc/partitions or from parameter
|
236
266
|
#
|
237
267
|
def find_devices
|
268
|
+
# Search for devices without number
|
269
|
+
devices = []
|
270
|
+
|
238
271
|
# Return parameter value if it's defined
|
239
|
-
|
272
|
+
if config[:devices] != 'all'
|
273
|
+
config[:devices].split(',').each do |dev|
|
274
|
+
devices << Disk.new(dev.to_s, '', nil)
|
275
|
+
end
|
276
|
+
return devices
|
277
|
+
end
|
240
278
|
|
241
|
-
|
242
|
-
|
279
|
+
`lsblk -nro NAME,TYPE`.each_line do |line|
|
280
|
+
name, type = line.split
|
243
281
|
|
244
|
-
|
245
|
-
|
282
|
+
if type == 'disk'
|
283
|
+
jconfig = @hardware.find { |h1| h1[:path] == name }
|
246
284
|
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
285
|
+
if jconfig.nil?
|
286
|
+
override = nil
|
287
|
+
ignore = nil
|
288
|
+
else
|
289
|
+
override = jconfig[:override]
|
290
|
+
ignore = jconfig[:ignore]
|
291
|
+
end
|
292
|
+
|
293
|
+
device = Disk.new(name, override, ignore)
|
294
|
+
|
295
|
+
output = `sudo #{config[:binary]} -i #{device.device_path}`
|
296
|
+
|
297
|
+
# Check if we can use this device or not
|
298
|
+
available = !output.scan(/SMART support is:\+sAvailable/).empty?
|
299
|
+
enabled = !output.scan(/SMART support is:\+sEnabled/).empty?
|
300
|
+
devices << device if available && enabled
|
301
|
+
end
|
256
302
|
end
|
257
303
|
|
258
304
|
devices
|
data/bin/check-smart.rb
CHANGED
@@ -37,6 +37,7 @@
|
|
37
37
|
#
|
38
38
|
|
39
39
|
require 'sensu-plugin/check/cli'
|
40
|
+
require 'json'
|
40
41
|
|
41
42
|
#
|
42
43
|
# Disk
|
@@ -44,11 +45,13 @@ require 'sensu-plugin/check/cli'
|
|
44
45
|
class Disk
|
45
46
|
# Setup variables
|
46
47
|
#
|
47
|
-
def initialize(name)
|
48
|
+
def initialize(name, override, binary)
|
48
49
|
@device_path = "/dev/#{name}"
|
49
50
|
@smart_available = false
|
50
51
|
@smart_enabled = false
|
51
52
|
@smart_healty = nil
|
53
|
+
@smart_binary = binary
|
54
|
+
@override_path = override
|
52
55
|
check_smart_capability!
|
53
56
|
check_health! if smart_capable?
|
54
57
|
end
|
@@ -61,10 +64,20 @@ class Disk
|
|
61
64
|
@smart_available && @smart_enabled
|
62
65
|
end
|
63
66
|
|
67
|
+
# Is the device SMART capable and enabled
|
68
|
+
#
|
69
|
+
def device_path
|
70
|
+
if @override_path.nil?
|
71
|
+
@device_path
|
72
|
+
else
|
73
|
+
@override_path
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
64
77
|
# Check for SMART cspability
|
65
78
|
#
|
66
79
|
def check_smart_capability!
|
67
|
-
output = `sudo
|
80
|
+
output = `sudo #{@smart_binary} -i #{@device_path}`
|
68
81
|
@smart_available = !output.scan(/SMART support is:\s+Available/).empty?
|
69
82
|
@smart_enabled = !output.scan(/SMART support is:\s+Enabled/).empty?
|
70
83
|
@capability_output = output
|
@@ -73,7 +86,7 @@ class Disk
|
|
73
86
|
# Check the SMART health
|
74
87
|
#
|
75
88
|
def check_health!
|
76
|
-
output = `sudo
|
89
|
+
output = `sudo #{@smart_binary} -H #{@device_path}`
|
77
90
|
@smart_healthy = !output.scan(/PASSED|OK$/).empty?
|
78
91
|
@health_output = output
|
79
92
|
end
|
@@ -89,11 +102,29 @@ class CheckSMART < Sensu::Plugin::Check::CLI
|
|
89
102
|
proc: proc(&:to_sym),
|
90
103
|
default: :unknown
|
91
104
|
|
105
|
+
option :binary,
|
106
|
+
short: '-b path/to/smartctl',
|
107
|
+
long: '--binary /usr/sbin/smartctl',
|
108
|
+
description: 'smartctl binary to use, in case you hide yours',
|
109
|
+
required: false,
|
110
|
+
default: 'smartctl'
|
111
|
+
|
112
|
+
option :json,
|
113
|
+
short: '-j path/to/smart.json',
|
114
|
+
long: '--json path/to/smart.json',
|
115
|
+
description: 'Path to SMART attributes JSON file',
|
116
|
+
required: false,
|
117
|
+
default: File.dirname(__FILE__) + '/smart.json'
|
118
|
+
|
92
119
|
# Setup variables
|
93
120
|
#
|
94
121
|
def initialize
|
95
122
|
super
|
96
123
|
@devices = []
|
124
|
+
|
125
|
+
# Load in the device configuration
|
126
|
+
@hardware = JSON.parse(IO.read(config[:json]), symbolize_names: true)[:hardware][:devices]
|
127
|
+
|
97
128
|
scan_disks!
|
98
129
|
end
|
99
130
|
|
@@ -102,7 +133,22 @@ class CheckSMART < Sensu::Plugin::Check::CLI
|
|
102
133
|
def scan_disks!
|
103
134
|
`lsblk -nro NAME,TYPE`.each_line do |line|
|
104
135
|
name, type = line.split
|
105
|
-
|
136
|
+
|
137
|
+
if type == 'disk'
|
138
|
+
jconfig = @hardware.find { |h1| h1[:path] == name }
|
139
|
+
|
140
|
+
override = !jconfig.nil? ? jconfig[:override] : nil
|
141
|
+
|
142
|
+
device = Disk.new(name, override, config[:binary])
|
143
|
+
|
144
|
+
output = `sudo #{config[:binary]} -i #{device.device_path}`
|
145
|
+
|
146
|
+
# Check if we can use this device or not
|
147
|
+
available = !output.scan(/SMART support is:\s+Available/).empty?
|
148
|
+
enabled = !output.scan(/SMART support is:\s+Enabled/).empty?
|
149
|
+
|
150
|
+
@devices << device if available && enabled
|
151
|
+
end
|
106
152
|
end
|
107
153
|
end
|
108
154
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sensu-plugins-disk-checks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sensu-Plugins and contributors
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-07-
|
11
|
+
date: 2017-07-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sensu-plugin
|
@@ -220,7 +220,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
220
220
|
version: '0'
|
221
221
|
requirements: []
|
222
222
|
rubyforge_project:
|
223
|
-
rubygems_version: 2.
|
223
|
+
rubygems_version: 2.6.11
|
224
224
|
signing_key:
|
225
225
|
specification_version: 4
|
226
226
|
summary: Sensu plugins for disk checks
|