[Nagiosplug-checkins] Nagios-Plugin/lib/Nagios Plugin.pm,1.9,1.10
Gavin Carr
gonzai at users.sourceforge.net
Tue Sep 26 06:10:38 CEST 2006
Update of /cvsroot/nagiosplug/Nagios-Plugin/lib/Nagios
In directory sc8-pr-cvs7.sourceforge.net:/tmp/cvs-serv11863/lib/Nagios
Modified Files:
Plugin.pm
Log Message:
Update Nagios::Plugin with NP::Function wrapper methods, and extras.
Index: Plugin.pm
===================================================================
RCS file: /cvsroot/nagiosplug/Nagios-Plugin/lib/Nagios/Plugin.pm,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- Plugin.pm 26 Sep 2006 01:10:23 -0000 1.9
+++ Plugin.pm 26 Sep 2006 04:10:36 -0000 1.10
@@ -1,17 +1,17 @@
# This is only because Class::Struct doesn't allow subclasses
# Trick stolen from Class::DBI
-package Nagios::__::Plugin;
+###package Nagios::__::Plugin;
-use 5.008004;
use Class::Struct;
struct "Nagios::__::Plugin" => {
- perfdata => '@',
- shortname => '$',
- };
+ perfdata => '@',
+ shortname => '$',
+ messages => '%',
+ };
package Nagios::Plugin;
-use Nagios::Plugin::Functions;
+use Nagios::Plugin::Functions qw(:codes %ERRORS %STATUS_TEXT @STATUS_CODES);
use Nagios::Plugin::Performance;
use Nagios::Plugin::Threshold;
@@ -22,149 +22,385 @@
use Exporter;
our @ISA = qw(Exporter Nagios::__::Plugin);
+our @EXPORT = (@STATUS_CODES);
our @EXPORT_OK = qw(%ERRORS);
our $VERSION = $Nagios::Plugin::Functions::VERSION;
sub add_perfdata {
- my ($self, %args) = @_;
- my $perf = Nagios::Plugin::Performance->new(%args);
- push @{$self->perfdata}, $perf;
+ my ($self, %args) = @_;
+ my $perf = Nagios::Plugin::Performance->new(%args);
+ push @{$self->perfdata}, $perf;
}
-
sub all_perfoutput {
- my $self = shift;
- return join(" ", map {$_->perfoutput} (@{$self->perfdata}));
+ my $self = shift;
+ return join(" ", map {$_->perfoutput} (@{$self->perfdata}));
}
sub set_thresholds { shift; Nagios::Plugin::Threshold->set_thresholds(@_); }
+# NP::Functions wrappers
+sub nagios_exit {
+ my $self = shift;
+ Nagios::Plugin::Functions::nagios_exit(@_, { plugin => $self });
+}
+sub nagios_die {
+ my $self = shift;
+ Nagios::Plugin::Functions::nagios_die(@_, { plugin => $self });
+}
sub die {
- my $self = shift;
- Nagios::Plugin::Functions::die(@_, { plugin => $self });
+ my $self = shift;
+ Nagios::Plugin::Functions::nagios_die(@_, { plugin => $self });
}
+# -------------------------------------------------------------------------
+# NP::Functions::check_messages helpers and wrappers
+
+sub add_message {
+ my $self = shift;
+ my ($code, @messages) = @_;
+
+ croak "Invalid error code '$code'"
+ unless defined($ERRORS{uc $code}) || defined($STATUS_TEXT{$code});
+
+ # Store messages using strings rather than numeric codes
+ $code = $STATUS_TEXT{$code} if $STATUS_TEXT{$code};
+ $code = lc $code;
+ croak "Error code '$code' not supported by add_message"
+ if $code eq 'unknown' || $code eq 'dependent';
+
+ $self->messages($code, []) unless $self->messages($code);
+ push @{$self->messages($code)}, @messages;
+}
+
+sub check_messages {
+ my $self = shift;
+ my %args = @_;
+
+ # Add object messages to any passed in as args
+ for my $code (qw(critical warning ok)) {
+ my $messages = $self->messages($code) || [];
+ if ($args{$code}) {
+ unless (ref $args{$code} eq 'ARRAY') {
+ if ($code eq 'ok') {
+ $args{$code} = [ $args{$code} ];
+ } else {
+ croak "Invalid argument '$code'"
+ }
+ }
+ push @{$args{$code}}, @$messages;
+ }
+ else {
+ $args{$code} = $messages;
+ }
+
+
+ Nagios::Plugin::Functions::check_messages(%args);
+}
+
+# -------------------------------------------------------------------------
+
1;
+
+#vim:et:sw=4
+
__END__
+
=head1 NAME
-Nagios::Plugin - Object oriented helper routines for your Nagios plugin
+Nagios::Plugin - a family of perl modules to streamline writing Nagios plugins
+
=head1 SYNOPSIS
- use Nagios::Plugin qw(%ERRORS);
- $p = Nagios::Plugin->new( shortname => "PAGESIZE" );
+ # Constants OK, WARNING, CRITICAL, and UNKNOWN are exported by default
+ # See also Nagios::Plugin::Functions for a functional interface
+ use Nagios::Plugin;
- $threshold = $p->set_thresholds( warning => "10:25", critical => "~:25" );
- # Critical if outside -INF to 25, ie > 25. Warn if outside 10-25, ie < 10
+ # Constructor
+ $np = Nagios::Plugin->new; # OR
+ $np = Nagios::Plugin->new( shortname => "PAGESIZE" );
- # ... collect current metric into $value
- if ($trouble_getting_metric) {
- $p->die( return_code => $ERRORS{UNKNOWN}, message => "Could not retrieve page");
- # Output: PAGESIZE UNKNOWN Could not retrieve page
- # Return code: 3
- }
+ # Exit methods - nagios_exit( CODE, MESSAGE ), nagios_die( MESSAGE, [CODE])
+ $page = retrieve_page($page1)
+ or $np->nagios_exit( UNKNOWN, "Could not retrieve page" );
+ # Return code: 3; output: PAGESIZE UNKNOWN - Could not retrieve page
+ test_page($page)
+ or $np->nagios_exit( CRITICAL, "Bad page found" );
- $p->add_perfdata( label => "size",
- value => $value,
- uom => "kB",
- threshold => $threshold,
+ # nagios_die() is just like nagios_exit(), but return code defaults to UNKNOWN
+ $page = retrieve_page($page2)
+ or $np->nagios_die( "Could not retrieve page" );
+ # Return code: 3; output: PAGESIZE UNKNOWN - Could not retrieve page
+
+ # Threshold methods (NOT YET IMPLEMENTED - use Nagios::Plugin::Threshold for now)
+ $code = $np->check_threshold(
+ check => $value,
+ warning => $warning_threshold,
+ critical => $critical_threshold,
);
- $p->add_perfdata( label => "time", ... );
+ $np->nagios_exit( $code, "Threshold check failed" ) if $code != OK;
+
+ # Message methods (EXPERIMENTAL AND SUBJECT TO CHANGE) -
+ # add_message( CODE, $message ); check_messages()
+ for (@collection) {
+ if (m/Error/) {
+ $np->add_message( CRITICAL, $_ );
+ } else {
+ $np->add_message( OK, $_ );
+ }
+ }
+ ($code, $message) = $np->check_message();
+ nagios_exit( $code, $message );
+ # If any items in collection matched m/Error/, returns CRITICAL and the joined
+ # set of Error messages; otherwise returns OK and the joined set of ok messages
+
+ # Perfdata methods
+ $np->add_perfdata(
+ label => "size",
+ value => $value,
+ uom => "kB",
+ threshold => $threshold,
+ );
+ $np->add_perfdata( label => "time", ... );
+ $np->nagios_exit( OK, "page size at http://... was ${value}kB" );
+ # Return code: 0; output:
+ # PAGESIZE OK - page size at http://... was 36kB | size=36kB;10:25;25: time=...
+
+ # Option handling methods (NOT YET IMPLEMENTED - use Nagios::Plugin::Getopt for now)
+
- $p->die( return_code => $threshold->get_status($value), message => "page size at http://... was ${value}kB" );
- # Output: PAGESIZE OK: page size at http://... was 36kB | size=36kB;10:25;25: time=...
- # Return code: 0
=head1 DESCRIPTION
-This is the place for common routines when writing Nagios plugins. The idea is to make it as
-easy as possible for developers to conform to the plugin guidelines
+Nagios::Plugin and its associated Nagios::Plugin::* modules are a family of perl modules
+to streamline writing Nagios plugins. The main end user modules are Nagios::Plugin,
+providing an object-oriented interface to the entire Nagios::Plugin::* collection, and
+Nagios::Plugin::Functions, providing a simpler functional interface to a useful subset of
+the available functionality.
+
+The purpose of the collection is to make it as simple as possible for developers to
+create plugins that conform the Nagios Plugin guidelines
(http://nagiosplug.sourceforge.net/developer-guidelines.html).
-=head1 EXAMPLE SCRIPT
-"Enough talk! Show me where to start!"
+=head2 EXPORTS
-See the file 'check_stuff.pl' in the 't' directory for a complete working example of a plugin script.
+Nagios status code constants are exported by default:
-=head1 DESIGN
+ OK
+ WARNING
+ CRITICAL
+ UNKNOWN
+ DEPENDENT
-To facilitate object oriented classes, there are multiple perl modules, each reflecting a type of data
-(ie, thresholds, ranges, performance). However, a plugin developer does not need to know about the
-different types - a "use Nagios::Plugin" should be sufficient.
+The following variables are also exported on request:
-There is a Nagios::Plugin::Export. This holds all internals variables. You can specify these variables
-when use'ing Nagios::Plugin
+=over 4
- use Nagios::Plugin qw(%ERRORS)
- print $ERRORS{WARNING} # prints 1
+=item %ERRORS
-=head1 VERSIONING
+A hash mapping error strings ("CRITICAL", "UNKNOWN", etc.) to the corresponding
+status code.
-Only methods listed in the documentation for each module is public.
+=item %STATUS_TEXT
-These modules are experimental and so the interfaces may change up until Nagios::Plugin
-hits version 1.0, but every attempt will be made to make backwards compatible.
+A hash mapping status code constants (OK, WARNING, CRITICAL, etc.) to the
+corresponding error string ("OK", "WARNING, "CRITICAL", etc.) i.e. the reverse
+of %ERRORS.
-=head1 STARTING
+=back
+
+
+=head2 CONSTRUCTOR
+
+ Nagios::Plugin->new;
+
+ Nagios::Plugin->new( shortname => 'PAGESIZE' );
+
+Instantiates a new Nagios::Plugin object. Accepts the following named arguments:
=over 4
-=item use Nagios::Plugin qw(%ERRORS)
+=item shortname
-Imports the %ERRORS hash. This is currently the only symbol that can be imported.
+The 'shortname' for this plugin, used as the first token in the plugin output
+by the various exit methods. Default: uc basename $0.
=back
-=head1 CLASS METHODS
+
+=head2 EXIT METHODS
=over 4
-=item Nagios::Plugin->new( shortname => $$ )
+=item nagios_exit( <CODE>, $message )
-Initializes a new Nagios::Plugin object. Can specify the shortname here.
+Exit with return code CODE, and a standard nagios message of the
+form "SHORTNAME CODE - $message".
+
+=item nagios_die( $message, [<CODE>] )
+
+Same as nagios_exit(), except that CODE is optional, defaulting
+to UNKNOWN.
+
+=item die( $message, [<CODE>] )
+
+Alias for nagios_die(). Deprecated.
=back
-=head1 OBJECT METHODS
+
+=head2 THRESHOLD METHODS
+
+NOT YET IMPLEMENTED - use Nagios::Plugin::Threshold directly for now.
=over 4
-=item set_thresholds( warning => "10:25", critical => "~:25" )
+=item check_threshold( check => $value, warning => $warn, critical => $crit )
-Sets the thresholds, based on the range specification at
-http://nagiosplug.sourceforge.net/developer-guidelines.html#THRESHOLDFORMAT.
-Returns a Nagios::Plugin::Threshold object, which can be used to input a value to see which threshold
-is crossed.
+=back
-=item add_perfdata( label => "size", value => $value, uom => "kB", threshold => $threshold )
-Adds to an array a Nagios::Plugin::Performance object with the specified values.
+=head2 MESSAGE METHODS
-This needs to be done separately to allow multiple perfdata output.
+EXPERIMENTAL AND SUBJECT TO CHANGE
-=item die( return_code => $ERRORS{CRITICAL}, message => "Output" )
+add_messages and check_messages are higher-level convenience methods to add
+and then check a set of messages, returning an appropriate return code and/or
+result message.
-Exits the plugin and prints to STDOUT a Nagios plugin compatible output. Exits with the specified
-return code. Also prints performance data if any have been added in.
+=over 4
+
+=item add_message( <CODE>, $message )
+
+Add a message with CODE status to the object. May be called multiple times. The messages
+added are checked by check_messages, following.
+
+Only CRITICAL, WARNING, and OK are accepted as valid codes.
+
+
+=item check_messages()
+
+Check the current set of messages and return an appropriate nagios return code and/or a
+result message. In scalar context, returns only a return code; in list context returns
+both a return code and an output message, suitable for passing directly to nagios_exit()
+e.g.
+
+ $code = $np->check_messages;
+ ($code, $message) = $np->check_messages;
+
+check_messages returns CRITICAL if any critical messages are found, WARNING if any
+warning messages are found, and OK otherwise. The message returned in list context defaults
+to the joined set of error messages; this may be customised using the arguments below.
+
+check_messages accepts the following named arguments (none are required):
+
+=over 4
+
+=item join => SCALAR
+
+A string used to join the relevant array to generate the message
+string returned in list context i.e. if the 'critical' array @crit
+is non-empty, check_messages would return:
+
+ join( $join, @crit )
+
+as the result message. Default: ' ' (space).
+
+=item join_all => SCALAR
+
+By default, only one set of messages are joined and returned in the
+result message i.e. if the result is CRITICAL, only the 'critical'
+messages are included in the result; if WARNING, only the 'warning'
+messages are included; if OK, the 'ok' messages are included (if
+supplied) i.e. the default is to return an 'errors-only' type
+message.
+
+If join_all is supplied, however, it will be used as a string to
+join the resultant critical, warning, and ok messages together i.e.
+all messages are joined and returned.
+
+=item critical => ARRAYREF
+
+Additional critical messages to supplement any passed in via add_message().
+
+=item warning => ARRAYREF
+
+Additional warning messages to supplement any passed in via add_message().
+
+=item ok => ARRAYREF | SCALAR
+
+Additional ok messages to supplement any passed in via add_message().
+
+=back
=back
+
+=head2 PERFORMANCE DATA METHODS
+
+=over 4
+
+=item add_perfdata( label => "size", value => $value, uom => "kB", threshold => $threshold )
+
+Add a set of performance data to the object. May be called multiple times. The performance
+data is included in the standard plugin output messages by the various exit methods.
+
+See the Nagios::Plugin::Performance documentation for more information on performance data
+and the various field definitions, as well as the relevant section of the Nagios Plugin
+guidelines (http://nagiosplug.sourceforge.net/developer-guidelines.html#AEN202).
+
+=back
+
+
+=head2 OPTION HANDLING METHODS
+
+NOT YET IMPLEMENTED - use Nagios::Plugin::Getopt directly for now.
+
+
+=head1 EXAMPLES
+
+"Enough talk! Show me some examples!"
+
+See the file 'check_stuff.pl' in the 't' directory for a complete working example of a
+plugin script.
+
+
+=head1 VERSIONING
+
+The Nagios::Plugin::* modules are currently experimental and so the interfaces may
+change up until Nagios::Plugin hits version 1.0, although every attempt will be made to
+keep them as backwards compatible as possible.
+
+
=head1 SEE ALSO
-http://nagiosplug.sourceforge.net
+See Nagios::Plugin::Functions for a simple functional interface to a subset
+of the available Nagios::Plugin functionality.
+
+See also Nagios::Plugin::Getopt, Nagios::Plugin::Range, Nagios::Plugin::Performance,
+Nagios::Plugin::Range, and Nagios::Plugin::Threshold.
+
+The Nagios Plugin project page is at http://nagiosplug.sourceforge.net.
+
+
+=head1 BUGS
+
+Please report bugs in these modules to the Nagios Plugin development team:
+nagiosplug-devel at lists.sourceforge.net.
+
=head1 AUTHOR
-Maintained by the Nagios Plugin development team - http://nagiosplug.sourceforge.net
+Maintained by the Nagios Plugin development team - http://nagiosplug.sourceforge.net.
-Originally by Ton Voon, E<lt>ton.voon at altinity.comE<gt>
+Originally by Ton Voon, E<lt>ton.voon at altinity.comE<gt>.
Nathan Vonnahme added extra tests and subsequent fixes.
-Gavin Carr contributed the Nagios::Plugin::GetOpt module.
+
=head1 COPYRIGHT AND LICENSE
More information about the Commits
mailing list