Script - check_freespace_osx

Revised: 2009-06-03 richard

Download Script – -File, 3.0 KB

#!/usr/bin/perl

# This script returns all disk > 20G mounted in /dev/ on the mac on a single return.
# it is not standards compliant but it is dynamic.

# See the help at the bottom for command line options.

use strict;
use Getopt::Std;

use vars qw/ %opt /;

# my $df = `df -l -k | grep -v -i backup | grep /dev/`;
my $df = `df -k | grep /dev/`;
my $exitcrit = 1;
my $exitwarning = 1;
my $exitok = 1;
my $diskused; my $diskname; my $percentused;
my $opt_h; my $opt_c; my $opt_w; my $opt_x;

sub nicedisksize($)
{
    my $input = shift;
    if ($input < 1024)
    {
        $diskused = sprintf("%.2f", $input);
        $diskused = $diskused."K";
    }
    elsif ($input < (1024*1024))
    {
        $diskused = sprintf("%.2f", $input / 1024);
        $diskused = $diskused."M";
    }
    elsif ($input < (1024*1024*1024))
    {
        $diskused = sprintf("%.2f", $input / (1024*1024));
        $diskused = $diskused."G";
    }
    elsif ($input < (1024*1024*1024*1024))
    {
        $diskused = sprintf("%.2f", $input / (1024*1024*1024));
        $diskused = $diskused."T";
    }
    return $diskused;
}

sub trim($)
{
   my $string = shift;
   $string =~ s/^\s+//;
   $string =~ s/\s+$//;
   return $string;
}

if (@ARGV < 1)
{
   print_usage();
   exit 0;
}

getopts("h:w:c:x:", \%opt );

print_usage() if $opt{h};

my $warning = $opt{w};
my $critical = $opt{c};
my $exclude = $opt{x};

# $1 = Disk Name
# $2 = Disk Size
# $3 = Disk Used
# $4 = Disk Available
# $5 = Percentage Used
# $6 = Mount Location

foreach $_ (split("\n",$df))
{
    chomp;
    if (m/(.+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)$/)
    {
    $diskname = trim($6);
    my $diskused = nicedisksize($3);
    my $disksize = nicedisksize($2);
    $percentused = 100 - $5;
       if (m/$exclude/i eq $6) #Don't care about excluded disk
            {
                print "OK: $diskname ($diskused"," of $disksize"," used) $percentused% remaining.<br> ";
                $exitok = 0;
            }
       elsif ($2 <= ((1024*1024)*20)) #Don't care about disks less then 20G
            {
                print "OK: $diskname ($diskused"," of $disksize"," used) $percentused% remaining.<br> ";
                $exitok = 0;
            }
       elsif ($percentused <= $warning)
            {
                print "WARNING: $diskname ($diskused"," of $disksize"," used) $percentused% remaining.<br> ";
                $exitwarning = 0;
            }
       elsif ($percentused <= $critical)
               {
                print "CRITICAL: $diskname ($diskused"," of $disksize"," used) $percentused% remaining.<br> ";
                $exitcrit = 0;
               }
       else
           {
                print "OK: $diskname ($diskused"," of $disksize"," used) $percentused% remaining.<br> ";
                $exitok = 0;
           }   
    }
    else
    {
        print "FAIL\n";
    }
}

if ($exitcrit =~ 0)
{
       exit 2;
}
elsif ($exitwarning =~ 0)
{
       exit 1;
}
elsif ($exitok =~ 0)
{
       exit 0;
}

sub print_usage
{
 print << "USAGE";

-----------------------------------------------------------------
Monitors disk freespace on OSX

This script monitors all Volumes > 20G with usable space mounted in /dev/.

Usage: check_freespace_osx -w <warning % remaining> -c <critical % remaining> -x excluded_disk (not case sensitive)

Example: check_freespace_osx -w 15 -c 10 -x backup


USAGE
    exit 0;
}