diff --git a/check_pf_mem b/check_pf_mem new file mode 100644 index 0000000..3658114 --- /dev/null +++ b/check_pf_mem @@ -0,0 +1,175 @@ +#!/usr/local/bin/perl +# $Id: check_mem.pl,v 1.1.1.1 2007/11/13 05:25:13 hmann Exp $ + +# check_mem.pl Copyright (C) 2000 Dan Larsson +# +# 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 2 +# 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 (or with Nagios); if not, write to the +# Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA + +# Tell Perl what we need to use +use strict; +use warnings; +use Getopt::Std; + +use vars qw($opt_c $opt_f $opt_u $opt_w + $free_memory $used_memory $total_memory + $crit_level $warn_level + %exit_codes @memlist + $percent $fmt_pct + $verb_err $sysctl $sysctl_output); + +# Predefined exit codes for Nagios +%exit_codes = ('UNKNOWN' ,-1, + 'OK' , 0, + 'WARNING' , 1, + 'CRITICAL', 2,); + +# Turn this to 1 to see reason for parameter errors (if any) +$verb_err = 0; + +# query the system through the generic sysctl(8) interface +# (this does not require special priviledges) +$sysctl = {}; +$sysctl_output = `/sbin/sysctl -a`; + +foreach my $line (split(/\n/, $sysctl_output)) { + if ($line =~ m/^([^:]+):\s+(.+)\s*$/s) { + $sysctl->{$1} = $2; + } +} + +my $mem_active = $sysctl->{"vm.stats.vm.v_active_count"} * $sysctl->{"hw.pagesize"}; +my $mem_inactive = $sysctl->{"vm.stats.vm.v_inactive_count"} * $sysctl->{"hw.pagesize"}; +my $mem_cache = $sysctl->{"vm.stats.vm.v_cache_count"} * $sysctl->{"hw.pagesize"}; +my $mem_free = $sysctl->{"vm.stats.vm.v_free_count"} * $sysctl->{"hw.pagesize"}; + +# Define the calculating scalars +$free_memory = $mem_inactive + $mem_cache + $mem_free; +$total_memory = &mem_rounded($sysctl->{"hw.physmem"}); +$used_memory = $total_memory - $free_memory; + +# Get the options +if ($#ARGV le 0) +{ + &usage; +} +else +{ + getopts('c:fuw:'); +} + +# Shortcircuit the switches +if (!$opt_w or $opt_w == 0 or !$opt_c or $opt_c == 0) +{ + print "*** You must define WARN and CRITICAL levels!" if ($verb_err); + &usage; +} +elsif (!$opt_f and !$opt_u) +{ + $opt_u = 1; +# print "*** You must select to monitor either USED or FREE memory!" if ($verb_err); +# &usage; +} + +# Check if levels are sane +if ($opt_w <= $opt_c and $opt_f) +{ + print "*** WARN level must not be less than CRITICAL when checking FREE memory!" if ($verb_err); + &usage; +} +elsif ($opt_w >= $opt_c and $opt_u) +{ + print "*** WARN level must not be greater than CRITICAL when checking USED memory!" if ($verb_err); + &usage; +} + +$warn_level = $opt_w; +$crit_level = $opt_c; + +if ($opt_f) +{ + $percent = $free_memory / $total_memory * 100; + $fmt_pct = sprintf "%.1f", $percent; + if ($percent <= $crit_level) + { + print "Memory CRITICAL - $fmt_pct% ($free_memory kB) free |pct=$fmt_pct\n"; + exit $exit_codes{'CRITICAL'}; + } + elsif ($percent <= $warn_level) + { + print "Memory WARNING - $fmt_pct% ($free_memory kB) free |pct=$fmt_pct\n"; + exit $exit_codes{'WARNING'}; + } + else + { + print "Memory OK - $fmt_pct% ($free_memory kB) free |pct=$fmt_pct\n"; + exit $exit_codes{'OK'}; + } +} +elsif ($opt_u) +{ + $percent = $used_memory / $total_memory * 100; + $fmt_pct = sprintf "%.1f", $percent; + if ($percent >= $crit_level) + { + print "Memory CRITICAL - $fmt_pct% ($used_memory kB) used |pct=$fmt_pct\n"; + exit $exit_codes{'CRITICAL'}; + } + elsif ($percent >= $warn_level) + { + print "Memory WARNING - $fmt_pct% ($used_memory kB) used |pct=$fmt_pct\n"; + exit $exit_codes{'WARNING'}; + } + else + { + print "Memory OK - $fmt_pct% ($used_memory kB) used |pct=$fmt_pct\n"; + exit $exit_codes{'OK'}; + } +} + +# round the physical memory size to the next power of two which is +# reasonable for memory cards. We do this by first determining the +# guessed memory card size under the assumption that usual computer +# hardware has an average of a maximally eight memory cards installed +# and those are usually of equal size. +sub mem_rounded { + my ($mem_size) = @_; + my $chip_size = 1; + my $chip_guess = ($mem_size / 8) - 1; + while ($chip_guess != 0) { + $chip_guess >>= 1; + $chip_size <<= 1; + } + my $mem_round = (int($mem_size / $chip_size) + 1) * $chip_size; + return $mem_round; +} + +# Show usage +sub usage() +{ + print "\ncheck_mem.pl v1.0 - Nagios Plugin\n\n"; + print "usage:\n"; + print " check_mem.pl - -w -c \n\n"; + print "options:\n"; + print " -f Check FREE memory\n"; + print " -u Check USED memory\n"; + print " -w PERCENT Percent free/used when to warn\n"; + print " -c PERCENT Percent free/used when critical\n"; + print "\nCopyright (C) 2000 Dan Larsson \n"; + print "check_mem.pl comes with absolutely NO WARRANTY either implied or explicit\n"; + print "This program is licensed under the terms of the\n"; + print "GNU General Public License (check source code for details)\n"; + exit $exit_codes{'UNKNOWN'}; +}