From: Esteban M. <es...@nu...> - 2013-03-21 19:23:55
|
> Hello: > > I am writing one plugin for check XIV API, at the moment I can check: > CF > DIMM > Ethernet Cable > FAN > MODULES > PSU > UPS > > I am using Perl with Nagios::Plugins, also I am using IBM::XCLI(1) > > I add to original IBM::XCLI module the possibility of obtain only modules > in raw format. But you can try with other checks. > > But I have problems with output, when I run the plugin in bash I get OK, > CRITICAL and UNKNOW results, but when Nagios run the check I get "Return > code of 9 is out of bounds." > > > I am not a Perl writers, it's my first plugin, I paste the code: > > #!/usr/bin/perl > # Copyright: Ton Voon, 2006 > # Modified by Esteban Monge, 2013 > # > # This is the script used in the Nagios Plugin lightning talk > # given by Ton Voon at FOSDEM 2007. > # See http://www.nagioscommunity.org for more details > # > # This script is available under GPLv2, though the ideas are > # public domain :) > # > # You will need to set the permissions of the script so it is executable > > # Get these plugins from CPAN > use Nagios::Plugin; > use Nagios::Plugin::Functions; > use IBM::XCLI; > use warnings; > use Switch; > > #Function for evaluate if any component isn't OK > sub print_array { > $end_code = 0; > local (@array) = @_; > foreach (@array) { > s/^"\|"$//g; > my(@array) = split /","/; > substr($array[0], 0, 1, ''); > if ( $array[1] ne "Status" ) { > print > "Component:\t$array[0]\tStatus:\t$array[1]\n"; > if ($array[1] ne "OK" ) { > $end_code = 2; > } > } > } > if ( $end_code eq 0 ) { > nagios_exit( 'OK', 'Full, full, perfect' ); > } > if ( $end_code eq 2 ) { > nagios_exit( 'CRITICAL', 'Something is Wrong' ); > } > } > > #Define xcli path usually /opt/XIVGUI/xcli > $xcli_path = "/opt/XIVGUI/xcli"; > $np = Nagios::Plugin->new( > shortname => "Check_XIV.pl", > usage => "Usage: %s [-m] [-u] [-p] [-c]", > ); > > $np->add_arg( > spec => "machine|m=s", > help => "-m, --machine=IP. IP of XIV machine", > required => 1, > ); > > $np->add_arg( > spec => "username|u=s", > help => "-u, --username=someuser. User account with read > permissions in XIVGUI", > required => 1, > ); > > $np->add_arg( > spec => "password|p=s", > help => "-p, --password=somepassword. Valid password for the user > of XIVGUI", > required => 1, > ); > > $np->add_arg( > spec => "command|c=s", > help => "-c, --command=somecommand. One command from list_dimm", > required => 1, > ); > > $np->getopts; > > my $xiv = IBM::XCLI->new( > ip_address => $np->opts->machine, > username => $np->opts->username, > password => $np->opts->password, > xcli => $xcli_path, > ); > > switch ($np->opts->command) { > case cf_list { > my @cf = $xiv->cf_list_raw(); > print_array(@cf); > } > case dimm_list { > my @dimms = $xiv->dimm_list_raw(); > print_array(@dimms); > } > case ethernet_cable_list { > my @ethernet_cable = $xiv->ethernet_cable_list_raw(); > print_array(@ethernet_cable); > } > case fan_list { > my @fan = $xiv->fan_list_raw(); > print_array(@fan); > } > case module_list { > my @module = $xiv->module_list_raw(); > print_array(@module); > } > case psu_list { > my @psu = $xiv->psu_list_raw(); > print_array(@psu); > } > case ups_list { > my @ups = $xiv->ups_list_raw(); > print_array(@ups); > } > else { > print "Invalid command\n"; > nagios_exit( UNKNOWN, 'Verify XIV command' ); > } > } > > > > (1) http://search.cpan.org/~ltp/IBM-XCLI-0.5/lib/IBM/XCLI.pm > I continued work in this script, I took check_stuff.pl and adapted it to my XVI script. I executed in console with nagios and recover last return code with echo $? and receive 0, but in Nagios still with "(Return code of 9 is out of bounds)" I don't understand what cause the problem. The adapted script to: #!/usr/bin/perl -w ### check_stuff.pl # an example Nagios plugin using the Nagios::Plugin modules. # Originally by Nathan Vonnahme, n8v at users dot sourceforge # dot net, July 19 2006 # Please modify to your heart's content and use as the basis for all # the really cool Nagios monitoring scripts you're going to create. # You rock. ############################################################################## # prologue use strict; use warnings; use Switch; use Nagios::Plugin; use IBM::XCLI; use vars qw($VERSION $PROGNAME $xcli_path $return_code $array @array $message $result); $VERSION = '1.0'; # get the base name of this script for use in the examples use File::Basename; $PROGNAME = basename($0); #Define xcli path usually /opt/XIVGUI/xcli $xcli_path = "/opt/XIVGUI/xcli"; ############################################################################## # define and get the command line options. # see the command line option guidelines at # http://nagiosplug.sourceforge.net/developer-guidelines.html#PLUGOPTIONS # Instantiate Nagios::Plugin object (the 'usage' parameter is mandatory) my $p = Nagios::Plugin->new( usage => "Usage: %s [-m <host>] [ -u|--username=<username> ] [ -p|--password=<password> ] [ -c|--command = <XIV command> ]", version => $VERSION, 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.', extra => " THRESHOLDs for -w and -c are specified 'min:max' or 'min:' or ':max' (or 'max'). If specified '\@min:max', a warning status will be generated if the count *is* inside the specified range. See more threshold examples at http : // nagiosplug . sourceforge . net / developer-guidelines . html #THRESHOLDFORMAT Examples: $PROGNAME -w 10 -c 18 Returns a warning if the resulting number is greater than 10, or a critical error if it is greater than 18. $PROGNAME -w 10 : -c 4 : Returns a warning if the resulting number is less than 10, or a critical error if it is less than 4. " ); # Define and document the valid command line options # usage, help, version, timeout and verbose are defined by default. $p->add_arg( spec => 'machine|m=s', help => qq{-m, --machine=INTEGER XIV IP address}, # required => 1, # default => 10, ); $p->add_arg( spec => 'username|u=s', help => qq{-u, --username=INTEGER XIV username}, ); $p->add_arg( spec => 'password|p=s', help => qq{-p, --password=INTEGER Password of the XIV username.}, ); $p->add_arg( spec => 'command|c=s', help => qq{-c, --command=INTEGER XIV command, the same that you use with XCLI.}, ); # Parse arguments and process standard ones (e.g. usage, help, version) $p->getopts; my $xiv = IBM::XCLI-> new( ip_address => $p->opts->machine, username => $p->opts->username, password => $p->opts->password, xcli => $xcli_path, ); #Function for evaluate if any component isn't OK sub print_array { $return_code = 0; local (@array) = @_; foreach (@array) { s/^"\|"$//g; my(@array) = split /","/; substr($array[0], 0, 1, ''); if ( $array[1] ne "Status" ) { $message = "Component:\t$array[0]\tStatus:\t$array[1]\n"; # print "Component:\t$array[0]\tStatus:\t$array[1]\n"; if ($array[1] ne "OK" ) { $return_code = 2; } } } } ############################################################################## # check stuff. # THIS is where you'd do your actual checking to get a real value for $result # don't forget to timeout after $p->opts->timeout seconds, if applicable. switch ($p->opts->command) { case "cf_list" { my @cf = $xiv->cf_list_raw(); print_array(@cf); } case "dimm_list" { my @dimms = $xiv->dimm_list_raw(); print_array(@dimms); } case "ethernet_cable" { my @ethernet_cable = $xiv->ethernet_cable_list_raw(); print_array(@ethernet_cable); } case "fan_list" { my @fan = $xiv->fan_list_raw(); print_array(@fan); } case "module_list" { my @module = $xiv->module_list_raw(); print_array(@module); } case "psu_list" { my @psu = $xiv->psu_list_raw(); print_array(@psu); } case "ups_list" { my @ups = $xiv->ups_list_raw(); print_array(@ups); } else { print "Invalid command\n"; nagios_exit( UNKNOWN, 'Verify XIV command' ); } } ############################################################################## # check the result against the defined warning and critical thresholds, # output the result and exit $p->nagios_exit( return_code => $return_code, message => $message ); |