#!/usr/bin/perl -w # # $Id: check_cpu,v 1.7 2004/06/22 16:51:05 hmann Exp $ # # check_cpu checks CPU and returns sar stats # # Copyright (c) 2000-2004 Harper Mann. All rights reserved # (harper.mann@comcast.net) # # No warrenty of any kind is granted io implied. # # Change Log #---------------- # 15-Feb-2004 - Harper Mann # Initial revision # 19-Mar-2004 Harper Mann # Fixed to use /proc instead of sar # 23-Mar-2004 Harper Mann # Back to sar so numbers match. Beta release # 4-Jun-2004 - Harper Mann # Changed idle value to be a < test # 21-Jun-2004 - Harper Mann # Added switch for CPU # use strict; my @sar_vals = undef; my @lines = undef; my @res = undef; my $PROCSTAT = "/proc/stat"; my $cpu; my $userwarn = 101; my $usercrit = 101; my $nicewarn = 101; my $nicecrit = 101; my $syswarn = 101; my $syscrit = 101; my $iowaitwarn = 101; my $iowaitcrit = 101; my $idlewarn = 0; my $idlecrit = 0; my $debug = 0; my $perf = 0; # my $SAR = "/usr/local/groundwork/bin/sar"; my $SAR = "/usr/bin/sar"; use Getopt::Long; use vars qw($opt_V $opt_c $opt_s $opt_n $opt_u $opt_i $opt_W $opt_D $opt_p $opt_h); use vars qw($PROGNAME); use lib "/usr/local/nagios/libexec" ; use utils qw($TIMEOUT %ERRORS &print_revision &support &usage); sub print_help (); sub print_usage (); $PROGNAME = "check_cpu"; Getopt::Long::Configure('bundling'); my $status = GetOptions ( "V" => \$opt_V, "Version" => \$opt_V, "c=s" => \$opt_c, "cpu=s" => \$opt_c, "u=s" => \$opt_u, "user=s" => \$opt_u, "n=s" => \$opt_n, "nice=s" => \$opt_n, "s=s" => \$opt_s, "system=s" => \$opt_s, "W=s" => \$opt_W, "iowait=s" => \$opt_W, "i=s" => \$opt_i, "idle=s" => \$opt_i, "D" => \$opt_D, "debug" => \$opt_D, "p" => \$opt_p, "performance" => \$opt_p, "h" => \$opt_h, "help" => \$opt_h ); if ($status == 0) { print_usage() ; exit $ERRORS{'UNKNOWN'}; } # Debug switch if ($opt_D) { $debug = 1 } # Cpu switch if ($opt_c) { $cpu = $opt_c } else { $cpu = 0 } print "CPU: $cpu\n" if $debug; # Performance switch if ($opt_p) { $perf = 1; } # Version if ($opt_V) { print_revision($PROGNAME,'$Revision: 1.7 $'); exit $ERRORS{'OK'}; } if ($opt_h) {print_help(); exit $ERRORS{'UNKNOWN'}} # Options checking # Percent CPU system utilization if ($opt_s) { ($syswarn, $syscrit) = split /:/, $opt_s; ($syswarn && $syscrit) || usage ("missing value -s \n"); ($syswarn =~ /^\d{1,3}$/ && $syswarn > 0 && $syswarn <= 100) && ($syscrit =~ /^\d{1,3}$/ && $syscrit > 0 && $syscrit <= 100) || usage("Invalid value: -s (system percent): $opt_s\n"); ($syscrit > $syswarn) || usage("system critical (-s $opt_s ) must be > warning\n"); } # Percent CPU nice utilization if ($opt_n) { ($nicewarn, $nicecrit) = split /:/, $opt_n; ($nicewarn && $nicecrit) || usage ("missing value -n \n"); ($nicewarn =~ /^\d{1,3}$/ && $nicewarn > 0 && $nicewarn <= 100) && ($nicecrit =~ /^\d{1,3}$/ && $nicecrit > 0 && $nicecrit <= 100) || usage("Invalid value: -n (nice percent): $opt_n\n"); ($nicecrit > $nicewarn) || usage("nice critical (-n $opt_n ) must be > warning\n"); } # Percent CPU user utilzation if ($opt_u) { ($userwarn, $usercrit) = split /:/, $opt_u; ($userwarn && $usercrit) || usage ("missing value -u \n"); ($userwarn =~ /^\d{1,3}$/ && $userwarn > 0 && $userwarn <= 100) && ($usercrit =~ /^\d{1,3}$/ && $usercrit > 0 && $usercrit <= 100) || usage("Invalid value: -u (user percent): $opt_u\n"); ($usercrit > $userwarn) || usage("user critical (-u $opt_u ) must be < warning\n"); } # Percent CPU idle utilzation if ($opt_i) { ($idlewarn, $idlecrit) = split /:/, $opt_i; ($idlewarn && $idlecrit) || usage ("missing value -i \n"); ($idlewarn =~ /^\d{1,3}$/ && $idlewarn > 0 && $idlewarn <= 100) && ($idlecrit =~ /^\d{1,3}$/ && $idlecrit > 0 && $idlecrit <= 100) || usage("Invalid value: -i (idle percent): $opt_i\n"); ($idlecrit < $idlewarn) || usage("idle critical (-i $opt_i ) must be > warning\n"); } # Percent CPU iowait utilzation if ($opt_W) { ($iowaitwarn, $iowaitcrit) = split /:/, $opt_W; ($iowaitwarn && $iowaitcrit) || usage ("missing value -W \n"); ($iowaitwarn =~ /^\d{1,3}$/ && $iowaitwarn > 0 && $iowaitwarn <= 100) && ($iowaitcrit =~ /^\d{1,3}$/ && $iowaitcrit > 0 && $iowaitcrit <= 100) || usage("Invalid value: -W (iowait percent): $opt_W\n"); ($iowaitcrit > $iowaitwarn) || usage("iowait critical (-i $opt_W ) must be > warning\n"); } # Read /proc/stat values. The first "cpu " line has aggregate values if # the system is SMP # my ($lbl, $user, $nice, $sys, $iowait, $idle, $idle2, $use_idle2) = undef; if ($cpu eq "ALL" ) { (@res = qx/$SAR 1 1/) || die "No output from sar: $!"; } else { (@res = qx/$SAR 1 1 -U $cpu/) || die "No output from sar: $!"; } foreach (@res) { chomp; if (/steal/) { $use_idle2 = 1; } ($lbl,$cpu,$user,$nice,$sys,$iowait,$idle,$idle2) = split(/\s+/); if (/average/) { last } } $idle = $idle2 if $use_idle2; # Do the value checks my $out = undef; $out=$out."(cpu: $cpu) "; $out=$out."user: $user"; ($user > $usercrit) ? ($out=$out."(Critical) ") : ($user > $userwarn) ? ($out=$out."(Warning) ") : ($out=$out."(OK) "); $out=$out."nice: $nice"; ($nice > $nicecrit) ? ($out=$out."(Critical) ") : ($nice > $nicewarn) ? ($out=$out."(Warning) ") : ($out=$out."(OK) "); $out=$out."iowait: $iowait"; ($iowait > $iowaitcrit) ? ($out=$out."(Critical) ") : ($iowait > $iowaitwarn) ? ($out=$out."(Warning) ") : ($out=$out."(OK) "); $out=$out."sys: $sys"; ($sys > $syscrit) ? ($out=$out."(Critical) ") : ($sys > $syswarn) ? ($out=$out."(Warning) ") : ($out=$out."(OK) "); $out=$out."idle: $idle"; ($idle < $idlecrit) ? ($out=$out."(Critical) ") : ($idle < $idlewarn) ? ($out=$out."(Warning) ") : ($out=$out."(OK) "); print "$out"; print " |cpu: $cpu user: $user nice: $nice sys: $sys idle: $idle" if $perf; print "\n"; # Plugin output # $worst == $ERRORS{'OK'} ? print "CPU OK @goodlist" : print "@badlist"; # Performance? if ($out =~ /Critical/) { exit (2) } if ($out =~ /Warning/) { exit (1) } exit (0); #OK # Usage sub sub print_usage () { print "Usage: $PROGNAME [-c, --cpu [-u, --user percent [-n, --nice percent [-s, --system percent [-i, --idle percent (NOTE: idle less than x) [-p] (output Nagios performance data) [-D] (debug) [-h] (help) [-V] (Version)\n"; } # Help sub sub print_help () { print_revision($PROGNAME,'$Revision: 1.7 $'); # Perl device CPU check plugin for Nagios print_usage(); print " -c, --cpu CPU Number (default is 0, ALL for all) -u, --user Percent CPU user -n, --nice Percent CPU nice -s, --system=STRING Percent CPU system -i, --idle If less than Percent CPU idle -p, --performance Report Nagios performance data after the ouput string -h, --help Print help -V, --Version Print version of plugin "; }