#!/usr/bin/perl # Mar 3, 2012 # Author: Matt Simerson # based on shell script by Clarence Mills (cmills@opensitesolutions.com), Dec 1 2008 # Rewritten to: # not pollute the daily logs with errors # not use temp files for storage # better format the reports # require fewer settings # work reliably with vpopmail user dir hashing use strict; use warnings; my $vpopdir = '/usr/local/vpopmail'; my $warn = 90; my $admin = 'postmaster@example.com'; # Email users that are over quota to Administrator my $OVER = `date` . " Quota Usage Name Email ==============================\n"; my $NONE = `date` . " Name Email ==============================\n"; foreach my $domain ( `$vpopdir/bin/vdominfo -n` ) { chomp $domain; next if $domain !~ /[a-z0-9]/; # ignore blank lines next if $domain =~ /\(alias/; #warn "$domain\n"; foreach my $user ( `$vpopdir/bin/vuserinfo -n -D $domain` ) { chomp $user; # Get quota/info for user my $info = `$vpopdir/bin/vuserinfo $user\@$domain`; my ($dir) = $info =~ m/dir:\s+(.*)/; my ($name) = $info =~ m/comment\/gecos:\s+(.*)/; my ($usage) = $info =~ m/usage:\s+(.*)/; $usage =~ s/%//; my ($unum) = $info =~ m/quota:\s+(.*)/; ($unum) = split(/,/, $unum) if $unum =~ /,/; $unum =~ s/[a-zA-Z]//g; my $cnum = 0; $cnum = $unum / 1024 / 1024 if ( $unum && $unum > 0 ); #warn "\t$user\t$name\t$usage\t$unum\t$cnum\n"; if ( $usage eq 'NOQUOTA' ) { $NONE .= sprintf("%-20s %-50s\n", $name, "$user\@$domain" ); next; } if ( $usage && $usage >= $warn ) { $OVER .= sprintf("%5s %7s %-20s %-50s\n", $cnum, "$usage%", $name, "$user\@$domain" ); open( my $MAIL, '|/usr/bin/mail -s "**** Warning **** Mail Quota Usage"'." $admin" ) or die "unable to pipe to mail\n"; print $MAIL get_message( $name, $cnum, $usage, "$user\@$domain", $dir); close $MAIL; } } } # Only send mail to admin if there are users over quota if ( $OVER =~ /\@/ ) { open( my $MAIL, '|/usr/bin/mail -s "Users nearing Quota" ' . $admin ) or die "unable to pipe to mail\n"; print $MAIL $OVER; close $MAIL; } # Ony mail NOQUOTA usage on the 1st of each month my $day=`date | awk '{print \$3}'`; if ( $day == 1 && $NONE =~ /\@/ ) { open( my $MAIL, '|/usr/bin/mail -s "Users with No Quota" ' . $admin ) or die "unable to pipe to mail\n"; print $MAIL $NONE; close $MAIL; } sub get_message { my ($name, $cnum, $usage, $email, $dir) = @_; chdir "$dir/Maildir"; my $report = `du -d1 -t3000000 -h .`; return <