Nagios Plugins:Check_SNMP_Storage Usage: check_snmp_storage [-v] -H <host> -C <snmp_community> [-2] | (-l login -x passwd [-X pass -L <authp>,<privp>]) [-p <port>] -m <name in desc_oid> [-q storagetype] -w <warn_level> -c <crit_level> [-t <timeout>] [-T pl|pu|bl|bu ] [-r -s -i -G] [-e] [-S 0|1[,1,<car>]] [-o <octet_length>] [-R <% reserved>] ./check_snmp_storage.pl –H $HOSTADDRESS$ –C $ARG1$ -m$ARG2$ –q $ARG3$ –w $ARG4$ –c $ARG5$ ARG1: snmp string ARG2: Partiontion (c:,d: ……) ARG3: Storage Type(Other|Ram|VirtualMemory|FixedDisk|RemovableDisk|FloppyDisk| CompactDisk|RamDisk|FlashMemory|NetworkDisk) ARG4: Warning Threshold % (10,20,30….) ARG5: Critical Threshold % (10,20,30…..) The Perl Script as below: You should replace the red line with your nagios libexe path. #!/usr/bin/perl -w ############################## check_snmp_storage ############## # Version : 1.3.3 # Date : Jun 1 2007 # Author : Patrick Proy ( patrick at proy.org) # Help : http://nagios.manubulon.com # Licence : GPL - http://www.fsf.org/licenses/gpl.txt # TODO : # Contribs : Dimo Velev, Makina Corpus, A. Greiner-B鋜 ################################################################# # # help : ./check_snmp_storage -h use strict; use Net::SNMP; use Getopt::Long; # Nagios specific use lib "/usr/local/nagios/libexec"; use utils qw(%ERRORS $TIMEOUT); #my $TIMEOUT = 15; #my %ERRORS=('OK'=>0,'WARNING'=>1,'CRITICAL'=>2,'UNKNOWN'=>3,'DEPENDENT'=>4); # SNMP Datas my $storage_table= '1.3.6.1.2.1.25.2.3.1'; my $storagetype_table = '1.3.6.1.2.1.25.2.3.1.2'; my $index_table = '1.3.6.1.2.1.25.2.3.1.1'; my $descr_table = '1.3.6.1.2.1.25.2.3.1.3'; my $size_table = '1.3.6.1.2.1.25.2.3.1.5.'; my $used_table = '1.3.6.1.2.1.25.2.3.1.6.'; my $alloc_units = '1.3.6.1.2.1.25.2.3.1.4.'; #Storage types definition - from /usr/share/snmp/mibs/HOST-RESOURCES-TYPES.txt my %hrStorage; $hrStorage{"Other"} = '1.3.6.1.2.1.25.2.1.1'; $hrStorage{"1.3.6.1.2.1.25.2.1.1"} = 'Other'; $hrStorage{"Ram"} = '1.3.6.1.2.1.25.2.1.2'; $hrStorage{"1.3.6.1.2.1.25.2.1.2"} = 'Ram'; $hrStorage{"VirtualMemory"} = '1.3.6.1.2.1.25.2.1.3'; $hrStorage{"1.3.6.1.2.1.25.2.1.3"} = 'VirtualMemory'; $hrStorage{"FixedDisk"} = '1.3.6.1.2.1.25.2.1.4'; $hrStorage{"1.3.6.1.2.1.25.2.1.4"} = 'FixedDisk'; $hrStorage{"RemovableDisk"} = '1.3.6.1.2.1.25.2.1.5'; $hrStorage{"1.3.6.1.2.1.25.2.1.5"} = 'RemovableDisk'; $hrStorage{"FloppyDisk"} = '1.3.6.1.2.1.25.2.1.6'; $hrStorage{"1.3.6.1.2.1.25.2.1.6"} = 'FloppyDisk'; $hrStorage{"CompactDisk"} = '1.3.6.1.2.1.25.2.1.7'; $hrStorage{"1.3.6.1.2.1.25.2.1.7"} = 'CompactDisk'; $hrStorage{"RamDisk"} = '1.3.6.1.2.1.25.2.1.8'; $hrStorage{"1.3.6.1.2.1.25.2.1.8"} = 'RamDisk'; $hrStorage{"FlashMemory"} = '1.3.6.1.2.1.25.2.1.9'; $hrStorage{"1.3.6.1.2.1.25.2.1.9"} = 'FlashMemory'; $hrStorage{"NetworkDisk"} = '1.3.6.1.2.1.25.2.1.10'; $hrStorage{"1.3.6.1.2.1.25.2.1.10"} = 'NetworkDisk'; # Globals my $Name='check_snmp_storage'; my $Version='1.3.3'; my $o_host = undef; # hostname my $o_community = undef; # community my $o_port = 161; # port my $o_version2 = undef; #use snmp v2c my $o_descr = undef; # description filter my $o_storagetype = undef; # parse storage type also my $o_warn = undef; # warning limit my $o_crit= undef; # critical limit my $o_help= undef; # wan't some help ? my $o_type= undef; # pl, pu, mbl, mbu my @o_typeok= ("pu","pl","bu","bl"); # valid values for o_type my $o_verb= undef; # verbose mode my $o_version= undef; # print version my $o_noreg= undef; # Do not use Regexp for name my $o_sum= undef; # add all storage before testing my $o_index= undef; # Parse index instead of description my $o_negate= undef; # Negate the regexp if set my $o_timeout= 5; # Default 5s Timeout my $o_perf= undef; # Output performance data my $o_short= undef; # Short output parameters my @o_shortL= undef; # output type,where,cut my $o_reserve= 0; # % reserved blocks (A. Greiner-B鋜 patch) my $o_giga= undef; # output and levels in gigabytes instead of megabytes # SNMPv3 specific my $o_login= undef; # Login for snmpv3 my $o_passwd= undef; # Pass for snmpv3 my $v3protocols=undef; # V3 protocol list. my $o_authproto='md5'; # Auth protocol my $o_privproto='des'; # Priv protocol my $o_privpass= undef; # priv password # SNMP Message size parameter (Makina Corpus contrib) my $o_octetlength=undef; # functions sub p_version { print "$Name version : $Version\n"; } sub print_usage { print "Usage: $Name [-v] -H <host> -C <snmp_community> [-2] | (-l login -x passwd [-X pass -L <authp>,<privp>]) [-p <port>] -m <name in desc_oid> [-q storagetype] -w <warn_level> -c <crit_level> [-t <timeout>] [-T pl|pu|bl|bu ] [-r -s -i -G] [-e] [-S 0|1[,1,<car>]] [-o <octet_length>] [-R <% reserved>]\n"; } sub round ($$) { sprintf "%.$_[1]f", $_[0]; } sub is_pattern_valid { # Test for things like "<I\s*[^>" or "+5-i" my $pat = shift; if (!defined($pat)) { $pat=" ";} # Just to get rid of compilation time warnings return eval { "" =~ /$pat/; 1 } || 0; } # Get the alarm signal (just in case snmp timout screws up) $SIG{'ALRM'} = sub { print ("ERROR: General time-out (Alarm signal)\n"); exit $ERRORS{"UNKNOWN"}; }; sub isnnum { # Return true if arg is not a number my $num = shift; if ( $num =~ /^-?(\d+\.?\d*)|(^\.\d+)$/ ) { return 0 ;} return 1; } sub help { print "\nSNMP Disk Monitor for Nagios version ",$Version,"\n"; print "(c)2004-2007 Patrick Proy\n\n"; print_usage(); print <<EOT; By default, plugin will monitor %used on drives : warn if %used > warn and critical if %used > crit -v, --verbose print extra debugging information (and lists all storages) -h, --help print this help message -H, --hostname=HOST name or IP address of host to check -C, --community=COMMUNITY NAME community name for the host's SNMP agent (implies SNMP v1) -2, --v2c Use snmp v2c -l, --login=LOGIN ; -x, --passwd=PASSWD Login and auth password for snmpv3 authentication If no priv password exists, implies AuthNoPriv -X, --privpass=PASSWD Priv password for snmpv3 (AuthPriv protocol) -L, --protocols=<authproto>,<privproto> <authproto> : Authentication protocol (md5|sha : default md5) <privproto> : Priv protocole (des|aes : default des) -x, --passwd=PASSWD Password for snmpv3 authentication -p, --port=PORT SNMP port (Default 161) -m, --name=NAME Name in description OID (can be mounpoints '/home' or 'Swap Space'...) This is treated as a regexp : -m /var will match /var , /var/log, /opt/var ... Test it before, because there are known bugs (ex : trailling /) No trailing slash for mountpoints ! -q, --storagetype=[Other|Ram|VirtualMemory|FixedDisk|RemovableDisk|FloppyDisk CompactDisk|RamDisk|FlashMemory|NetworkDisk] Also check the storage type in addition of the name It is possible to use regular expressions ( "FixedDisk|FloppyDisk" ) -r, --noregexp Do not use regexp to match NAME in description OID -s, --sum Add all storages that match NAME (used space and total space) THEN make the tests. -i, --index Parse index table instead of description table to select storage -e, --exclude Select all storages except the one(s) selected by -m No action on storage type selection -T, --type=TYPE pl : calculate percent left pu : calculate percent used (Default) bl : calculate MegaBytes left bu : calculate MegaBytes used -w, --warn=INTEGER percent / MB of disk used to generate WARNING state you can add the % sign -c, --critical=INTEGER percent / MB of disk used to generate CRITICAL state you can add the % sign -R, --reserved=INTEGER % reserved blocks for superuser For ext2/3 filesystems, it is 5% by default -G, --gigabyte output, warning & critical levels in gigabytes -f, --perfparse Perfparse compatible output -S, --short=<type>[,<where>,<cut>] <type>: Make the output shorter : 0 : only print the global result except the disk in warning or critical ex: "< 80% : OK" 1 : Don't print all info for every disk ex : "/ : 66 %used (< 80) : OK" <where>: (optional) if = 1, put the OK/WARN/CRIT at the beginning <cut>: take the <n> first caracters or <n> last if n<0 -o, --octetlength=INTEGER max-size of the SNMP message, usefull in case of Too Long responses. Be carefull with network filters. Range 484 - 65535, default are usually 1472,1452,1460 or 1440. -t, --timeout=INTEGER timeout for SNMP in seconds (Default: 5) -V, --version prints version number Note : with T=pu or T=bu : OK < warn < crit with T=pl ot T=bl : crit < warn < OK If multiple storage are selected, the worse condition will be returned i.e if one disk is critical, the return is critical example : Browse storage list : <script> -C <community> -H <host> -m <anything> -w 1 -c 2 -v the -m option allows regexp in perl format : Test drive C,F,G,H,I on Windows : -m ^[CFGHI]: Test all mounts containing /var : -m /var Test all mounts under /var : -m ^/var Test only /var : -m /var -r Test all swap spaces : -m ^Swap Test all but swap spaces : -m ^Swap -e EOT } sub verb { my $t=shift; print $t,"\n" if defined($o_verb) ; } sub check_options { Getopt::Long::Configure ("bundling"); GetOptions( 'v' => \$o_verb, 'verbose' => \$o_verb, 'h' => \$o_help, 'help' => \$o_help, 'H:s' => \$o_host, 'hostname:s' => \$o_host, 'p:i' => \$o_port, 'port:i' => \$o_port, 'C:s' => \$o_community, 'community:s' => \$o_community, '2' => \$o_version2, 'v2c' => \$o_version2, 'l:s' => \$o_login, 'login:s' => \$o_login, 'x:s' => \$o_passwd, 'passwd:s' => \$o_passwd, 'X:s' => \$o_privpass, 'privpass:s' => \$o_privpass, 'L:s' => \$v3protocols, 'protocols:s' => \$v3protocols, 'c:s' => \$o_crit, 'critical:s' => \$o_crit, 'w:s' => \$o_warn, 'warn:s' => \$o_warn, 't:i' => \$o_timeout, 'timeout:i' => \$o_timeout, 'm:s' => \$o_descr, 'name:s' => \$o_descr, 'T:s' => \$o_type, 'type:s' => \$o_type, 'r' => \$o_noreg, 'noregexp' => \$o_noreg, 's' => \$o_sum, 'sum' => \$o_sum, 'i' => \$o_index, 'index' => \$o_index, 'e' => \$o_negate, 'exclude' => \$o_negate, 'V' => \$o_version, 'version' => \$o_version, 'q:s' => \$o_storagetype, 'storagetype:s'=> \$o_storagetype, 'S:s' => \$o_short, 'short:s' => \$o_short, 'o:i' => \$o_octetlength, 'octetlength:i' => \$o_octetlength, 'f' => \$o_perf, 'perfparse' => \$o_perf, 'R:i' => \$o_reserve, 'reserved:i' => \$o_reserve, 'G' => \$o_giga, 'gigabyte' => \$o_giga ); if (defined($o_help) ) { help(); exit $ERRORS{"UNKNOWN"}}; if (defined($o_version) ) { p_version(); exit $ERRORS{"UNKNOWN"}}; # check mount point regexp if (!is_pattern_valid($o_descr)) { print "Bad pattern for mount point !\n"; print_usage(); exit $ERRORS{"UNKNOWN"}} # check snmp information if ( !defined($o_community) && (!defined($o_login) || !defined($o_passwd)) ) { print "Put snmp login info!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}} if ((defined($o_login) || defined($o_passwd)) && (defined($o_community) || defined($o_version2)) ) { print "Can't mix snmp v1,2c,3 protocols!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}} if (defined ($v3protocols)) { if (!defined($o_login)) { print "Put snmp V3 login info with protocols!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}} my @v3proto=split(/,/,$v3protocols); if ((defined ($v3proto[0])) && ($v3proto[0] ne "")) {$o_authproto=$v3proto[0]; } # Auth protocol if (defined ($v3proto[1])) {$o_privproto=$v3proto[1]; } # Priv protocol if ((defined ($v3proto[1])) && (!defined($o_privpass))) { print "Put snmp V3 priv login info with priv protocols!\n"; print_usage(); exit $ERRORS{"UNKNOWN"}} } # Check types if ( !defined($o_type) ) { $o_type="pu" ;} if ( ! grep( /^$o_type$/ ,@o_typeok) ) { print_usage(); exit $ERRORS{"UNKNOWN"}}; # Check compulsory attributes if ( ! defined($o_descr) || ! defined($o_host) || !defined($o_warn) || !defined($o_crit)) { print_usage(); exit $ERRORS{"UNKNOWN"}}; # Get rid of % sign if any $o_warn =~ s/\%//; $o_crit =~ s/\%//; # Check for positive numbers if (($o_warn < 0) || ($o_crit < 0)) { print " warn and critical > 0 \n";print_usage(); exit $ERRORS{"UNKNOWN"}}; # check if warn or crit in % and MB is tested if ( ( ( $o_warn =~ /%/ ) || ($o_crit =~ /%/)) && ( ( $o_type eq 'bu' ) || ( $o_type eq 'bl' ) ) ) { print "warning or critical cannot be in % when MB are tested\n"; print_usage(); exit $ERRORS{"UNKNOWN"}; } # Check warning and critical values if ( ( $o_type eq 'pu' ) || ( $o_type eq 'bu' )) { if ($o_warn >= $o_crit) { print " warn < crit if type=",$o_type,"\n";print_usage(); exit $ERRORS{"UNKNOWN"}}; } if ( ( $o_type eq 'pl' ) || ( $o_type eq 'bl' )) { if ($o_warn <= $o_crit) { print " warn > crit if type=",$o_type,"\n";prin t_usage(); exit $ERRORS{"UNKNOWN"}}; } if ( ($o_warn < 0 ) || ($o_crit < 0 )) { print "warn and crit must be > 0\n";print_usage(); exit $ERRORS{"UNKNOWN"}}; if ( ( $o_type eq 'pl' ) || ( $o_type eq 'pu' )) { if ( ($o_warn > 100 ) || ($o_crit > 100 )) { print "percent must be < 100\n";print_usage(); exit $ERRORS{"UNKNOWN"}}; } # Check short values if ( defined ($o_short)) { @o_shortL=split(/,/,$o_short); if ((isnnum($o_shortL[0])) || ($o_shortL[0] !=0) && ($o_shortL[0]!=1)) { print "-S first option must be 0 or 1\n";print_usage(); exit $ERRORS{"UNKNOWN"}; } if (defined ($o_shortL[1])&& $o_shortL[1] eq "") {$o_shortL[1]=undef}; if (defined ($o_shortL[2]) && isnnum($o_shortL[2])) {print "-S last option must be an integer\n";print_usage(); exit $ERRORS{"UNKNOWN"};} } #### octet length checks if (defined ($o_octetlength) && (isnnum($o_octetlength) || $o_octetlength > 65535 || $o_octetlength < 484 )) { print "octet lenght must be < 65535 and > 484\n";print_usage(); exit $ERRORS{"UNKNOWN"}; } #### reserved blocks checks (A. Greiner-B鋜 patch). if (defined ($o_reserve) && (isnnum($o_reserve) || $o_reserve > 99 || $o_reserve < 0 )) { print "reserved blocks must be < 100 and >= 0\n";print_usage(); exit $ERRORS{"UNKNOWN"}; } } ########## MAIN ####### check_options(); # Check gobal timeout if (defined($TIMEOUT)) { verb("Alarm at $TIMEOUT"); alarm($TIMEOUT); } else { verb("no timeout defined : $o_timeout + 10"); alarm ($o_timeout+10); } # Connect to host my ($session,$error); if ( defined($o_login) && defined($o_passwd)) { # SNMPv3 login verb("SNMPv3 login"); if (!defined ($o_privpass)) { verb("SNMPv3 AuthNoPriv login : $o_login, $o_authproto"); ($session, $error) = Net::SNMP->session( -hostname => $o_host, -version => '3', -username => $o_login, -authpassword => $o_passwd, -authprotocol => $o_authproto, -port => $o_port, -timeout => $o_timeout ); } else { verb("SNMPv3 AuthPriv login : $o_login, $o_authproto, $o_privproto"); ($session, $error) = Net::SNMP->session( -hostname => $o_host, -version => '3', -username => $o_login, -authpassword => $o_passwd, -authprotocol => $o_authproto, -privpassword => $o_privpass, -privprotocol => $o_privproto, -port => $o_port, -timeout => $o_timeout ); } } else { if (defined ($o_version2)) { # SNMPv2 Login verb("SNMP v2c login"); ($session, $error) = Net::SNMP->session( -hostname => $o_host, -version => 2, -community => $o_community, -port => $o_port, -timeout => $o_timeout ); } else { # SNMPV1 login verb("SNMP v1 login"); ($session, $error) = Net::SNMP->session( -hostname => $o_host, -community => $o_community, -port => $o_port, -timeout => $o_timeout ); } } if (!defined($session)) { printf("ERROR: %s.\n", $error); exit $ERRORS{"UNKNOWN"}; } if (defined($o_octetlength)) { my $oct_resultat=undef; my $oct_test= $session->max_msg_size(); verb(" actual max octets:: $oct_test"); $oct_resultat = $session->max_msg_size($o_octetlength); if (!defined($oct_resultat)) { printf("ERROR: Session settings : %s.\n", $session->error); $session->close; exit $ERRORS{"UNKNOWN"}; } $oct_test= $session->max_msg_size(); verb(" new max octets:: $oct_test"); } my $resultat=undef; my $stype=undef; # Get rid of UTF8 translation in case of accentuated caracters (thanks to Dimo Velev). $session->translate(Net::SNMP->TRANSLATE_NONE); if (defined ($o_index)){ if (Net::SNMP->VERSION < 4) { $resultat = $session->get_table($index_table); } else { $resultat = $session->get_table(Baseoid => $index_table); } } else { if (Net::SNMP->VERSION < 4) { $resultat = $session->get_table($descr_table); } else { $resultat = $session->get_table(Baseoid => $descr_table); } } #get storage typetable for reference if (defined($o_storagetype)){ if (Net::SNMP->VERSION < 4) { $stype = $session->get_table($storagetype_table); } else { $stype = $session->get_table(Baseoid => $storagetype_table); } } if (!defined($resultat) | (!defined($stype) && defined($o_storagetype))) { printf("ERROR: Description/Type table : %s.\n", $session->error); $session->close; exit $ERRORS{"UNKNOWN"}; } my @tindex = undef; my @oids = undef; my @descr = undef; my $num_int = 0; my $count_oid = 0; my $test = undef; my $perf_out= undef; # Select storage by regexp of exact match # and put the oid to query in an array verb("Filter : $o_descr"); foreach my $key ( keys %$resultat) { verb("OID : $key, Desc : $$resultat{$key}"); # test by regexp or exact match / include or exclude if (defined($o_negate)) { $test = defined($o_noreg) ? $$resultat{$key} ne $o_descr : $$resultat{$key} !~ /$o_descr/; } else { $test = defined($o_noreg) ? $$resultat{$key} eq $o_descr : $$resultat{$key} =~ /$o_descr/; } if ($test) { # get the index number of the interface my @oid_list = split (/\./,$key); $tindex[$num_int] = pop (@oid_list); # Check if storage type is OK if (defined($o_storagetype)) { my($skey)=$storagetype_table.".".$tindex[$num_int]; verb(" OID : $skey, Storagetype: $hrStorage{$$stype{$skey}} ?= $o_storagetype"); if ( $hrStorage{$$stype{$skey}} !~ $o_storagetype) { $test=undef; } } if ($test) { # get the full description $descr[$num_int]=$$resultat{$key}; # put the oid in an array $oids[$count_oid++]=$size_table . $tindex[$num_int]; $oids[$count_oid++]=$used_table . $tindex[$num_int]; $oids[$count_oid++]=$alloc_units . $tindex[$num_int]; verb(" Name : $descr[$num_int], Index : $tindex[$num_int]"); $num_int++; } } } verb("storages selected : $num_int"); if ( $num_int == 0 ) { print "Unknown storage : $o_descr : ERROR\n" ; exit $ERRORS{"UNKNOWN"};} my $result=undef; if (Net::SNMP->VERSION < 4) { $result = $session->get_request(@oids); } else { if ($session->version == 0) { # snmpv1 $result = $session->get_request(Varbindlist => \@oids); } else { # snmp v2c or v3 : get_bulk_request is not really good for this, so do simple get $result = $session->get_request(Varbindlist => \@oids); foreach my $key ( keys %$result) { verb("$key : $$result{$key}"); } } } if (!defined($result)) { printf("ERROR: Size table :%s.\n", $session->error); $session->close; exit $ERRORS{"UNKNOWN"}; } $session->close; # Only a few ms left... alarm(0); # Sum everything if -s and more than one storage if ( defined ($o_sum) && ($num_int > 1) ) { verb("Adding all entries"); $$result{$size_table . $tindex[0]} *= $$result{$alloc_units . $tindex[0]}; $$result{$used_table . $tindex[0]} *= $$result{$alloc_units . $tindex[0]}; $$result{$alloc_units . $tindex[0]} = 1; for (my $i=1;$i<$num_int;$i++) { $$result{$size_table . $tindex[0]} += ($$result{$size_table . $tindex[$i]} * $$result{$alloc_units . $tindex[$i]}); $$result{$used_table . $tindex[0]} += ($$result{$used_table . $tindex[$i]} * $$result{$alloc_units . $tindex[$i]}); } $num_int=1; $descr[0]="Sum of all $o_descr"; } my $i=undef; my $warn_state=0; my $crit_state=0; my ($p_warn,$p_crit); my $output=undef; my $output_metric_val = 1024**2; my $output_metric = "M"; # Set the metric if (defined($o_giga)) { $output_metric_val *= 1024; $output_metric='G'; } for ($i=0;$i<$num_int;$i++) { verb("Descr : $descr[$i]"); verb("Size : $$result{$size_table . $tindex[$i]}"); verb("Used : $$result{$used_table . $tindex[$i]}"); verb("Alloc : $$result{$alloc_units . $tindex[$i]}"); if (!defined($$result{$size_table . $tindex[$i]}) || !defined($$result{$used_table . $tindex[$i]}) || !defined ($$result{$alloc_units . $tindex[$i]})) { print "Data not fully defined for storage ",$descr[$i]," : UNKNOWN\n"; exit $ERRORS{"UNKNOWN"}; } my $to = $$result{$size_table . $tindex[$i]} * ( ( 100 - $o_reserve ) / 100 ) * $$result{$alloc_units . $tindex[$i]} / $output_metric_val; my $pu=undef; if ( $$result{$used_table . $tindex[$i]} != 0 ) { $pu = $$result{$used_table . $tindex[$i]}* 100 / ( $$result{$size_ table . $tindex[$i]} * ( 100 - $o_reserve ) / 100 ); }else { $pu=0; } my $bu = $$result{$used_table . $tindex[$i]} * $$result{$alloc_units . $tindex[$i]} / $output_metric_val; my $pl = 100 - $pu; my $bl = ( ( $$result{$size_table . $tindex[$i]} * ( ( 100 - $o_reserve ) / 100 ) - ( $$result{$used_table . $tindex[$i]} ) ) * $$result{$alloc_units . $tindex[$i]} / $output_metric_val ); # add a ' ' if some data exists in $perf_out $perf_out .= " " if (defined ($perf_out)) ; ##### Ouputs and checks # Keep complete description fot performance output (in MB) my $Pdescr=$descr[$i]; $Pdescr =~ s/[`~!\$%\^&\*'"<>|\?,\(= )]/_/g; ##### TODO : subs "," with something if (defined($o_shortL[2])) { if ($o_shortL[2] < 0) {$descr[$i]=substr($descr[$i],$o_shortL[2]);} else {$descr[$i]=substr($descr[$i],0,$o_shortL[2]);} } if ($o_type eq "pu") { # Checks % used my $locstate=0; $p_warn=$o_warn*$to/100;$p_crit=$o_crit*$to/100; (($pu >= $o_crit) && ($locstate=$crit_state=1)) || (($pu >= $o_warn) && ($locstate=$warn_state=1)); if (defined($o_shortL[2])) {} if (!defined($o_shortL[0]) || ($locstate==1)) { # print full output if warn or critical state $output.=sprintf ("%s: %.0f%%used(%.0f%sB/%.0f%sB) ",$descr[$i],$pu,$bu,$output_metric,$to,$output_metric); } elsif ($o_shortL[0] == 1) { $output.=sprintf ("%s: %.0f%% ",$descr[$i],$pu); } } if ($o_type eq 'bu') { # Checks MBytes used my $locstate=0; $p_warn=$o_warn;$p_crit=$o_crit; ( ($bu >= $o_crit) && ($locstate=$crit_state=1) ) || ( ($bu >= $o_warn) && ($locstate=$warn_state=1) ); if (!defined($o_shortL[0]) || ($locstate==1)) { # print full output if warn or critical state $output.=sprintf("%s: %.0f%sBused/%.0f%sB (%.0f%%) ",$descr[$i],$bu,$output_metric,$to,$output_metric,$pu); } elsif ($o_shortL[0] == 1) { $output.=sprintf("%s: %.0f%sB ",$descr[$i],$bu,$output_metric); } } if ($o_type eq 'bl') { my $locstate=0; $p_warn=$to-$o_warn;$p_crit=$to-$o_crit; ( ($bl <= $o_crit) && ($locstate=$crit_state=1) ) || ( ($bl <= $o_warn) && ($locstate=$warn_state=1) ); if (!defined($o_shortL[0]) || ($locstate==1)) { # print full output if warn or critical state $output.=sprintf ("%s: %.0f%sBleft/%.0f%sB (%.0f%%) ",$descr[$i],$bl,$output_metric,$to,$output_metric,$pl); } elsif ($o_shortL[0] == 1) { $output.=sprintf ("%s: %.0f%sB ",$descr[$i],$bl,$output_metric); } } if ($o_type eq 'pl') { my $locstate=0; $p_warn=(100-$o_warn)*$to/100;$p_crit=(100-$o_crit)*$to/100; ( ($pl <= $o_crit) && ($locstate=$crit_state=1) ) || ( ($pl <= $o_warn) && ($locstate=$warn_state=1) ); if (!defined($o_shortL[0]) || ($locstate==1)) { # print full output if warn or critical state $output.=sprintf ("%s: %.0f%%left(%.0f%sB/%.0f%sB) ",$descr[$i],$pl,$bl,$output_metric,$to,$output_metric); } elsif ($o_shortL[0] == 1) { $output.=sprintf ("%s: %.0f%% ",$descr[$i],$pl); } } # Performance output (in MB) $perf_out .= "'".$Pdescr. "'=" . round($bu,0) . $output_metric ."B;" . round($p_warn,0) . ";" . round($p_crit,0) . ";0;" . round($to,0); } verb ("Perf data : $perf_out"); my $comp_oper=undef; my $comp_unit=undef; ($o_type eq "pu") && ($comp_oper ="<") && ($comp_unit ="%"); ($o_type eq "pl") && ($comp_oper =">") && ($comp_unit ="%"); ($o_type eq "bu") && ($comp_oper ="<") && ($comp_unit = $output_metric."B"); ($o_type eq 'bl') && ($comp_oper =">") && ($comp_unit =$output_metric."B"); if (!defined ($output)) { $output="All selected storages "; } if ( $crit_state == 1) { $comp_oper = ($comp_oper eq "<") ? ">" : "<"; # Inverse comp operator if (defined($o_shortL[1])) { print "CRITICAL : (",$comp_oper,$o_crit,$comp_unit,") ",$output; } else { print $output,"(",$comp_oper,$o_crit,$comp_unit,") : CRITICAL"; } (defined($o_perf)) ? print " | ",$perf_out,"\n" : print "\n"; exit $ERRORS{"CRITICAL"}; } if ( $warn_state == 1) { $comp_oper = ($comp_oper eq "<") ? ">" : "<"; # Inverse comp operator if (defined($o_shortL[1])) { print "WARNING : (",$comp_oper,$o_warn,$comp_unit,") ",$output; } else { print $output,"(",$comp_oper,$o_warn,$comp_unit,") : WARNING"; } (defined($o_perf)) ? print " | ",$perf_out,"\n" : print "\n"; exit $ERRORS{"WARNING"}; } if (defined($o_shortL[1])) { print "OK : (",$comp_oper,$o_warn,$comp_unit,") ",$output; } else { print $output,"(",$comp_oper,$o_warn,$comp_unit,") : OK"; } (defined($o_perf)) ? print " | ",$perf_out,"\n" : print "\n"; exit $ERRORS{"OK"}; 转载请保留固定链接: https://linuxeye.com/program/1111.html |