#!/usr/bin/perl -w
#===============================================================================
# DiskLow Monitor
# ===============
# (c)2003-2004 Altiplano bvba
#
# DESCRIPTION
#   DiskLow warns the administrator if disk space on one of the partitions
#   is getting dangerously low. Warning messages are sent once a day if disk
#   space has dropped below 10%. Alarm messages will be sent every hour if 
#   only 5% free space is left. 
#   DiskLow should be run as a cron job to check the disk space at regular 
#   intervals.
#
# SYNOPSIS
#   33 * * * * /usr/sbin/DiskLow
#
# VERSION
#   Version 0.1.3 (2004-01-29)
#   The latest version is hosted at http://www.contribs.org/contribs/mblotwijk/
#
# COPYRIGHT
#   (c)2003-2004, Altiplano bvba (B<http://www.altiplano.be>). 
#   Released under the terms of the GNU license.
#
# BUGS
#   Please report bugs to <Bugs@Altiplano.Be>
#
#==============================================================================
use strict;
#===============================================================================
my $warnlevel=90;	# Warning level in percentage
my $alarmlevel=95;	# Alarm level in percentage
my $warnevery=60*60*24;	# Send warning messages once a day
my $alarmevery=60*60;	# Send an alarm message once an hour
my $message="You are running dangerously low on disk space.\n\n".
	    "Filesystem            Size  Used Avail Use% Mounted on\n";
my @disks= `df -l -h | grep -E "^\/dev\/sd|^\/dev\/hd"`;

my $Log="/tmp/LowDisk";
my $now=time;
my $messagetype="none";
#===============================================================================
foreach my $disk (@disks)
{
    my @details = split(/\s+/, $disk);
    $details[4] =~ s/%//;
    if ( $details[4] > $warnlevel ) {
	if ($messagetype eq "none" ) { $messagetype="Warning" }
	$message.=$disk;
    }
    
    if ( $details[4] > $alarmlevel ) {
	$messagetype="Alarm";
	$message.=$disk;
    }
}

my $sendemail="True";
if ($messagetype eq "none") {
    unlink("$Log.Warning");
    unlink("$Log.Alarm");
    $sendemail="False";
}
elsif (($messagetype eq "Warning") && ( -e $Log.".Warning" )) { 
    my $then=`cat $Log."Warning"`;
    if (($now-$then) < $warnevery) { $sendemail="False"; }
    unlink("$Log.Alarm");
}
elsif (($messagetype eq "Alarm") && ( -e $Log.".Alarm" )) { 
    my $then=`cat $Log."Alarm"`;
    if (($now-$then) < $alarmevery) { $sendemail="False"; }
    unlink("$Log.Warning");
}

if ( $sendemail eq "True") {
    $message="$messagetype: $message\nregards,\nThe DiskLow Monitor\n";
    open (LOG,">$Log.$messagetype") or die;
    print LOG $now;
    close LOG;
    system "echo '$message' | mail -s '$messagetype: Low disk space' admin";
}

#===============================================================================
