1#!/usr/bin/env perl -w
2# $Id: check_mem.pl 2 2002-02-28 06:42:51Z egalstad $
3
4# check_mem.pl Copyright (C) 2000 Dan Larsson <dl@tyfon.net>
5#
6# This program is free software; you can redistribute it and/or
7# modify it under the terms of the GNU General Public License
8# as published by the Free Software Foundation; either version 2
9# of the License, or (at your option) any later version.
10#
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty
13# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14# GNU General Public License for more details.
15#
16# you should have received a copy of the GNU General Public License
17# along with this program (or with Nagios);  if not, write to the
18# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19# Boston, MA 02111-1307, USA
20
21## no critic   # added by M.S.
22
23# Tell Perl what we need to use
24use strict;
25use Getopt::Std;
26
27use vars qw($opt_c $opt_f $opt_u $opt_w
28            $free_memory $used_memory $total_memory
29            $crit_level $warn_level
30            %exit_codes @memlist
31            $percent $fmt_pct
32            $verb_err $command_line);
33
34# Predefined exit codes for Nagios
35%exit_codes   = ('UNKNOWN' ,-1,
36                 'OK'      , 0,
37                 'WARNING' , 1,
38                 'CRITICAL', 2,);
39
40# Turn this to 1 to see reason for parameter errors (if any)
41$verb_err     = 0;
42
43# This the unix command string that brings Perl the data
44$command_line = `vmstat | tail -1 | awk '{print \$4,\$5}'`;
45
46chomp $command_line;
47@memlist      = split(/ /, $command_line);
48
49# Define the calculating scalars
50$used_memory  = $memlist[0];
51$free_memory  = $memlist[1];
52$total_memory = $used_memory + $free_memory;
53
54# Get the options
55if ($#ARGV le 0)
56{
57  &usage;
58}
59else
60{
61  getopts('c:fuw:');
62}
63
64# Shortcircuit the switches
65if (!$opt_w or $opt_w == 0 or !$opt_c or $opt_c == 0)
66{
67  print "*** You must define WARN and CRITICAL levels!" if ($verb_err);
68  &usage;
69}
70elsif (!$opt_f and !$opt_u)
71{
72  print "*** You must select to monitor either USED or FREE memory!" if ($verb_err);
73  &usage;
74}
75
76# Check if levels are sane
77if ($opt_w <= $opt_c and $opt_f)
78{
79  print "*** WARN level must not be less than CRITICAL when checking FREE memory!" if ($verb_err);
80  &usage;
81}
82elsif ($opt_w >= $opt_c and $opt_u)
83{
84  print "*** WARN level must not be greater than CRITICAL when checking USED memory!" if ($verb_err);
85  &usage;
86}
87
88$warn_level   = $opt_w;
89$crit_level   = $opt_c;
90
91if ($opt_f)
92{
93  $percent    = $free_memory / $total_memory * 100;
94  $fmt_pct    = sprintf "%.1f", $percent;
95  if ($percent <= $crit_level)
96  {
97    print "Memory CRITICAL - $fmt_pct% ($free_memory kB) free\n";
98    exit $exit_codes{'CRITICAL'};
99  }
100  elsif ($percent <= $warn_level)
101  {
102    print "Memory WARNING - $fmt_pct% ($free_memory kB) free\n";
103    exit $exit_codes{'WARNING'};
104  }
105  else
106  {
107    print "Memory OK - $fmt_pct% ($free_memory kB) free\n";
108    exit $exit_codes{'OK'};
109  }
110}
111elsif ($opt_u)
112{
113  $percent    = $used_memory / $total_memory * 100;
114  $fmt_pct    = sprintf "%.1f", $percent;
115  if ($percent >= $crit_level)
116  {
117    print "Memory CRITICAL - $fmt_pct% ($used_memory kB) used\n";
118    exit $exit_codes{'CRITICAL'};
119  }
120  elsif ($percent >= $warn_level)
121  {
122    print "Memory WARNING - $fmt_pct% ($used_memory kB) used\n";
123    exit $exit_codes{'WARNING'};
124  }
125  else
126  {
127    print "Memory OK - $fmt_pct% ($used_memory kB) used\n";
128    exit $exit_codes{'OK'};
129  }
130}
131
132# Show usage
133sub usage()
134{
135  print "\ncheck_mem.pl v1.0 - Nagios Plugin\n\n";
136  print "usage:\n";
137  print " check_mem.pl -<f|u> -w <warnlevel> -c <critlevel>\n\n";
138  print "options:\n";
139  print " -f           Check FREE memory\n";
140  print " -u           Check USED memory\n";
141  print " -w PERCENT   Percent free/used when to warn\n";
142  print " -c PERCENT   Percent free/used when critical\n";
143  print "\nCopyright (C) 2000 Dan Larsson <dl\@tyfon.net>\n";
144  print "check_mem.pl comes with absolutely NO WARRANTY either implied or explicit\n";
145  print "This program is licensed under the terms of the\n";
146  print "GNU General Public License (check source code for details)\n";
147  exit $exit_codes{'UNKNOWN'};
148}
149