#!/usr/bin/perl
# space_warn.pl
# Warns users if their inbox/mail folders is/are starting to get full.
# Relies on presence of repquota program
# Copyright 2003-2006 Kris Deugau <kdeugau@deepnet.cx>

$ver = 0.02;

# Some filesystem modules:
use Fcntl qw(:DEFAULT :flock);

@months=("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
@days=("Sun","Mon","Tue","Wed","Thu","Fri","Sat");

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdist) = localtime;
$year+=1900;
$datestring = "$days[$wday], $mday $months[$mon] $year $hour:$min:$sec -0500";
$datestring2 = gmtime();

@quotalist_inbox = `repquota /var/spool/mail`;

print "Quota warnings:  /var/spool/mail\n";
for ($i=5; $i<@quotalist_inbox; $i++) {
  @linebits = split /\s+/, $quotalist_inbox[$i];
  next if $linebits[0] eq 'arteaston';
  if ( ($linebits[3] != 0) && ($linebits[2] > ($linebits[3]-1000)) ) {
    # Got a quotabreaker, but not root, and (woohoo!) not a null line.
    # Let them know by inserting a message in their inbox.  Since we're
    # root, we can ignore quota violations.  ;)
    print "\t$linebits[2] of\t$linebits[4] KB used by $linebits[0]\n";
    sysopen(OVERQUOTA, "/var/spool/mail/$linebits[0]", O_WRONLY|O_APPEND|O_CREAT)
      or die "Can't open /var/spool/mail/$linebits[0]: $!";
    flock(OVERQUOTA, LOCK_EX)
      or die "Can't lock /var/spool/mail/$linebits[0]: $!";
#    print "From postmaster\@filtermail.webhart.net  $datestring2\n".
    print OVERQUOTA "From postmaster\@filtermail.webhart.net  $datestring2\n".
	"Return-Path: <postmaster\@filtermail.webhart.net>\n".
	"Received: from postmaster (localhost [127.0.0.1])\n".
	"	by filtermail.webhart.net (8.12.5/8.12.5)\n".
	"	for <$linebits[0]\@filtermail.webhart.net>; $datestring\n".
	"From: \"WebHart Filtermail Postmaster\" <postmaster\@filtermail.webhart.net>\n".
	"Organization: ViaNet Pembroke\n".
	"To: $linebits[0]\@webhart.net\n".
	"Date: $datestring\n".
	"Subject: Inbox almost full!\n".
	"X-Confirm-Reading-To: \"ViaNet Pembroke Support\" <support\@webhart.net>\n".
	"Return-receipt-to: \"ViaNet Pembroke Support\" <support\@webhart.net>\n".
	"Reply-To: \"ViaNet Pembroke Support\" <support\@webhart.net>\n".
	"Priority: normal\n".
	"X-Mailer: WebHart Filtermail Quota Check (v$ver)\n".
	"X-Scanned-By: MIMEDefang 2.51 (www . roaringpenguin . com / mimedefang)\n\n".
	"This is an automated message from the WebHart Filtermail postmaster.\n\n".
#	12345678901234567890123456789012345678901234567890123456789012345678901234567890
	"Your inbox in Filtermail is almost full.  Please delete some messages so that\n".
	"new mail will continue to be delivered to your inbox.\n\n".
	"Please note that this is usually only a problem if you read email via webmail\n".
	"at https://filtermail.webhart.net of if you have a \"Leave email on server\"\n".
	"option checkmarked in your email settings.  A regular email download with a\n".
	"program like Outlook Express, Eudora, or Mozilla Thunderbird should delete\n".
	"messages from our system as a part of its regular processing.\n\n".
	"Thank you,\n".
	"ViaNet Pembroke Postmaster\n\n\n";
    close OVERQUOTA;
  }
}

@quotalist_mfolders = `repquota /home`;
print "Emptied 'Trash' folders:\n";
for ($i=5; $i<@quotalist_mfolders; $i++) {
  @linebits = split /\s+/, $quotalist_mfolders[$i];
  if ( ($linebits[3] != 0) && ($linebits[2] > ($linebits[3]-1500)) ) {
    # Got a quotabreaker, but not root, and (woohoo!) not a null line.
    # Instead of notifying them, let's empty their Trash first.
    print "\t$linebits[0]\n";
    qx { cat /dev/null > $linebits[0] };
  }
}

@quotalist_mfolders = `repquota /home`;
print "Quota warnings:  /home\n";
for ($i=5; $i<@quotalist_mfolders; $i++) {
  @linebits = split /\s+/, $quotalist_mfolders[$i];
  if ( ($linebits[3] != 0) && ($linebits[2] > ($linebits[3]-1500)) ) {
    # Got a quotabreaker, but not root, and (woohoo!) not a null line.
    # Let them know by inserting a message in their inbox.  Since we're
    # root, we can ignore quota violations.  MUAHAHAHA!!! ;)
    print "\t$linebits[2] of\t$linebits[4] KB used by $linebits[0]\n";
    sysopen(OVERQUOTA, "/var/spool/mail/$linebits[0]", O_WRONLY|O_APPEND|O_CREAT)
      or die "Can't open /var/spool/mail/$linebits[0]: $!";
    flock(OVERQUOTA, LOCK_EX)
      or die "Can't lock /var/spool/mail/$linebits[0]: $!";
#    print "From postmaster\@filtermail.webhart.net  $datestring2\n".
    print OVERQUOTA "From postmaster\@filtermail.webhart.net  $datestring2\n".
	"Return-Path: <postmaster\@filtermail.webhart.net>\n".
	"Received: from postmaster (localhost [127.0.0.1])\n".
	"	by filtermail.webhart.net (8.12.5/8.12.5)\n".
	"	for <$linebits[0]\@filtermail.webhart.net>; $datestring\n".
	"From: \"WebHart Filtermail Postmaster\" <postmaster\@filtermail.webhart.net>\n".
	"Organization: ViaNet Pembroke\n".
	"To: $linebits[0]\@webhart.net\n".
	"Date: $datestring\n".
	"Subject: Mail folders almost full!\n".
	"X-Confirm-Reading-To: \"ViaNet Pembroke Support\" <support\@webhart.net>\n".
	"Return-receipt-to: \"ViaNet Pembroke Support\" <support\@webhart.net>\n".
	"Reply-To: \"ViaNet Pembroke Support\" <support\@webhart.net>\n".
	"Priority: normal\n".
	"X-Mailer: WebHart Filtermail Quota Check (v$ver)\n".
	"X-Scanned-By: MIMEDefang 2.51 (www . roaringpenguin . com / mimedefang)\n\n".
	"This is an automated message from the WebHart Filtermail postmaster.\n\n".
	"You have used almost all available space for your mail folders\n".
	"on Filtermail.  Please delete some messages from your personal\n".
	"folders on Filtermail, or purge the Trash folder.\n\n".
	"To check your mail folders on Filtermail, go to https://filtermail.webhart.net\n".
	"and log in with your username and password.\n\n".
	"Please note that you may occasionally see this message if the volume of spam\n".
	"coming in to your account increases.  We receive notification of this as well\n".
	"and will take action to expire spam more quickly on your account.\n\n".
	"Thank you,\n".
	"ViaNet Pembroke Postmaster\n\n\n";
    close OVERQUOTA;
  }
}
