diff options
-rw-r--r-- | MANIFEST | 2 | ||||
-rw-r--r-- | lib/Nagios/Plugin.pm | 26 | ||||
-rw-r--r-- | lib/Nagios/Plugin/Getopt.pm | 4 | ||||
-rw-r--r-- | lib/Nagios/Plugin/Performance.pm | 4 | ||||
-rw-r--r-- | lib/Nagios/Plugin/Threshold.pm | 2 | ||||
-rwxr-xr-x | t/check_stuff.pl | 168 | ||||
-rwxr-xr-x | t/check_stuff.t | 76 |
7 files changed, 275 insertions, 7 deletions
@@ -2,6 +2,8 @@ Changes | |||
2 | Makefile.PL | 2 | Makefile.PL |
3 | MANIFEST | 3 | MANIFEST |
4 | README | 4 | README |
5 | t/check_stuff.pl | ||
6 | t/check_stuff.t | ||
5 | t/Nagios-Plugin.t | 7 | t/Nagios-Plugin.t |
6 | t/Nagios-Plugin-Performance.t | 8 | t/Nagios-Plugin-Performance.t |
7 | t/Nagios-Plugin-Range.t | 9 | t/Nagios-Plugin-Range.t |
diff --git a/lib/Nagios/Plugin.pm b/lib/Nagios/Plugin.pm index c14dfa6..0915571 100644 --- a/lib/Nagios/Plugin.pm +++ b/lib/Nagios/Plugin.pm | |||
@@ -86,6 +86,12 @@ This is the place for common routines when writing Nagios plugins. The idea is t | |||
86 | easy as possible for developers to conform to the plugin guidelines | 86 | easy as possible for developers to conform to the plugin guidelines |
87 | (http://nagiosplug.sourceforge.net/developer-guidelines.html). | 87 | (http://nagiosplug.sourceforge.net/developer-guidelines.html). |
88 | 88 | ||
89 | =head1 EXAMPLE SCRIPT | ||
90 | |||
91 | "Enough talk! Show me where to start!" | ||
92 | |||
93 | See the file 'check_stuff.pl' in the 't' directory for a complete working example of a plugin script. | ||
94 | |||
89 | =head1 DESIGN | 95 | =head1 DESIGN |
90 | 96 | ||
91 | To facilitate object oriented classes, there are multiple perl modules, each reflecting a type of data | 97 | To facilitate object oriented classes, there are multiple perl modules, each reflecting a type of data |
@@ -105,22 +111,30 @@ Only methods listed in the documentation for each module is public. | |||
105 | These modules are experimental and so the interfaces may change up until Nagios::Plugin | 111 | These modules are experimental and so the interfaces may change up until Nagios::Plugin |
106 | hits version 1.0, but every attempt will be made to make backwards compatible. | 112 | hits version 1.0, but every attempt will be made to make backwards compatible. |
107 | 113 | ||
108 | =over 4 | ||
109 | |||
110 | =head1 STARTING | 114 | =head1 STARTING |
111 | 115 | ||
116 | =over 4 | ||
117 | |||
112 | =item use Nagios::Plugin qw(%ERRORS) | 118 | =item use Nagios::Plugin qw(%ERRORS) |
113 | 119 | ||
114 | Imports the %ERRORS hash. This is currently the only symbol that can be imported. | 120 | Imports the %ERRORS hash. This is currently the only symbol that can be imported. |
115 | 121 | ||
122 | =back | ||
123 | |||
116 | =head1 CLASS METHODS | 124 | =head1 CLASS METHODS |
117 | 125 | ||
126 | =over 4 | ||
127 | |||
118 | =item Nagios::Plugin->new( shortname => $$ ) | 128 | =item Nagios::Plugin->new( shortname => $$ ) |
119 | 129 | ||
120 | Initializes a new Nagios::Plugin object. Can specify the shortname here. | 130 | Initializes a new Nagios::Plugin object. Can specify the shortname here. |
121 | 131 | ||
132 | =back | ||
133 | |||
122 | =head1 OBJECT METHODS | 134 | =head1 OBJECT METHODS |
123 | 135 | ||
136 | =over 4 | ||
137 | |||
124 | =item set_thresholds( warning => "10:25", critical => "~:25" ) | 138 | =item set_thresholds( warning => "10:25", critical => "~:25" ) |
125 | 139 | ||
126 | Sets the thresholds, based on the range specification at | 140 | Sets the thresholds, based on the range specification at |
@@ -147,9 +161,13 @@ http://nagiosplug.sourceforge.net | |||
147 | 161 | ||
148 | =head1 AUTHOR | 162 | =head1 AUTHOR |
149 | 163 | ||
150 | Ton Voon, E<lt>ton.voon@altinity.comE<gt> | 164 | Maintained by the Nagios Plugin development team - http://nagiosplug.sourceforge.net |
165 | |||
166 | Originally by Ton Voon, E<lt>ton.voon@altinity.comE<gt> | ||
167 | |||
168 | Nathan Vonnahme added extra tests and subsequent fixes. | ||
151 | 169 | ||
152 | Thanks to Nathan Vonnahme for loads of extra tests and subsequent fixes. | 170 | Gavin Carr contributed the Nagios::Plugin::GetOpt module. |
153 | 171 | ||
154 | =head1 COPYRIGHT AND LICENSE | 172 | =head1 COPYRIGHT AND LICENSE |
155 | 173 | ||
diff --git a/lib/Nagios/Plugin/Getopt.pm b/lib/Nagios/Plugin/Getopt.pm index 1903e8c..d38dced 100644 --- a/lib/Nagios/Plugin/Getopt.pm +++ b/lib/Nagios/Plugin/Getopt.pm | |||
@@ -296,9 +296,7 @@ __END__ | |||
296 | 296 | ||
297 | =head1 NAME | 297 | =head1 NAME |
298 | 298 | ||
299 | Nagios::Plugin::Getopt - OO perl module providing standardised argument | 299 | Nagios::Plugin::Getopt - OO perl module providing standardised argument processing for Nagios plugins |
300 | processing for Nagios plugins | ||
301 | |||
302 | 300 | ||
303 | =head1 VERSION | 301 | =head1 VERSION |
304 | 302 | ||
diff --git a/lib/Nagios/Plugin/Performance.pm b/lib/Nagios/Plugin/Performance.pm index 83c92fb..9e99f54 100644 --- a/lib/Nagios/Plugin/Performance.pm +++ b/lib/Nagios/Plugin/Performance.pm | |||
@@ -106,8 +106,12 @@ Once the performance string has been parsed, you can query the label, value, uom | |||
106 | Returns an array of Nagios::Plugin::Performance objects based on the string entered. | 106 | Returns an array of Nagios::Plugin::Performance objects based on the string entered. |
107 | If there is an error parsing the string, an empty array is returned. | 107 | If there is an error parsing the string, an empty array is returned. |
108 | 108 | ||
109 | =back | ||
110 | |||
109 | =head1 OBJECT METHODS | 111 | =head1 OBJECT METHODS |
110 | 112 | ||
113 | =over 4 | ||
114 | |||
111 | =item label, value, uom, min, max | 115 | =item label, value, uom, min, max |
112 | 116 | ||
113 | These all return scalars. min and max are not well supported yet. | 117 | These all return scalars. min and max are not well supported yet. |
diff --git a/lib/Nagios/Plugin/Threshold.pm b/lib/Nagios/Plugin/Threshold.pm index f3410e8..9e7b938 100644 --- a/lib/Nagios/Plugin/Threshold.pm +++ b/lib/Nagios/Plugin/Threshold.pm | |||
@@ -83,6 +83,8 @@ Returns the warning or critical range as a Nagios::Plugin::Range object. | |||
83 | 83 | ||
84 | Given a value, will see if the value breeches the critical or the warning range. Returns the status code. | 84 | Given a value, will see if the value breeches the critical or the warning range. Returns the status code. |
85 | 85 | ||
86 | =back | ||
87 | |||
86 | =head1 AUTHOR | 88 | =head1 AUTHOR |
87 | 89 | ||
88 | Ton Voon, E<lt>ton.voon@altinity.comE<gt> | 90 | Ton Voon, E<lt>ton.voon@altinity.comE<gt> |
diff --git a/t/check_stuff.pl b/t/check_stuff.pl new file mode 100755 index 0000000..51f551f --- /dev/null +++ b/t/check_stuff.pl | |||
@@ -0,0 +1,168 @@ | |||
1 | #!/usr/local/bin/perl | ||
2 | |||
3 | ### check_stuff.pl | ||
4 | |||
5 | # an example Nagios plugin using the Nagios::Plugin modules. | ||
6 | |||
7 | # Originally by Nathan Vonnahme, n8v at users dot sourceforge | ||
8 | # dot net, July 19 2006 | ||
9 | |||
10 | # Please modify to your heart's content and use as the basis for all | ||
11 | # the really cool Nagios monitoring scripts you're going to create. | ||
12 | # You rock. | ||
13 | |||
14 | # $Id$ | ||
15 | |||
16 | ############################################################################## | ||
17 | # prologue | ||
18 | use strict; | ||
19 | use warnings; | ||
20 | |||
21 | use Nagios::Plugin qw(%ERRORS); | ||
22 | |||
23 | use Nagios::Plugin::Getopt; | ||
24 | |||
25 | |||
26 | use vars qw($VERSION $PROGNAME $verbose $warn $critical $timeout $result); | ||
27 | '$Revision$' =~ /^.*(\d+.\d+) \$$/; # Use The Revision from RCS/CVS/Subversion | ||
28 | $VERSION = $1; | ||
29 | $0 =~ m!^.*/([^/]+)$!; | ||
30 | $PROGNAME = $1; | ||
31 | |||
32 | # shortname is the identifier this script will give to Nagios. | ||
33 | # it's set here to the uppercase program name with file extension removed, | ||
34 | # e.g. check_stuff.pl -> CHECK_STUFF | ||
35 | my $short_name = uc $PROGNAME; | ||
36 | $short_name =~ s/\.\w+$//; | ||
37 | |||
38 | |||
39 | ############################################################################## | ||
40 | # define and get the command line options. | ||
41 | # see the command line option guidelines at | ||
42 | # | ||
43 | |||
44 | |||
45 | # Instantiate Nagios::Plugin::Getopt object (usage and version are mandatory) | ||
46 | my $nagopts = Nagios::Plugin::Getopt->new( | ||
47 | usage => "Usage: %s [ -v|--verbose ] [-H <host>] [-t <timeout>] | ||
48 | [ -c|--critical=<critical threshold> ] | ||
49 | [ -w|--warning=<warning threshold> ] | ||
50 | [ -r|--result = <INTEGER> ]", | ||
51 | version => $VERSION, | ||
52 | blurb => 'This plugin is an example of a Nagios plugin written in Perl using the Nagios::Plugin modules. It will generate a random integer between 1 and 20 (though you can specify the number with the -n option for testing), and will output OK, WARNING or CRITICAL if the resulting number is outside the specified thresholds.', | ||
53 | |||
54 | extra => qq{ | ||
55 | |||
56 | THRESHOLDs for -w and -c are specified 'min:max' or 'min:' or ':max' | ||
57 | (or 'max'). If specified '\@min:max', a warning status will be generated | ||
58 | if the count *is* inside the specified range. | ||
59 | |||
60 | See more threshold examples at | ||
61 | http://nagiosplug.sourceforge.net/developer-guidelines.html#THRESHOLDFORMAT | ||
62 | |||
63 | Examples: | ||
64 | |||
65 | $PROGNAME -w 10 -c 18 | ||
66 | Returns a warning if the resulting number is greater than 10, or a | ||
67 | critical error if it is greater than 18. | ||
68 | |||
69 | $PROGNAME -w 10: -c 4: | ||
70 | Returns a warning if the resulting number is less than 10, or a | ||
71 | critical error if it is less than 4. | ||
72 | |||
73 | |||
74 | } | ||
75 | |||
76 | ); | ||
77 | |||
78 | |||
79 | # Define and document the valid command line options | ||
80 | # usage, help, version, timeout and verbose are defined by default. | ||
81 | |||
82 | $nagopts->arg( | ||
83 | spec => 'warning|w=s', | ||
84 | |||
85 | help => | ||
86 | qq{-w, --warning=INTEGER:INTEGER | ||
87 | Minimum and maximum number of allowable result, outside of which a | ||
88 | warning will be generated. If omitted, no warning is generated.}, | ||
89 | |||
90 | # required => 1, | ||
91 | # default => 10, | ||
92 | ); | ||
93 | |||
94 | $nagopts->arg( | ||
95 | spec => 'critical|c=s', | ||
96 | help => | ||
97 | qq{-c, --critical=INTEGER:INTEGER | ||
98 | Minimum and maximum number of the generated result, outside of | ||
99 | which a critical will be generated. If omitted, a critical is | ||
100 | generated if no processes are running.}, | ||
101 | |||
102 | ); | ||
103 | |||
104 | $nagopts->arg( | ||
105 | spec => 'result|r=f', | ||
106 | help => | ||
107 | qq{-r, --result=INTEGER | ||
108 | Specify the result on the command line rather than generating a | ||
109 | random number. For testing.}, | ||
110 | ); | ||
111 | |||
112 | # Parse arguments and process standard ones (e.g. usage, help, version) | ||
113 | $nagopts->getopts; | ||
114 | |||
115 | |||
116 | my $p = Nagios::Plugin->new; | ||
117 | |||
118 | $p->shortname($short_name); | ||
119 | |||
120 | |||
121 | # sanity checking on command line options | ||
122 | if ( (defined $nagopts->result) && ($nagopts->result < 0 || $nagopts->result > 20) ) { | ||
123 | $p->die( | ||
124 | return_code => $ERRORS{UNKNOWN}, | ||
125 | message => 'invalid number supplied for the -r option' | ||
126 | ); | ||
127 | } | ||
128 | |||
129 | unless ( defined $nagopts->warning || defined $nagopts->critical ) { | ||
130 | $p->die( | ||
131 | return_code => $ERRORS{UNKNOWN}, | ||
132 | message => "you didn't supply a threshold argument" | ||
133 | ); | ||
134 | } | ||
135 | |||
136 | ############################################################################## | ||
137 | # define a Nagios::Threshold object based on the command line options | ||
138 | my $t = $p->set_thresholds( warning => $nagopts->warning, critical => $nagopts->critical ); | ||
139 | |||
140 | |||
141 | ############################################################################## | ||
142 | # check stuff. | ||
143 | |||
144 | # THIS is where you'd do your actual checking to get a real value for $result | ||
145 | # don't forget to timeout after $nagopts->timeout seconds, if applicable. | ||
146 | my $result; | ||
147 | if (defined $nagopts->result) { | ||
148 | $result = $nagopts->result; | ||
149 | print "using supplied result $result from command line\n" if $nagopts->verbose; | ||
150 | } | ||
151 | else { | ||
152 | $result = int rand(20)+1; | ||
153 | print "generated random result $result\n" if $nagopts->verbose; | ||
154 | } | ||
155 | |||
156 | print "status of result ($result) is ", $t->get_status($result), "\n" | ||
157 | if $nagopts->verbose; | ||
158 | |||
159 | |||
160 | |||
161 | |||
162 | ############################################################################## | ||
163 | # output the result and exit | ||
164 | $p->die( | ||
165 | return_code => $t->get_status($result), | ||
166 | message => "sample result was $result" | ||
167 | ); | ||
168 | |||
diff --git a/t/check_stuff.t b/t/check_stuff.t new file mode 100755 index 0000000..a748605 --- /dev/null +++ b/t/check_stuff.t | |||
@@ -0,0 +1,76 @@ | |||
1 | #!/usr/local/bin/perl | ||
2 | # | ||
3 | use strict; use warnings; | ||
4 | #use Test::More qw(no_plan); | ||
5 | use Test::More tests => 16; | ||
6 | |||
7 | my ($r,$args); | ||
8 | my $s = 't/check_stuff.pl'; | ||
9 | $s = 'perl -Ilib '.$s; | ||
10 | |||
11 | my $n = 'CHECK_STUFF'; | ||
12 | |||
13 | # Nagios status strings and exit codes | ||
14 | my %e = qw( | ||
15 | OK 0 | ||
16 | WARNING 1 | ||
17 | CRITICAL 2 | ||
18 | UNKNOWN 3 | ||
19 | ); | ||
20 | |||
21 | $r = `$s`; | ||
22 | is $?>>8 , $e{UNKNOWN}, "exits($e{UNKNOWN}) with no args"; | ||
23 | like $r, qr/^$n UNKNOWN/, "UNKNOWN with no args"; | ||
24 | |||
25 | |||
26 | #TODO: | ||
27 | SKIP: { | ||
28 | local $TODO = q~d'oh! we'll have to redirect STDERR and check it with like() here instead of checking `` which only gets STDIN. Maybe use IPC::Open3?~; | ||
29 | skip "too noisy, see TODO here", 6; | ||
30 | |||
31 | $r = `$s -V`; | ||
32 | is $?>>8 , $e{UNKNOWN}, "exits($e{UNKNOWN}) with -V arg"; | ||
33 | like $r, qr/\d+\.\d/i, "looks like there's a version"; # broken | ||
34 | is $r, '', "prints nothing to STDOUT"; | ||
35 | |||
36 | $r = `$s -h`; | ||
37 | is $?>>8 , $e{UNKNOWN}, "exits($e{UNKNOWN}) with -h arg"; | ||
38 | like $r, qr/usage/i, "looks like there's something helpful"; # broken | ||
39 | is $r, '', "prints nothing to STDOUT"; | ||
40 | } | ||
41 | |||
42 | |||
43 | $args = " -r 99 "; | ||
44 | diag "running `$s $args`" if $ENV{TEST_VERBOSE}; | ||
45 | $r = `$s $args`; | ||
46 | diag "output: '$r'" if $ENV{TEST_VERBOSE}; | ||
47 | is $?>>8 , $e{UNKNOWN}, "exits($e{UNKNOWN}) with $args"; | ||
48 | like $r, qr/UNKNOWN.+invalid/i, "UNKNOWN (warning: invalid -r) with $args"; | ||
49 | |||
50 | |||
51 | my $expected = { | ||
52 | " -w 10:15 -c~:15 -r 0" => 'WARNING', | ||
53 | " -w 10:15 -c~:15 -r 11" => 'OK', | ||
54 | " -w 10:15 -c~:15 -r 15.8" => 'CRITICAL', | ||
55 | }; | ||
56 | |||
57 | test_expected( $s, $expected ); | ||
58 | |||
59 | |||
60 | sub test_expected { | ||
61 | my $s = shift; | ||
62 | my $expected = shift; | ||
63 | foreach ( keys %$expected ) { | ||
64 | diag "running `$s $_`" if $ENV{TEST_VERBOSE}; | ||
65 | $r = `$s $_`; | ||
66 | diag "output: '$r'" if $ENV{TEST_VERBOSE}; | ||
67 | is $?>>8 , $e{$expected->{$_}}, "exits($e{$expected->{$_}}) with $_"; | ||
68 | like $r, qr/^$n $expected->{$_}/i, "looks $expected->{$_} with $_"; | ||
69 | } | ||
70 | } | ||
71 | |||
72 | |||
73 | |||
74 | |||
75 | |||
76 | |||