nagiosplugin 1.2.0 → 1.3.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.
- data/README.md +7 -0
- data/examples/check_file_exists.rb +62 -0
- data/examples/check_perfdata.rb +30 -0
- data/lib/nagiosplugin/default_options.rb +78 -0
- data/lib/nagiosplugin/perfdata.rb +40 -0
- data/lib/nagiosplugin/plugin.rb +44 -0
- data/lib/nagiosplugin/version.rb +1 -1
- data/spec/nagiosplugin/plugin_spec.rb +21 -0
- metadata +111 -77
data/README.md
CHANGED
@@ -39,6 +39,13 @@ Profit... and maybe also fun.
|
|
39
39
|
(If you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull.)
|
40
40
|
* Send me a pull request. Bonus points for topic branches.
|
41
41
|
|
42
|
+
## Acknowledgments
|
43
|
+
|
44
|
+
Thanks to the following contributors for improving NagiosPlugin:
|
45
|
+
|
46
|
+
* [szuecs (Sandor Szücs)](https://github.com/szuecs): Adding default
|
47
|
+
options, perfdata stuff and helpful sample code.
|
48
|
+
|
42
49
|
## Copyright
|
43
50
|
|
44
51
|
Copyright (c) 2011-2012 Björn Albers. See LICENSE for details.
|
@@ -0,0 +1,62 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$:.unshift(File.dirname(__FILE__) + "/lib")
|
4
|
+
|
5
|
+
require "nagiosplugin"
|
6
|
+
require "nagiosplugin/default_options"
|
7
|
+
|
8
|
+
class MyPlugin < NagiosPlugin::Plugin
|
9
|
+
include NagiosPlugin::DefaultOptions
|
10
|
+
|
11
|
+
VERSION = 1.0
|
12
|
+
|
13
|
+
class << self
|
14
|
+
def run(*args)
|
15
|
+
self.new(*args).run
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def parse_options(*args)
|
20
|
+
@options = {}
|
21
|
+
OptionParser.new do |opts|
|
22
|
+
opts.banner = "% #{File.basename($0)} --filename <file>"
|
23
|
+
opts.separator ""
|
24
|
+
opts.separator "Specific options:"
|
25
|
+
opts.separator ""
|
26
|
+
|
27
|
+
opts.on('-f', '--filename <name>', 'Filename that should exist.') do |s|
|
28
|
+
@options[:filename] = s
|
29
|
+
end
|
30
|
+
|
31
|
+
yield(opts) if block_given?
|
32
|
+
|
33
|
+
begin
|
34
|
+
opts.parse!(args)
|
35
|
+
@options
|
36
|
+
rescue => e
|
37
|
+
puts "#{e}\n\n#{opts}"
|
38
|
+
exit(3)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def initialize(*args)
|
44
|
+
parse_options(*args, &default_options)
|
45
|
+
@warn = @options[:warn] if @options[:warn]
|
46
|
+
@crit = @options[:crit] if @options[:crit]
|
47
|
+
@reverse = @options[:reverse] if @options[:reverse]
|
48
|
+
@filename = @options[:filename]
|
49
|
+
end
|
50
|
+
|
51
|
+
def check
|
52
|
+
if File.executable?(@filename)
|
53
|
+
ok("#{@filename} is excutable")
|
54
|
+
elsif File.exists?(@filename)
|
55
|
+
warning("#{@filename} is not excutable")
|
56
|
+
else
|
57
|
+
critical("#{@filename} does not exist")
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
MyPlugin.run(*ARGV)
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require "nagiosplugin"
|
2
|
+
require "nagiosplugin/plugin"
|
3
|
+
require "nagiosplugin/perfdata"
|
4
|
+
|
5
|
+
class CheckPerfdata < NagiosPlugin::Plugin
|
6
|
+
include NagiosPlugin::Perfdata
|
7
|
+
|
8
|
+
def check
|
9
|
+
sleep 0.4
|
10
|
+
pd = PerfData.new
|
11
|
+
pd.val = 40
|
12
|
+
pd.warn = 25
|
13
|
+
pd.crit = 50
|
14
|
+
pd.min = 1
|
15
|
+
pd.max = 90
|
16
|
+
pd.uom = "%"
|
17
|
+
|
18
|
+
@perfdata = {
|
19
|
+
:pd => pd,
|
20
|
+
:baz => PerfData.new(1),
|
21
|
+
:foo => PerfData.new(1,2,3),
|
22
|
+
:bar => PerfData.new(4,5,6,7,8),
|
23
|
+
}
|
24
|
+
ok('super perfdata')
|
25
|
+
sleep 0.2
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
CheckPerfdata.run
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require "optparse"
|
2
|
+
|
3
|
+
module NagiosPlugin
|
4
|
+
module DefaultOptions
|
5
|
+
def parse_num(s)
|
6
|
+
if s.include? "."
|
7
|
+
s.to_f
|
8
|
+
else
|
9
|
+
s.to_i
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def parse_start_num(s)
|
14
|
+
if s.include? '~'
|
15
|
+
s.delete!('~')
|
16
|
+
Float::MIN
|
17
|
+
else
|
18
|
+
parse_num(s)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
def parse_reverse(s)
|
22
|
+
if s.include? '@'
|
23
|
+
s.delete!('@')
|
24
|
+
@options[:invert] = true
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def parse_nagios_style(s)
|
29
|
+
parse_reverse(s)
|
30
|
+
|
31
|
+
if not s.include? ':'
|
32
|
+
s = ":" + s
|
33
|
+
end
|
34
|
+
|
35
|
+
start, stop = s.split(':')
|
36
|
+
if start.empty?
|
37
|
+
# :m
|
38
|
+
start = 0
|
39
|
+
stop = parse_num(stop)
|
40
|
+
elsif stop.empty?
|
41
|
+
# n:
|
42
|
+
start = parse_start_num(start)
|
43
|
+
stop = Float::MAX
|
44
|
+
else
|
45
|
+
# n:m
|
46
|
+
start = parse_start_num(start)
|
47
|
+
stop = parse_num(stop)
|
48
|
+
end
|
49
|
+
start..stop
|
50
|
+
end
|
51
|
+
|
52
|
+
def default_options
|
53
|
+
lambda do |opts|
|
54
|
+
opts.separator ""
|
55
|
+
opts.separator "Default options:"
|
56
|
+
opts.separator ""
|
57
|
+
|
58
|
+
opts.on('-h', '--help', 'Display this help.') do
|
59
|
+
puts "#{opts}"
|
60
|
+
exit(3)
|
61
|
+
end
|
62
|
+
|
63
|
+
opts.on('-V', '--version', 'Print version.') do |s|
|
64
|
+
puts "#{File.basename($0)} #{VERSION}"
|
65
|
+
exit(3)
|
66
|
+
end
|
67
|
+
|
68
|
+
opts.on('-w', '--warn <n:m>', 'Warning threshold.') do |s|
|
69
|
+
@options[:warn] = parse_nagios_style(s)
|
70
|
+
end
|
71
|
+
|
72
|
+
opts.on('-c', '--crit <n:m>', 'Critical threshold.') do |s|
|
73
|
+
@options[:crit] = parse_nagios_style(s)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module NagiosPlugin
|
2
|
+
module Perfdata
|
3
|
+
_perfdata = Struct.new :val, :warn, :crit, :min, :max, :uom
|
4
|
+
PerfData = _perfdata
|
5
|
+
|
6
|
+
def get_perfdata
|
7
|
+
if @perfdata.class == PerfData
|
8
|
+
@perfdata.select {|e| e}.join(';')
|
9
|
+
else
|
10
|
+
@perfdata.map do |k,v|
|
11
|
+
"#{k}=" + v.select {|e| e}.join(';')
|
12
|
+
end.join(' ')
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# Run check and return result in a nagios-compatible format.
|
17
|
+
#
|
18
|
+
# It will...
|
19
|
+
# - execute your check method
|
20
|
+
# - output the result in a nagios-compatible format (SERVICE STATUS: Message)
|
21
|
+
# - exit according to the status
|
22
|
+
def run
|
23
|
+
t1 = Time.now
|
24
|
+
check
|
25
|
+
rescue StatusError => e
|
26
|
+
rescue => e
|
27
|
+
e = StatusError.new(:unknown, ([e.to_s, nil] + e.backtrace).join("\n"))
|
28
|
+
else
|
29
|
+
e = StatusError.new(:unknown, 'no status method was called')
|
30
|
+
ensure
|
31
|
+
t2 = Time.now
|
32
|
+
msg = [service, e.to_s].join(' ')
|
33
|
+
perfdata = get_perfdata
|
34
|
+
t = t2 - t1
|
35
|
+
puts "#{msg}|time=#{t} #{perfdata}"
|
36
|
+
exit e.to_i
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
data/lib/nagiosplugin/plugin.rb
CHANGED
@@ -1,6 +1,42 @@
|
|
1
|
+
require "optparse"
|
2
|
+
|
1
3
|
module NagiosPlugin
|
2
4
|
class Plugin
|
3
5
|
class << self
|
6
|
+
def parse_options(options, &blk2)
|
7
|
+
OptionParser.new do |opts|
|
8
|
+
opts.banner = "% #{$0} [options]"
|
9
|
+
opts.separator ""
|
10
|
+
opts.separator "Specific options:"
|
11
|
+
opts.separator ""
|
12
|
+
|
13
|
+
opts.on('-h', '--help', 'Display this help.') do
|
14
|
+
abort "#{opts}"
|
15
|
+
end
|
16
|
+
|
17
|
+
opts.on('-r', '--reverse', 'Reverse thresholds.') do |b|
|
18
|
+
options[:reverse] = b
|
19
|
+
end
|
20
|
+
|
21
|
+
opts.on('-w', '--warn <n>', 'Warning threshold.') do |s|
|
22
|
+
options[:warn] = s.to_i
|
23
|
+
end
|
24
|
+
|
25
|
+
opts.on('-c', '--crit <n>', 'Critical threshold.') do |s|
|
26
|
+
options[:crit] = s.to_i
|
27
|
+
end
|
28
|
+
|
29
|
+
blk2.call(opts)
|
30
|
+
|
31
|
+
begin
|
32
|
+
opts.parse!
|
33
|
+
rescue => e
|
34
|
+
abort "#{e}\n\n#{opts}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
options
|
39
|
+
end
|
4
40
|
|
5
41
|
# Create new instance and run it.
|
6
42
|
def run(*args)
|
@@ -25,6 +61,13 @@ module NagiosPlugin
|
|
25
61
|
make :critical
|
26
62
|
make :unknown
|
27
63
|
|
64
|
+
def initialize(options={})
|
65
|
+
@warn = options[:warn] if options[:warn]
|
66
|
+
@crit = options[:crit] if options[:crit]
|
67
|
+
@reverse = options[:reverse] if options[:reverse]
|
68
|
+
end
|
69
|
+
|
70
|
+
|
28
71
|
# Overwrite this check method and call a status method within.
|
29
72
|
def check
|
30
73
|
unknown 'please overwrite the `check` method in your class'
|
@@ -58,5 +101,6 @@ module NagiosPlugin
|
|
58
101
|
puts [service, e.to_s].join(' ')
|
59
102
|
exit e.to_i
|
60
103
|
end
|
104
|
+
|
61
105
|
end
|
62
106
|
end
|
data/lib/nagiosplugin/version.rb
CHANGED
@@ -4,6 +4,27 @@ describe NagiosPlugin::Plugin do
|
|
4
4
|
before do
|
5
5
|
class MyPlugin < NagiosPlugin::Plugin; end
|
6
6
|
@plugin = MyPlugin.new
|
7
|
+
|
8
|
+
class MergedOptionsPlugin < NagiosPlugin::Plugin
|
9
|
+
def initialize(options, &blk)
|
10
|
+
super(options, &blk)
|
11
|
+
@foo = options[:foo]
|
12
|
+
end
|
13
|
+
attr_reader :warn, :crit, :reverse, :foo
|
14
|
+
end
|
15
|
+
@plugin_with_options = MergedOptionsPlugin.new({:warn => 5, :crit => 1, :reverse => true, :foo => "bar"}) do |opts|
|
16
|
+
opts.on('--foo <s>', 'A test option.') do |s|
|
17
|
+
options[:foo] = s
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#initialize' do
|
23
|
+
it "should have attributes" do
|
24
|
+
@plugin_with_options.should satisfy { |o|
|
25
|
+
o.warn == 5 and o.crit == 1 and o.reverse and o.foo == "bar"
|
26
|
+
}
|
27
|
+
end
|
7
28
|
end
|
8
29
|
|
9
30
|
describe '#run' do
|
metadata
CHANGED
@@ -1,89 +1,116 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: nagiosplugin
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
5
|
prerelease:
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 3
|
9
|
+
- 0
|
10
|
+
version: 1.3.0
|
6
11
|
platform: ruby
|
7
|
-
authors:
|
8
|
-
-
|
12
|
+
authors:
|
13
|
+
- "Bj\xC3\xB6rn Albers"
|
9
14
|
autorequire:
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
requirement: &
|
17
|
+
|
18
|
+
date: 2012-08-30 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
17
22
|
none: false
|
18
|
-
requirements:
|
19
|
-
- -
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
hash: 3
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
version: "0"
|
30
|
+
prerelease: false
|
22
31
|
type: :development
|
32
|
+
name: rake
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
36
|
+
none: false
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
hash: 3
|
41
|
+
segments:
|
42
|
+
- 0
|
43
|
+
version: "0"
|
23
44
|
prerelease: false
|
24
|
-
|
25
|
-
- !ruby/object:Gem::Dependency
|
45
|
+
type: :development
|
26
46
|
name: cucumber
|
27
|
-
|
47
|
+
version_requirements: *id002
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
28
50
|
none: false
|
29
|
-
requirements:
|
30
|
-
- -
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
|
33
|
-
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
hash: 3
|
55
|
+
segments:
|
56
|
+
- 0
|
57
|
+
version: "0"
|
34
58
|
prerelease: false
|
35
|
-
|
36
|
-
- !ruby/object:Gem::Dependency
|
59
|
+
type: :development
|
37
60
|
name: aruba
|
38
|
-
|
61
|
+
version_requirements: *id003
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
39
64
|
none: false
|
40
|
-
requirements:
|
41
|
-
- -
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
|
44
|
-
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
hash: 3
|
69
|
+
segments:
|
70
|
+
- 0
|
71
|
+
version: "0"
|
45
72
|
prerelease: false
|
46
|
-
|
47
|
-
- !ruby/object:Gem::Dependency
|
73
|
+
type: :development
|
48
74
|
name: guard-cucumber
|
49
|
-
|
75
|
+
version_requirements: *id004
|
76
|
+
- !ruby/object:Gem::Dependency
|
77
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
50
78
|
none: false
|
51
|
-
requirements:
|
52
|
-
- -
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
|
55
|
-
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
hash: 3
|
83
|
+
segments:
|
84
|
+
- 0
|
85
|
+
version: "0"
|
56
86
|
prerelease: false
|
57
|
-
|
58
|
-
- !ruby/object:Gem::Dependency
|
87
|
+
type: :development
|
59
88
|
name: rspec
|
60
|
-
|
89
|
+
version_requirements: *id005
|
90
|
+
- !ruby/object:Gem::Dependency
|
91
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
61
92
|
none: false
|
62
|
-
requirements:
|
63
|
-
- -
|
64
|
-
- !ruby/object:Gem::Version
|
65
|
-
|
66
|
-
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
hash: 3
|
97
|
+
segments:
|
98
|
+
- 0
|
99
|
+
version: "0"
|
67
100
|
prerelease: false
|
68
|
-
version_requirements: *70139107322100
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: guard-rspec
|
71
|
-
requirement: &70139107321640 !ruby/object:Gem::Requirement
|
72
|
-
none: false
|
73
|
-
requirements:
|
74
|
-
- - ! '>='
|
75
|
-
- !ruby/object:Gem::Version
|
76
|
-
version: '0'
|
77
101
|
type: :development
|
78
|
-
|
79
|
-
version_requirements: *
|
102
|
+
name: guard-rspec
|
103
|
+
version_requirements: *id006
|
80
104
|
description: The one Nagios Plugin framework, forged in the fires of Mount Doom.
|
81
|
-
email:
|
105
|
+
email:
|
82
106
|
- bjoernalbers@googlemail.com
|
83
107
|
executables: []
|
108
|
+
|
84
109
|
extensions: []
|
110
|
+
|
85
111
|
extra_rdoc_files: []
|
86
|
-
|
112
|
+
|
113
|
+
files:
|
87
114
|
- .gitignore
|
88
115
|
- .travis.yml
|
89
116
|
- Gemfile
|
@@ -91,10 +118,14 @@ files:
|
|
91
118
|
- LICENSE
|
92
119
|
- README.md
|
93
120
|
- Rakefile
|
121
|
+
- examples/check_file_exists.rb
|
122
|
+
- examples/check_perfdata.rb
|
94
123
|
- features/nagiosplugin_usage.feature
|
95
124
|
- features/steps/dev_steps.rb
|
96
125
|
- features/support/env.rb
|
97
126
|
- lib/nagiosplugin.rb
|
127
|
+
- lib/nagiosplugin/default_options.rb
|
128
|
+
- lib/nagiosplugin/perfdata.rb
|
98
129
|
- lib/nagiosplugin/plugin.rb
|
99
130
|
- lib/nagiosplugin/status_error.rb
|
100
131
|
- lib/nagiosplugin/version.rb
|
@@ -104,35 +135,38 @@ files:
|
|
104
135
|
- spec/spec_helper.rb
|
105
136
|
homepage: https://github.com/bjoernalbers/nagiosplugin
|
106
137
|
licenses: []
|
138
|
+
|
107
139
|
post_install_message:
|
108
140
|
rdoc_options: []
|
109
|
-
|
141
|
+
|
142
|
+
require_paths:
|
110
143
|
- lib
|
111
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
144
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
112
145
|
none: false
|
113
|
-
requirements:
|
114
|
-
- -
|
115
|
-
- !ruby/object:Gem::Version
|
116
|
-
|
117
|
-
segments:
|
146
|
+
requirements:
|
147
|
+
- - ">="
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
hash: 3
|
150
|
+
segments:
|
118
151
|
- 0
|
119
|
-
|
120
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
152
|
+
version: "0"
|
153
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
121
154
|
none: false
|
122
|
-
requirements:
|
123
|
-
- -
|
124
|
-
- !ruby/object:Gem::Version
|
125
|
-
|
126
|
-
segments:
|
155
|
+
requirements:
|
156
|
+
- - ">="
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
hash: 3
|
159
|
+
segments:
|
127
160
|
- 0
|
128
|
-
|
161
|
+
version: "0"
|
129
162
|
requirements: []
|
163
|
+
|
130
164
|
rubyforge_project:
|
131
|
-
rubygems_version: 1.8.
|
165
|
+
rubygems_version: 1.8.24
|
132
166
|
signing_key:
|
133
167
|
specification_version: 3
|
134
|
-
summary: nagiosplugin-1.
|
135
|
-
test_files:
|
168
|
+
summary: nagiosplugin-1.3.0
|
169
|
+
test_files:
|
136
170
|
- features/nagiosplugin_usage.feature
|
137
171
|
- features/steps/dev_steps.rb
|
138
172
|
- features/support/env.rb
|