123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- #!/usr/bin/perl
- # vim:ts=4:sw=4:et
- # Virtual quota_usage 0.3
- # Contributed to Postfixadmin by Jose Nilton <jniltinho@gmail.com>
- #
- # See also : http://www.russelldare.net/media/perl/dirsizeSource.pdf
- # License: GPL v2.
- # Usage:
- # perl quota_usage.pl --list
- # perl quota_usage.pl --list --addmysql
- # for add mysql database postfix
- #
- # Requirements - the following perl modules are required:
- # DBD::Pg or DBD::mysql; perl perl-DBD-mysql perl-DBD (may be named differently depending on your platform).
- # and the 'du' binary in $ENV{'PATH'} (see below).
- #
- # You will need to modify the postfix DATABASE to add a quota_usage column.
- # Mysql:
- # ALTER TABLE mailbox ADD quota_usage INT(11) NOT NULL DEFAULT '0' AFTER modified,
- # ADD quota_usage_date DATE NOT NULL DEFAULT '0000-00-00' AFTER quota_usage;
- # PostgreSQL:
- # ALTER TABLE mailbox ADD COLUMN quota_usage INTEGER NOT NULL DEFAULT 0;
- # ALTER TABLE mailbox ADD COLUMN quota_usage_date DATE NOT NULL DEFAULT current_date;
- #
- use strict;
- use warnings;
- use File::Path;
- use DBI;
- use Getopt::Long;
- ##EDIT##
- my $db_host = 'localhost';
- my $db_database = 'postfix';
- my $db_user = 'postfix';
- my $db_password = '123456';
- my $root_path = '/home/vmail';
- # Pg or mysql
- my $db_type = 'mysql';
- ##END EDIT##
- (help()) if (!$ARGV[0]);
- $ENV{'PATH'} = "/sbin:/bin:/usr/sbin:/usr/bin";
- my($domain_dir, $full_domain_dir, $user_dir, $usage, $email, $sql, $dbh);
- my $list = 0;
- my $insert_db = 0;
- my $total_mailbox = 0;
- my $total_domain = 0;
- GetOptions ('l|list' => \$list, 'i|addmysql' => \$insert_db, 'help|h|man' => \&help) or (help());
- (list_quota_usage()) if ($list == 1 || $insert_db == 1 );
- sub list_quota_usage {
- opendir(DOMAINDIR, $root_path) or die ("Unable to access directory '$root_path' ($!)");
- if($insert_db == 1){
- $dbh = DBI->connect("DBI:$db_type:database=$db_database;host=$db_host", $db_user, $db_password) or die ("cannot connect the database");
- execSql("UPDATE mailbox set quota_usage = 0");
- }
- foreach $domain_dir (sort readdir DOMAINDIR) {
- next if $domain_dir =~ /^\./; # skip dotted dirs
- $full_domain_dir = "$root_path/$domain_dir"; #print "$full_domain_dir\n";
- $total_domain++;
- opendir(USERDIR, $full_domain_dir) or die ("Unable to access directory '$full_domain_dir' ($!)");
- foreach $user_dir (sort readdir USERDIR) {
- next if $user_dir =~ /^\./; # skip dotted dirs
- $email = "$user_dir\@$domain_dir";
- $total_mailbox++;
- my $i = `du -0 --summarize $full_domain_dir/$user_dir`;
- ($usage) = split(" ", $i);
- if ($usage < 100) {
- $usage = 0;
- } elsif ($usage < 1000) {
- $usage = 1;
- } else {
- $usage = $usage + 500;
- $usage = int $usage / 1000;
- }
- if($insert_db == 1){execSql("UPDATE mailbox set quota_usage = $usage, quota_usage_date = CAST(NOW() AS DATE) WHERE username = '$email'");}
- print_list() if ($list == 1);
- }
- }
- close(DOMAINDIR);
- close(USERDIR);
- (print_total()) if ($list == 1);
- }
- sub execSql {
- my $sql = shift;
- my $ex;
- $ex = $dbh->do($sql) or die ("error when running $sql");
- }
- sub print_total{
- print "---------------------------------------------------------\n";
- print "TOTAL DOMAIN\t\t\t\tTOTAL MAILBOX\n";
- print "---------------------------------------------------------\n";
- print "$total_domain\t\t\t\t\t\t$total_mailbox\n";
- }
- sub print_list {
- format STDOUT_TOP =
- Report of Quota Used
- ---------------------------------------------------------
- EMAIL QUOTA USED
- ---------------------------------------------------------
- .
- format =
- @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<
- $email, "$usage MB"
- .
- write;
- }
- sub help {
- print "$0 [options...]\n";
- print "-l|--list List quota used\n";
- print "-i|--addmysql For insert quota used in database mysql\n";
- }
|