diff --git a/check_linux_stats-1.5.pl b/check_linux_stats-1.5.pl new file mode 100644 index 0000000..15511fa --- /dev/null +++ b/check_linux_stats-1.5.pl @@ -0,0 +1,746 @@ +#!/usr/bin/perl +# ---------------------------------------------------- # +# File : check_linux_stats +# Author : Damien SIAUD +# Email : plugmon@free.fr +# Date : 07/12/2009 +# Rev. Date : 07/05/2010 +# Rev. Date : 07/01/2013 +# Rev. Date : 19/11/2015 +# ---------------------------------------------------- # +# This script require Sys::Statistics::Linux +# +# Plugin check for nagios +# +# License Information: +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# ---------------------------------------------------- # + +use FindBin; +use lib $FindBin::Bin; +use utils qw($TIMEOUT %ERRORS &print_revision &support); +use Getopt::Long; +use Sys::Statistics::Linux; +use Sys::Statistics::Linux::Processes; +use Sys::Statistics::Linux::SysInfo; + + +use vars qw($script_name $script_version $o_sleep $o_pattern $o_cpu $o_context $o_procs $o_process $o_mem $o_net $o_disk $o_io $o_load $o_file $o_socket $o_paging $o_uptime $o_help $o_version $o_warning $o_critical $o_unit); +use strict; + +# --------------------------- globals -------------------------- # + +$script_name = "check_linux_stats"; +$script_version = "1.5"; +$o_help = undef; +$o_pattern = undef; +$o_version = undef; +$o_warning = 0; +$o_critical = 0; +$o_sleep = 1; +$o_unit = "MB"; +my $status = 'UNKNOWN'; + +# ---------------------------- main ----------------------------- # +check_options(); + +if($o_cpu){ + check_cpu(); +} +elsif($o_context){ + check_context_switch(); +} +elsif($o_mem){ + check_mem(); +} +elsif($o_disk){ + check_disk(); +} +elsif($o_io){ + check_io(); +} +elsif($o_net){ + check_net(); +} +elsif($o_load){ + check_load(); +} +elsif($o_file){ + check_file(); +} +elsif($o_procs){ + check_procs(); +} +elsif($o_socket){ + check_socket(); +} +elsif($o_process){ + check_process(); +} +elsif($o_paging){ + check_paging(); +} +elsif($o_uptime){ + check_uptime(); +} +else { + help(); +} + +print "\n"; + +exit $ERRORS{$status}; + + +sub check_cpu { + my $lxs = Sys::Statistics::Linux->new(cpustats => 1); + $lxs->init; + sleep $o_sleep; + my $stat = $lxs->get; + + if(defined($stat->cpustats)) { + $status = "OK"; + my $cpu = $stat->cpustats->{cpu}; + my $cpu_used=sprintf("%.2f", (100-$cpu->{idle})); + + if ($cpu_used >= $o_critical) { + $status = "CRITICAL"; + } + elsif ($cpu_used >= $o_warning) { + $status = "WARNING"; + } + + my $perfdata .= "|" + ."idle=$cpu->{idle}%;$o_warning;$o_critical " + ."user=$cpu->{user}% " + ."system=$cpu->{system}% " + ."iowait=$cpu->{iowait}%"; + $perfdata .= " steal=$cpu->{steal}%" if(defined($cpu->{steal})); + + print "CPU $status : idle $cpu->{idle}% $perfdata"; + } + else { + print "No data"; + } +} + +sub _getproc { + my $file = shift; + + my %proc = (); + open FILE, "< $file" or die ("Cannot open $file: $!"); + while (my $line = ) { + chomp($line); + if ($line =~ /^(\w+)\s+(.*)$/) { + $proc{$1} = $2; + } + } + close FILE; + return \%proc; +} + +sub check_context_switch { + # Read the /proc/stat + my $file = '/proc/stat'; + + my $proc1 = _getproc($file); + if($proc1->{ctxt}) { + $status = "OK"; + sleep $o_sleep; + my $proc2 = _getproc($file); + my $ctxt = int(($proc2->{ctxt} - $proc1->{ctxt}) / $o_sleep); + if($ctxt >= $o_critical) { + $status = "CRITICAL"; + } + elsif ($ctxt >= $o_warning) { + $status = "WARNING"; + } + + print "CONTEXT SWITCH $status : context $ctxt|ctxt=$ctxt"; + } + else { + print "No data"; + } +} + +sub check_procs { + my $lxs = Sys::Statistics::Linux->new(procstats => 1); + $lxs->init; + sleep $o_sleep; + my $stat = $lxs->get; + + if(defined($stat->procstats)) { + $status = "OK"; + my $procs = $stat->procstats; + + if($procs->{count} >= $o_critical) { + $status = "CRITICAL"; + } + elsif ($procs->{count} >= $o_warning) { + $status = "WARNING"; + } + + my $perfdata .= "|" + ."count=$procs->{count};$o_warning;$o_critical " + ."runqueue=$procs->{runqueue} " + ."blocked=$procs->{blocked} " + ."running=$procs->{running} " + ."new=$procs->{new}"; + print "PROCS $status : count $procs->{count} $perfdata"; + } +} + + +sub check_process { + my $return_str = ""; + my $perfdata = ""; + # pidfiles + my @pids = (); + for my $file (split(/,/, $o_pattern)) { + open FILE, $file or die "Could not read from $file, program halting."; + # read the record, and chomp off the newline + chomp(my $pid = ); + close FILE; + if($pid=~/^\d+$/){ + push @pids,$pid; + } + } + + if($#pids>-1) { + my $lxs = Sys::Statistics::Linux::Processes->new(pids => \@pids); + $lxs->init; + sleep $o_sleep; + my $processes = $lxs->get; + my @pname = (); + + if(defined($processes)) { + $status = "OK"; + + my $crit = 0; #critical counter + my $warn = 0; #warning counter + foreach my $process (keys (%$processes)) { + my $vsize = $processes->{$process}->{vsize}; + my $nswap = $processes->{$process}->{nswap}; + my $cnswap = $processes->{$process}->{cnswap}; + my $cpu = $processes->{$process}->{cpu}; + my $cmd = $processes->{$process}->{cmd}; + $cmd =~s/\W+//g; + + if($vsize >= $o_critical) {$crit++; push @pname,$cmd;} + elsif($vsize >= $o_warning){ $warn++; push @pname,$cmd;} + + $perfdata .= "|" + .$cmd."_vsize=$vsize;$o_warning;$o_critical " + .$cmd."_nswap=$nswap " + .$cmd."_cnswap=$cnswap " + .$cmd."_cpu=$cpu"; + } + + if($crit>0) {$status="CRITICAL";} + elsif($warn>0) {$status="WARNING";} + + } + print "PROCESSES $status : ".join(',',@pname)." $perfdata"; + } +} + +sub check_socket { + my $lxs = Sys::Statistics::Linux->new(sockstats => 1); + $lxs->init; + sleep $o_sleep; + my $stat = $lxs->get; + + if(defined($stat->sockstats)) { + $status = "OK"; + my $socks = $stat->sockstats; + + if($socks->{used} >= $o_critical) { + $status = "CRITICAL"; + } + elsif($socks->{used} >= $o_warning) { + $status = "WARNING"; + } + + my $perfdata .= "|" + ."used=$socks->{used};$o_warning;$o_critical " + ."tcp=$socks->{tcp} " + ."udp=$socks->{udp} raw=$socks->{raw}"; + + print "SOCKET USAGE $status : used $socks->{used} $perfdata"; + } + else { + print "No data"; + } +} + +sub check_file { + my $lxs = Sys::Statistics::Linux->new(filestats => 1); + $lxs->init; + sleep $o_sleep; + my $stat = $lxs->get; + + if(defined($stat->filestats)) { + $status = "OK"; + my $file = $stat->filestats; + + my ($fh_crit,$inode_crit) = split(/,/,$o_critical); + my ($fh_warn,$inode_warn) = split(/,/,$o_warning); + + if(($file->{fhalloc}>=$fh_crit)||($file->{inalloc}>=$inode_crit)) { + $status = "CRITICAL"; + } + elsif(($file->{fhalloc}>=$fh_warn)||($file->{inalloc}>=$inode_warn)) { + $status = "WARNING"; + } + + my $perfdata .= "|" + ."fhalloc=$file->{fhalloc};$fh_warn;$fh_crit;$file->{fhmax} " + ."inalloc=$file->{inalloc};$inode_warn;$inode_crit;$file->{inmax} " + ."dentries=$file->{dentries}"; + + print "OPEN FILES $status allocated: $file->{fhalloc} (inodes: $file->{inalloc}) $perfdata"; + } + else { + print "No data"; + } +} + +sub check_mem { + my $lxs = Sys::Statistics::Linux->new(memstats => 1); + $lxs->init; + sleep $o_sleep; + my $stat = $lxs->get; + + if(defined($stat->memstats)) { + $status = "OK"; + + my ($mem_crit,$swap_crit) = split(/,/,$o_critical); + my ($mem_warn,$swap_warn) = split(/,/,$o_warning); + + my $mem = $stat->memstats; + my $memcached = sprintf("%.2f", ($mem->{cached}/$mem->{memtotal})*100)||0; + my $memused = sprintf("%.2f", (($mem->{memused} - $mem->{cached})/$mem->{memtotal})*100); + my $active = sprintf("%.2f", ($mem->{active}/$mem->{memtotal})*100)||0; + my $swapused = 0; + my $swapcached = 0; + if($mem->{swaptotal}>0) { + $swapused = sprintf("%.2f", ($mem->{swapused}/$mem->{swaptotal})*100); + $swapcached = sprintf("%.2f", ($mem->{swapcached}/$mem->{swaptotal})*100); + } + + if(($memused>=$mem_crit)||(($swapused>=$swap_crit) && ($swapused>0))) { + $status = "CRITICAL"; + } + elsif (($memused>=$mem_warn)||(($swapused>=$swap_warn) && ($swapused>0))) { + $status = "WARNING"; + } + + my $perfdata .= "|" + ."MemUsed=$memused%;$mem_warn;$mem_crit " + ."SwapUsed=$swapused%;$swap_warn;$swap_crit " + ."MemCached=$memcached% " + ."SwapCached=$swapcached% " + ."Active=$active%"; + + print "MEMORY $status : Mem used: $memused%, Swap used: $swapused% $perfdata"; + } + else { + print "No data"; + } +} + +sub check_disk { + my $lxs = Sys::Statistics::Linux->new(diskusage => 1); + $lxs->init; + sleep $o_sleep; + my $stat = $lxs->get; + my $return_str = ""; + my $perfdata = ""; + + if(defined($stat->diskusage)) { + $status = "OK"; + + my $disk = $stat->diskusage; + if(!defined($o_pattern)){ $o_pattern = 'all';} + + my $checkthis; + map {$checkthis->{$_}++} split(/,/, $o_pattern); + + my $crit = 0; #critical counter + my $warn = 0; #warning counter + foreach my $device (keys (%$disk)) { + my $usage = $disk->{$device}->{usage}; # KB + my $free = $disk->{$device}->{free}; # KB + my $total = $disk->{$device}->{total}; # KB + my $mountpoint = $disk->{$device}->{mountpoint}; + my $percentused = sprintf("%.2f", ($usage/$total)*100); + my $percentfree = sprintf("%.2f", ($free/$total)*100); + + if(defined($checkthis->{$mountpoint})||defined($checkthis->{all})){ + $return_str .= " $mountpoint $percentfree% free"; + + if($o_unit =~ /\%/) { + if($percentfree<=$o_critical){ $crit++;} + elsif($percentfree<=$o_warning){ $warn++;} + + $perfdata .= " $mountpoint=$usage".'KB'; + } + else { + # KB + my $tmpfree = $free; + my $tmpusage = $usage; + my $tmptotal = $total; + + if($o_unit =~ /MB/i) { + $tmpfree = sprintf("%.2f", ($free/1024)); + $tmpusage = sprintf("%.2f", ($usage/1024)); + $tmptotal = sprintf("%.2f", ($total/1024)); + } + elsif($o_unit =~ /GB/i) { + $tmpfree = sprintf("%.2f", ($free/1048576)); + $tmpusage = sprintf("%.2f", ($usage/1048576)); + $tmptotal = sprintf("%.2f", ($total/1048576)); + } + + if($tmpfree<=$o_warning){ $warn++;} + elsif($tmpfree<=$o_critical){ $crit++;} + + $perfdata .= " $mountpoint=$tmpusage$o_unit;;;0;$tmptotal"; + } + } + } + + if($crit>0) {$status="CRITICAL";} + elsif($warn>0) {$status="WARNING";} + } + print "DISK $status used : $return_str |$perfdata"; +} + +sub check_io { + my $lxs = Sys::Statistics::Linux->new(diskstats => 1); + $lxs->init; + sleep $o_sleep; + my $stat = $lxs->get; + my $perfdata = ""; + + if(defined($stat->diskstats)) { + $status = "OK"; + + my $disk = $stat->diskstats; + if(!defined($o_pattern)){ $o_pattern = 'all';} + + my $checkthis; + map {$checkthis->{$_}++} split(/,/, $o_pattern); + + my ($read_crit,$write_crit) = split(/,/,$o_critical); + my ($read_warn,$write_warn) = split(/,/,$o_warning); + + my $crit = 0; #critical counter + my $warn = 0; #warning counter + foreach my $device (keys (%$disk)) { + my $rdreq = $disk->{$device}->{rdreq}; + my $wrtreq = $disk->{$device}->{wrtreq}; + my $ttreq = $disk->{$device}->{ttreq}; + my $rdbyt = $disk->{$device}->{rdbyt}; + my $wrtbyt = $disk->{$device}->{wrtbyt}; + my $ttbyt = $disk->{$device}->{ttbyt}; + + if(defined($checkthis->{$device})||defined($checkthis->{all})){ + if($o_unit =~ /BYTES/i) { + if(($rdbyt>=$read_crit)||($wrtbyt>=$write_crit)){ $crit++;} + elsif(($rdbyt>=$read_warn)||($wrtbyt>=$write_warn)){ $warn++;} + + $perfdata .= "" + .$device."_read=$rdbyt;$read_warn;$read_crit " + .$device."_write=$wrtbyt;$write_warn;$write_crit"; + } + else { + if(($rdreq>=$read_crit)||($wrtreq>=$write_crit)){ $crit++;} + elsif(($rdreq>=$read_warn)||($wrtreq>=$write_warn)){ $warn++;} + + $perfdata .= "" + .$device."_read=$rdreq;$read_warn;$read_crit " + .$device."_write=$wrtreq;$write_warn;$write_crit"; + } + } + } + if($crit>0) {$status="CRITICAL";} + elsif($warn>0) {$status="WARNING";} + + print "DISK IO $status |$perfdata"; + } + else { + print "No data"; + } + +} + +sub check_net { + my $lxs = Sys::Statistics::Linux->new(netstats => 1); + $lxs->init; + sleep $o_sleep; + my $stat = $lxs->get; + + my $return_str = ""; + my $perfdata = ""; + if(defined($stat->netstats)) { + $status = "OK"; + my $net = $stat->netstats; + if(!defined($o_pattern)){ $o_pattern = 'all';} + + my $checkthis; + map {$checkthis->{$_}++} split(/,/, $o_pattern); + + my $crit = 0; #critical counter + my $warn = 0; #warning counter + foreach my $device (keys (%$net)) { + my $txbyt = $net->{$device}->{txbyt}; + my $rxerrs = $net->{$device}->{rxerrs}; + my $ttbyt = $net->{$device}->{ttbyt}; + my $txerrs = $net->{$device}->{txerrs}; + my $txdrop = $net->{$device}->{txdrop}; + my $txcolls = $net->{$device}->{txcolls}; + my $rxbyt = $net->{$device}->{rxbyt}; + my $rxdrop = $net->{$device}->{rxdrop}; + + if(defined($checkthis->{$device})||defined($checkthis->{all})){ + if($ttbyt>=$o_critical){ $crit++;} + elsif($ttbyt>=$o_warning){ $warn++;} + + $return_str .= $device.":".bytes_to_readable($ttbyt)." "; + + $perfdata .= "|" + .$device."_txbyt=".$txbyt."B " + .$device."_txerrs=".$txerrs."B " + .$device."_rxbyt=".$rxbyt."B " + .$device."_rxerrs=".$rxerrs."B"; + } + } + + if($crit>0) {$status="CRITICAL";} + elsif($warn>0) {$status="WARNING";} + + print "NET USAGE $status $return_str $perfdata"; + } +} + +sub check_load { + my $lxs = Sys::Statistics::Linux->new(loadavg => 1); + $lxs->init; + sleep $o_sleep; + my $stat = $lxs->get; + + if(defined($stat->loadavg)) { + $status = "OK"; + my $load = $stat->loadavg; + my ($warn_1,$warn_5,$warn_15) = split(/,/,$o_warning); + my ($crit_1,$crit_5,$crit_15) = split(/,/,$o_critical); + + if(($load->{avg_1}>=$crit_1)||($load->{avg_5}>=$crit_5)||($load->{avg_15}>=$crit_15)) { + $status = "CRITICAL"; + } + elsif(($load->{avg_1}>=$warn_1)||($load->{avg_5}>=$warn_5)||($load->{avg_15}>=$warn_15)) { + $status = "WARNING"; + } + + my $perfdata = "|" + ."load1=$load->{avg_1};$warn_1;$crit_1;0 " + ."load5=$load->{avg_5};$warn_5;$crit_5;0 " + ."load15=$load->{avg_15};$warn_15;$crit_15;0"; + + print "LOAD AVERAGE $status : $load->{avg_1},$load->{avg_5},$load->{avg_15} $perfdata"; + } + else { + print "No data"; + } +} + +sub check_paging { + my $lxs = Sys::Statistics::Linux->new(pgswstats => 1); + $lxs->init; + sleep $o_sleep; + my $stat = $lxs->get; + if(defined($stat->pgswstats)) { + $status = "OK"; + my $page = $stat->pgswstats; + + my ($warn_in,$warn_out,$warn_flt) = split(/,/,$o_warning); + my ($crit_in,$crit_out,$crit_flt) = split(/,/,$o_critical); + if((($page->{pgpgin}>=$crit_in)&&($page->{pgpgout}>=$crit_out))||($page->{pgmajfault}>=$crit_flt)) { + $status = "CRITICAL"; + } + elsif((($page->{pgpgin}>=$warn_in)&&($page->{pgpgout}>=$warn_out))||($page->{pgmajfault}>=$warn_flt)) { + $status = "WARNING"; + } + + my $perfdata = "|" + ."pgpgin=$page->{pgpgin};$warn_in;$crit_in;0 " + ."pgpgout=$page->{pgpgout};$warn_out;$crit_out;0 " + ."pgmajfault=$page->{pgmajfault};$warn_flt;$crit_flt;0 " + ."pswpin=$page->{pswpin} pswpout=$page->{pswpout}"; + + print "Paging $status : in:$page->{pgpgin},out:$page->{pgpgout},flt:$page->{pgmajfault} $perfdata"; + } + else { + print "No data"; + } +} + +sub check_uptime { + # Read the uptime in seconds from /proc/uptime + open FILE, "< /proc/uptime" or return ("Cannot open /proc/uptime: $!"); + my ($uptime, undef) = split / /, ; + close FILE; + + if(defined($uptime)) { + $status = "OK"; + my $days = int($uptime / 86400); + my $seconds = $uptime % 86400; + my $hours = int($seconds / 3600); + $seconds = $seconds % 3600; + my $minutes = int($seconds / 60); + $seconds = $seconds % 60; + + $status = "WARNING" if($o_warning && (int($uptime/60))<=$o_warning); + + print "$status : up $days days, " + .sprintf("%02d", $hours).":" + .sprintf("%02d", $minutes).":" + .sprintf("%02d", $seconds) + ." |uptime=".int($uptime); + } + else { + print "No data"; + } +} + +sub usage { + print "Usage: $0 -C|-P|-M|-N|-D|-I|-L|-F|-S|-W|-U -p -w -c [-s ] [-u ] [-V] [-h]\n"; +} + + +sub version { + print "$script_name v$script_version\n"; +} + + +sub help { + version(); + usage(); + + print < \$o_help, 'help' => \$o_help, + 's:i' => \$o_sleep, 'sleep:i' => \$o_sleep, + 'C' => \$o_cpu, 'cpu' => \$o_cpu, + 'X' => \$o_context, 'ctx' => \$o_context, + 'P' => \$o_procs, 'procs' => \$o_procs, + 'T' => \$o_process, 'top' => \$o_process, + 'M' => \$o_mem, 'memory' => \$o_mem, + 'N' => \$o_net, 'network' => \$o_net, + 'D' => \$o_disk, 'disk' => \$o_disk, + 'I' => \$o_io, 'io' => \$o_io, + 'L' => \$o_load, 'load' => \$o_load, + 'F' => \$o_file, 'file' => \$o_file, + 'S' => \$o_socket, 'socket' => \$o_socket, + 'W' => \$o_paging, 'paging' => \$o_paging, + 'U' => \$o_uptime, 'uptime' => \$o_uptime, + 'V' => \$o_version, 'version' => \$o_version, + 'p:s' => \$o_pattern, 'pattern:s' => \$o_pattern, + 'w:s' => \$o_warning, 'warning:s' => \$o_warning, + 'c:s' => \$o_critical, 'critical:s' => \$o_critical, + 'u:s' => \$o_unit, 'unit:s' => \$o_unit + ); + + if(defined($o_help)) { + help(); + exit $ERRORS{'UNKNOWN'}; + } + + if(defined($o_version)) { + version(); + exit $ERRORS{'UNKNOWN'}; + } +} + +sub bytes_to_readable { + my ($bignum) = @_; + + foreach my $unit ("B","KB","MB","GB") { + return sprintf("%.2f",$bignum)."$unit" if $bignum < 1024; + $bignum /= 1024; + } +} + +sub bytes_to_kilobytes { + my ($bignum) = @_; + + return sprintf("%.2f", $bignum/1024); +} + +sub bytes_to_megabytes { + my ($bignum) = @_; + + return sprintf("%.2f", $bignum/1048576); +} + +sub bytes_to_gigabytes { + my ($bignum) = @_; + + return sprintf("%.2f", $bignum/1073741824); +} + diff --git a/check_linux_stats.pl b/check_linux_stats.pl deleted file mode 100644 index 748cf48..0000000 --- a/check_linux_stats.pl +++ /dev/null @@ -1,688 +0,0 @@ -#!/usr/bin/perl -# ---------------------------------------------------- # -# File : check_linux_stats -# Author : Damien SIAUD -# Date : 07/12/2009 -# Rev. Date : 07/05/2010 -# ---------------------------------------------------- # -# This script require Sys::Statistics::Linux -# -# Plugin check for nagios -# -# License Information: -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# ---------------------------------------------------- # - -use FindBin; -use lib $FindBin::Bin; -#use lib "/usr/local/nagios/libexec"; -use utils qw($TIMEOUT %ERRORS &print_revision &support); -use Getopt::Long; -use Sys::Statistics::Linux; -use Sys::Statistics::Linux::Processes; -use Sys::Statistics::Linux::SysInfo; -#use Data::Dumper; - -use vars qw($script_name $script_version $o_sleep $o_pattern $o_cpu $o_procs $o_process $o_mem $o_net $o_disk $o_io $o_load $o_file $o_socket $o_paging $o_uptime $o_help $o_version $o_warning $o_critical $o_unit); -use strict; - -# --------------------------- globals -------------------------- # - -$script_name = "check_linux_stats"; -$script_version = "1.3.1"; -$o_help = undef; -$o_pattern = undef; -$o_version = undef; -$o_warning = 0; -$o_critical = 0; -$o_sleep = 1; -$o_unit = "MB"; -my $status = 'UNKNOWN'; - -# ---------------------------- main ----------------------------- # -check_options(); - -if($o_cpu){ - check_cpu(); -} -elsif($o_mem){ - check_mem(); -} -elsif($o_disk){ - check_disk(); -} -elsif($o_io){ - check_io(); -} -elsif($o_net){ - check_net(); -} -elsif($o_load){ - check_load(); -} -elsif($o_file){ - check_file(); -} -elsif($o_procs){ - check_procs(); -} -elsif($o_socket){ - check_socket(); -} -elsif($o_process){ - check_process(); -} -elsif($o_paging){ - check_paging(); -} -elsif($o_uptime){ - check_uptime(); -} -else { - help(); -} - -print "\n"; - -exit $ERRORS{$status}; - - -sub check_cpu { - my $lxs = Sys::Statistics::Linux->new(cpustats => 1); - $lxs->init; - sleep $o_sleep; - my $stat = $lxs->get; - - if(defined($stat->cpustats)) { - $status = "OK"; - my $cpu = $stat->cpustats->{cpu}; - my $cpu_used=sprintf("%.2f", (100-$cpu->{idle})); - - if ($cpu_used >= $o_critical) { - $status = "CRITICAL"; - } - elsif ($cpu_used >= $o_warning) { - $status = "WARNING"; - } - - my $perfdata .= "|" - ."user=$cpu->{user}% " - ."system=$cpu->{system}% " - ."iowait=$cpu->{iowait}% " - ."idle=$cpu->{idle}%;$o_warning;$o_critical"; - - print "CPU $status : idle $cpu->{idle}% $perfdata"; - } - else { - print "No data"; - } -} - -sub check_procs { - my $lxs = Sys::Statistics::Linux->new(procstats => 1); - $lxs->init; - sleep $o_sleep; - my $stat = $lxs->get; - - if(defined($stat->procstats)) { - $status = "OK"; - my $procs = $stat->procstats; - - if($procs->{count} >= $o_critical) { - $status = "CRITICAL"; - } - elsif ($procs->{count} >= $o_warning) { - $status = "WARNING"; - } - - my $perfdata .= "|" - ."count=$procs->{count};$o_warning;$o_critical " - ."runqueue=$procs->{runqueue} " - ."blocked=$procs->{blocked} " - ."running=$procs->{running} " - ."new=$procs->{new}"; - print "PROCS $status : count $procs->{count} $perfdata"; - } -} - - -sub check_process { - my $return_str = ""; - my $perfdata = ""; - # pidfiles - my @pids = (); - for my $file (split(/,/, $o_pattern)) { - open FILE, $file or die "Could not read from $file, program halting."; - # read the record, and chomp off the newline - chomp(my $pid = ); - close FILE; - if($pid=~/^\d+$/){ - push @pids,$pid; - } - } - - if($#pids>-1) { - my $lxs = Sys::Statistics::Linux::Processes->new(pids => \@pids); - $lxs->init; - sleep $o_sleep; - my $processes = $lxs->get; - my @pname = (); - - if(defined($processes)) { - $status = "OK"; - - my $crit = 0; #critical counter - my $warn = 0; #warning counter - foreach my $process (keys (%$processes)) { - my $vsize = $processes->{$process}->{vsize}; - my $nswap = $processes->{$process}->{nswap}; - my $cnswap = $processes->{$process}->{cnswap}; - my $cpu = $processes->{$process}->{cpu}; - my $cmd = $processes->{$process}->{cmd}; - $cmd =~s/\W+//g; - - if($vsize >= $o_critical) {$crit++; push @pname,$cmd;} - elsif($vsize >= $o_warning){ $warn++; push @pname,$cmd;} - - $perfdata .= "|" - .$cmd."_vsize=$vsize;$o_warning;$o_critical " - .$cmd."_nswap=$nswap " - .$cmd."_cnswap=$cnswap " - .$cmd."_cpu=$cpu"; - } - - if($crit>0) {$status="CRITICAL";} - elsif($warn>0) {$status="WARNING";} - - } - print "PROCESSES $status : ".join(',',@pname)." $perfdata"; - } -} - -sub check_socket { - my $lxs = Sys::Statistics::Linux->new(sockstats => 1); - $lxs->init; - sleep $o_sleep; - my $stat = $lxs->get; - - if(defined($stat->sockstats)) { - $status = "OK"; - my $socks = $stat->sockstats; - - if($socks->{used} >= $o_critical) { - $status = "CRITICAL"; - } - elsif($socks->{used} >= $o_warning) { - $status = "WARNING"; - } - - my $perfdata .= "|" - ."used=$socks->{used};$o_warning;$o_critical " - ."tcp=$socks->{tcp} " - ."udp=$socks->{udp} raw=$socks->{raw}"; - - print "SOCKET USAGE $status : used $socks->{used} $perfdata"; - } - else { - print "No data"; - } -} - -sub check_file { - my $lxs = Sys::Statistics::Linux->new(filestats => 1); - $lxs->init; - sleep $o_sleep; - my $stat = $lxs->get; - - if(defined($stat->filestats)) { - $status = "OK"; - my $file = $stat->filestats; - - my ($fh_crit,$inode_crit) = split(/,/,$o_critical); - my ($fh_warn,$inode_warn) = split(/,/,$o_warning); - - if(($file->{fhalloc}>=$fh_crit)||($file->{inalloc}>=$inode_crit)) { - $status = "CRITICAL"; - } - elsif(($file->{fhalloc}>=$fh_warn)||($file->{inalloc}>=$inode_warn)) { - $status = "WARNING"; - } - - my $perfdata .= "|" - ."fhalloc=$file->{fhalloc};$fh_warn;$fh_crit;$file->{fhmax} " - ."inalloc=$file->{inalloc};$inode_warn;$inode_crit;$file->{inmax} " - ."dentries=$file->{dentries}"; - - print "OPEN FILES $status allocated: $file->{fhalloc} (inodes: $file->{inalloc}) $perfdata"; - } - else { - print "No data"; - } -} - -sub check_mem { - my $lxs = Sys::Statistics::Linux->new(memstats => 1); - $lxs->init; - sleep $o_sleep; - my $stat = $lxs->get; - - if(defined($stat->memstats)) { - $status = "OK"; - - my ($mem_crit,$swap_crit) = split(/,/,$o_critical); - my ($mem_warn,$swap_warn) = split(/,/,$o_warning); - - my $mem = $stat->memstats; - my $memused = sprintf("%.2f", ($mem->{memused}/$mem->{memtotal})*100); - my $memcached = sprintf("%.2f", ($mem->{cached}/$mem->{memtotal})*100); - my $swapused = sprintf("%.2f", ($mem->{swapused}/$mem->{swaptotal})*100); - my $swapcached = sprintf("%.2f", ($mem->{swapcached}/$mem->{swaptotal})*100); - my $active = sprintf("%.2f", ($mem->{active}/$mem->{memtotal})*100); - - if(($memused>=$mem_crit)||($swapused>=$swap_crit)) { - $status = "CRITICAL"; - } - elsif (($memused>=$mem_warn)||($swapused>=$swap_warn)) { - $status = "WARNING"; - } - - my $perfdata .= "|" - ."MemUsed=$memused%;$mem_warn;$mem_crit " - ."SwapUsed=$swapused;$swap_warn;$swap_crit " - ."MemCached=$memcached SwapCached=$swapcached " - ."Active=$active"; - - print "MEMORY $status : Mem used: $memused%, Swap used: $swapused% $perfdata"; - } - else { - print "No data"; - } -} - -sub check_disk { - my $lxs = Sys::Statistics::Linux->new(diskusage => 1); - $lxs->init; - sleep $o_sleep; - my $stat = $lxs->get; - my $return_str = ""; - my $perfdata = ""; - - if(defined($stat->diskusage)) { - $status = "OK"; - - my $disk = $stat->diskusage; - if(!defined($o_pattern)){ $o_pattern = 'all';} - - my $checkthis; - map {$checkthis->{$_}++} split(/,/, $o_pattern); - - my $crit = 0; #critical counter - my $warn = 0; #warning counter - foreach my $device (keys (%$disk)) { - my $usage = $disk->{$device}->{usage}; # KB - my $free = $disk->{$device}->{free}; # KB - my $total = $disk->{$device}->{total}; # KB - my $mountpoint = $disk->{$device}->{mountpoint}; - my $percentused = sprintf("%.2f", ($usage/$total)*100); - my $percentfree = sprintf("%.2f", ($free/$total)*100); - - if(defined($checkthis->{$mountpoint})||defined($checkthis->{all})){ - $return_str .= " $mountpoint $percentfree% free"; - - if($o_unit =~ /\%/) { - if($percentfree<=$o_critical){ $crit++;} - elsif($percentfree<=$o_warning){ $warn++;} - - $perfdata .= " $mountpoint=$usage".'KB'; - } - else { - # KB - my $tmpfree = $free; - my $tmpusage = $usage; - my $tmptotal = $total; - - if($o_unit =~ /MB/i) { - $tmpfree = sprintf("%.2f", ($free/1024)); - $tmpusage = sprintf("%.2f", ($usage/1024)); - $tmptotal = sprintf("%.2f", ($total/1024)); - } - elsif($o_unit =~ /GB/i) { - $tmpfree = sprintf("%.2f", ($free/1048576)); - $tmpusage = sprintf("%.2f", ($usage/1048576)); - $tmptotal = sprintf("%.2f", ($total/1048576)); - } - - if($tmpfree<=$o_warning){ $warn++;} - elsif($tmpfree<=$o_critical){ $crit++;} - - $perfdata .= " $mountpoint=$usage$o_unit"; - } - } - } - - if($crit>0) {$status="CRITICAL";} - elsif($warn>0) {$status="WARNING";} - } - print "DISK $status used : $return_str |$perfdata"; -} - -sub check_io { - my $lxs = Sys::Statistics::Linux->new(diskstats => 1); - $lxs->init; - sleep $o_sleep; - my $stat = $lxs->get; - my $return_str = "io :"; - my $perfdata = ""; - - if(defined($stat->diskstats)) { - $status = "OK"; - - my $disk = $stat->diskstats; - if(!defined($o_pattern)){ $o_pattern = 'all';} - - my $checkthis; - map {$checkthis->{$_}++} split(/,/, $o_pattern); - - my ($read_crit,$write_crit) = split(/,/,$o_critical); - my ($read_warn,$write_warn) = split(/,/,$o_warning); - - my $crit = 0; #critical counter - my $warn = 0; #warning counter - foreach my $device (keys (%$disk)) { - my $rdreq = $disk->{$device}->{rdreq}; - my $wrtreq = $disk->{$device}->{wrtreq}; - my $ttreq = $disk->{$device}->{ttreq}; - my $rdbyt = $disk->{$device}->{rdbyt}; - my $wrtbyt = $disk->{$device}->{wrtbyt}; - my $ttbyt = $disk->{$device}->{ttbyt}; - - if(defined($checkthis->{$device})||defined($checkthis->{all})){ - if($o_unit =~ /BYTES/i) { - if(($rdbyt>=$read_crit)||($wrtbyt>=$write_crit)){ $crit++;} - elsif(($rdbyt>=$read_warn)||($wrtbyt>=$write_warn)){ $warn++;} - - $perfdata .= "|" - .$device."_read=$rdbyt;$read_warn;$read_crit " - .$device."_write=$wrtbyt;$write_warn;$write_crit"; - } - else { - if(($rdreq>=$read_crit)||($wrtreq>=$write_crit)){ $crit++;} - elsif(($rdreq>=$read_warn)||($wrtreq>=$write_warn)){ $warn++;} - - $perfdata .= "|" - .$device."_read=$rdreq;$read_warn;$read_crit " - .$device."_write=$wrtreq;$write_warn;$write_crit"; - } - } - } - if($crit>0) {$status="CRITICAL";} - elsif($warn>0) {$status="WARNING";} - - print "DISK $status $return_str $perfdata"; - } -} - -sub check_net { - my $lxs = Sys::Statistics::Linux->new(netstats => 1); - $lxs->init; - sleep $o_sleep; - my $stat = $lxs->get; - - my $return_str = ""; - my $perfdata = ""; - if(defined($stat->netstats)) { - $status = "OK"; - my $net = $stat->netstats; - if(!defined($o_pattern)){ $o_pattern = 'all';} - - my $checkthis; - map {$checkthis->{$_}++} split(/,/, $o_pattern); - - my $crit = 0; #critical counter - my $warn = 0; #warning counter - foreach my $device (keys (%$net)) { - my $txbyt = $net->{$device}->{txbyt}; - my $rxerrs = $net->{$device}->{rxerrs}; - my $ttbyt = $net->{$device}->{ttbyt}; - my $txerrs = $net->{$device}->{txerrs}; - my $txdrop = $net->{$device}->{txdrop}; - my $txcolls = $net->{$device}->{txcolls}; - my $rxbyt = $net->{$device}->{rxbyt}; - my $rxdrop = $net->{$device}->{rxdrop}; - - if(defined($checkthis->{$device})||defined($checkthis->{all})){ - if($ttbyt>=$o_critical){ $crit++;} - elsif($ttbyt>=$o_warning){ $warn++;} - - $return_str .= $device.":".bytes_to_readable($ttbyt)." "; - - $perfdata .= "|" - .$device."_txbyt=".$txbyt."B " - .$device."_txerrs=".$txerrs."B " - .$device."_rxbyt=".$rxbyt."B " - .$device."_rxerrs=".$rxerrs."B"; - } - } - - if($crit>0) {$status="CRITICAL";} - elsif($warn>0) {$status="WARNING";} - - print "NET USAGE $status $return_str $perfdata"; - } -} - -sub check_load { - my $lxs = Sys::Statistics::Linux->new(loadavg => 1); - $lxs->init; - sleep $o_sleep; - my $stat = $lxs->get; - - if(defined($stat->loadavg)) { - $status = "OK"; - my $load = $stat->loadavg; - my ($warn_1,$warn_5,$warn_15) = split(/,/,$o_warning); - my ($crit_1,$crit_5,$crit_15) = split(/,/,$o_critical); - - if(($load->{avg_1}>=$crit_1)||($load->{avg_5}>=$crit_5)||($load->{avg_15}>=$crit_15)) { - $status = "CRITICAL"; - } - elsif(($load->{avg_1}>=$warn_1)||($load->{avg_5}>=$warn_5)||($load->{avg_15}>=$warn_15)) { - $status = "WARNING"; - } - - my $perfdata = "|" - ."load1=$load->{avg_1};$warn_1;$crit_1;0 " - ."load5=$load->{avg_5};$warn_5;$crit_5;0 " - ."load15=$load->{avg_15};$warn_15;$crit_15;0"; - - print "LOAD AVERAGE $status : $load->{avg_1},$load->{avg_5},$load->{avg_15} $perfdata"; - } - else { - print "No data"; - } -} - -sub check_paging { - my $lxs = Sys::Statistics::Linux->new(pgswstats => 1); - $lxs->init; - sleep $o_sleep; - my $stat = $lxs->get; - if(defined($stat->pgswstats)) { - $status = "OK"; - my $page = $stat->pgswstats; - my ($warn_in,$warn_out) = split(/,/,$o_warning); - my ($crit_in,$crit_out) = split(/,/,$o_critical); - if(($page->{pgpgin}>=$crit_in)||($page->{pgpgout}>=$crit_out)) { - $status = "CRITICAL"; - } - elsif(($page->{pgpgin}>=$warn_in)||($page->{pgpgout}>=$warn_out)) { - $status = "WARNING"; - } - - my $perfdata = "|" - ."pgpgin=$page->{pgpgin};$warn_in;$crit_in;0 " - ."pgpgout=$page->{pgpgout};$warn_out;$crit_out;0 " - ."pswpin=$page->{pswpin} pswpout=$page->{pswpout}"; - - print "Paging $status : in:$page->{pgpgin},out:$page->{pgpgout} $perfdata"; - } - else { - print "No data"; - } -} - -sub check_uptime { - # Read the uptime in seconds from /proc/uptime - open FILE, "< /proc/uptime" or return ("Cannot open /proc/uptime: $!"); - my ($uptime, undef) = split / /, ; - close FILE; - - if(defined($uptime)) { - $status = "OK"; - my $days = int($uptime / 86400); - my $seconds = $uptime % 86400; - my $hours = int($seconds / 3600); - $seconds = $seconds % 3600; - my $minutes = int($seconds / 60); - $seconds = $seconds % 60; - - $status = "WARNING" if($o_warning && (int($uptime/60))<=$o_warning); - - print "$status : up $days days, " - .sprintf("%02d", $hours).":" - .sprintf("%02d", $minutes).":" - .sprintf("%02d", $seconds) - ." |uptime=".int($uptime); - } - else { - print "No data"; - } -} - -sub usage { - print "Usage: $0 -C|-P|-M|-N|-D|-I|-L|-F|-S|-W|-U -p -w -c [-s ] [-u ] [-V] [-h]\n"; -} - - -sub version { - print "$script_name v$script_version\n"; -} - - -sub help { - version(); - usage(); - - print < \$o_help, 'help' => \$o_help, - 's:i' => \$o_sleep, 'sleep:i' => \$o_sleep, - 'C' => \$o_cpu, 'cpu' => \$o_cpu, - 'P' => \$o_procs, 'procs' => \$o_procs, - 'T' => \$o_process, 'top' => \$o_process, - 'M' => \$o_mem, 'memory' => \$o_mem, - 'N' => \$o_net, 'network' => \$o_net, - 'D' => \$o_disk, 'disk' => \$o_disk, - 'I' => \$o_io, 'io' => \$o_io, - 'L' => \$o_load, 'load' => \$o_load, - 'F' => \$o_file, 'file' => \$o_file, - 'S' => \$o_socket, 'socket' => \$o_socket, - 'W' => \$o_paging, 'paging' => \$o_paging, - 'U' => \$o_uptime, 'uptime' => \$o_uptime, - 'V' => \$o_version, 'version' => \$o_version, - 'p:s' => \$o_pattern, 'pattern:s' => \$o_pattern, - 'w:s' => \$o_warning, 'warning:s' => \$o_warning, - 'c:s' => \$o_critical, 'critical:s' => \$o_critical, - 'u:s' => \$o_unit, 'unit:s' => \$o_unit - ); - - if(defined($o_help)) { - help(); - exit $ERRORS{'UNKNOWN'}; - } - - if(defined($o_version)) { - version(); - exit $ERRORS{'UNKNOWN'}; - } -} - -sub bytes_to_readable { - my ($bignum) = @_; - - foreach my $unit ("B","KB","MB","GB") { - return sprintf("%.2f",$bignum)."$unit" if $bignum < 1024; - $bignum /= 1024; - } -} - -sub bytes_to_kilobytes { - my ($bignum) = @_; - - return sprintf("%.2f", $bignum/1024); -} - -sub bytes_to_megabytes { - my ($bignum) = @_; - - return sprintf("%.2f", $bignum/1048576); -} - -sub bytes_to_gigabytes { - my ($bignum) = @_; - - return sprintf("%.2f", $bignum/1073741824); -} - diff --git a/nagios-plugins-linux_stats.spec b/nagios-plugins-linux_stats.spec index 2c66104..c5903af 100644 --- a/nagios-plugins-linux_stats.spec +++ b/nagios-plugins-linux_stats.spec @@ -1,13 +1,14 @@ Name: nagios-plugins-linux_stats -Version: 1.3 -Release: 3mamba +Version: 1.5 +Release: 1mamba Summary: Check the time the server is running Group: Network/Monitoring Vendor: openmamba Distribution: openmamba -Packager: Davide Madrisan -URL: https://exchange.nagios.org/directory/Plugins/Operating-Systems/Linux/check_linux_stats/details -Source0: check_linux_stats.pl +Packager: Silvan Calarco +URL: https://exchange.nagios.org/directory/plugins/operating-systems/linux/check_linux_stats/details/ +# NOTE: versioned upstream download not available, manually renamed +Source0: https://exchange.nagios.org/wp-content/uploads/project-files/2011/04/check_linux_stats.pl/check_linux_stats-%{version}.pl License: GPL ## AUTOBUILDREQ-BEGIN BuildRequires: libperl @@ -15,8 +16,7 @@ BuildRequires: perl(utils) BuildRequires: perl-Sys-Statistics-Linux BuildRequires: perl-devel ## AUTOBUILDREQ-END -Requires: nagios-nrpe -Requires: perl-Sys-Statistics-Linux +Recommends: nagios-nrpe %description This nagios plugins checks the linux system performance (cpu, mem, load, disk usage, disk io, network usage, open files and processes). @@ -38,6 +38,9 @@ install -p -m 0755 %{S:0} %{buildroot}%{_libdir}/nagios/plugins/check_linux_stat %{_libdir}/nagios/plugins/check_linux_stats.pl %changelog +* Sat Dec 13 2025 Silvan Calarco 1.5-1mamba +- update to 1.5 + * Wed Jul 23 2025 Automatic Build System 1.3-3mamba - automatic rebuild by autodist