|
John Dennis |
38f226 |
#!/usr/bin/perl -w
|
|
John Dennis |
38f226 |
#
|
|
John Dennis |
38f226 |
# imapcreate: create IMAP mailboxes with quotas
|
|
John Dennis |
38f226 |
# Reads user names from standard input.
|
|
John Dennis |
38f226 |
# launch without argument for a short help.
|
|
John Dennis |
38f226 |
#
|
|
John Dennis |
38f226 |
# originally found on http://cyrus-utils.sourceforge.net
|
|
John Dennis |
38f226 |
# (could not find any copyright info, thought)
|
|
John Dennis |
38f226 |
#
|
|
John Dennis |
38f226 |
# enhanced by Clément "nodens" Hermann <clement.hermann@free.fr>
|
|
John Dennis |
38f226 |
#
|
|
John Dennis |
38f226 |
# I'd like to consider this as GPL'd (cf www.gnu.org), but won't add any copyright without the original author's consent.
|
|
John Dennis |
38f226 |
#
|
|
John Dennis |
38f226 |
|
|
John Dennis |
38f226 |
use Getopt::Long;
|
|
John Dennis |
38f226 |
use Cyrus::IMAP::Admin;
|
|
John Dennis |
38f226 |
use strict;
|
|
John Dennis |
38f226 |
|
|
John Dennis |
38f226 |
|
|
John Dennis |
38f226 |
my $debug;
|
|
John Dennis |
38f226 |
my $user;
|
|
John Dennis |
38f226 |
my $pass;
|
|
John Dennis |
38f226 |
my $quota;
|
|
John Dennis |
38f226 |
my @part;
|
|
John Dennis |
38f226 |
my $useunixhierarchy;
|
|
John Dennis |
38f226 |
my @mailboxes;
|
|
John Dennis |
38f226 |
my $delete;
|
|
John Dennis |
38f226 |
my $cyrus;
|
|
John Dennis |
38f226 |
|
|
John Dennis |
38f226 |
sub usage {
|
|
John Dennis |
38f226 |
print <
|
|
John Dennis |
38f226 |
imapcreate - create IMAP mailboxes with quotas
|
|
John Dennis |
38f226 |
usage:
|
|
John Dennis |
38f226 |
imapcreate [-d] [-u user] [-p pass] [-m mailbox1[,mailbox2][,mailbox<n>]]
|
|
John Dennis |
38f226 |
[-q quota] [-t partition:list] [-s] [-v] <server>
|
|
John Dennis |
38f226 |
|
|
John Dennis |
38f226 |
Options:
|
|
John Dennis |
38f226 |
-t : the partition to use. Default to the \"default\" partition
|
|
John Dennis |
38f226 |
-q ; the quota, if a quota is needed. It is normally in KiloBytes, but you can use m,M,g or G suffix to use MB or GB instead, e.g 10k, 2048M or 100g
|
|
John Dennis |
38f226 |
-m : a comma-separated mailbox list
|
|
John Dennis |
38f226 |
-u : your cyrus admin user (usually cyrus or cyradm)
|
|
John Dennis |
38f226 |
-p : your cyrus admin password (if not provided, it will be asked for)
|
|
John Dennis |
38f226 |
-s : use the unix hierarchy separator (see imapd.conf(1))
|
|
John Dennis |
38f226 |
-d : delete mailboxes instead of creating them
|
|
John Dennis |
38f226 |
-v : run in debug mode, and print information on stdout
|
|
John Dennis |
38f226 |
|
|
John Dennis |
38f226 |
If no password is submitted with -p, we'll prompt for one.
|
|
John Dennis |
38f226 |
if no mailbox name is specified with -m, read user names from standard input
|
|
John Dennis |
38f226 |
|
|
John Dennis |
38f226 |
examples:
|
|
John Dennis |
38f226 |
imapcreate -u cyradm -m foo,bar,joe -q 50000 -t p1:p2 mail.testing.umanitoba.ca
|
|
John Dennis |
38f226 |
cat list.txt | imapcreate -u cyradm -p 'cyruspass' -q 50M mail.testing.umanitoba.ca
|
|
John Dennis |
38f226 |
EOU
|
|
John Dennis |
38f226 |
exit 1;
|
|
John Dennis |
38f226 |
}
|
|
John Dennis |
38f226 |
|
|
John Dennis |
38f226 |
# Create a mailbox... usage : &CreateMailBox(user,partition[,quota]).
|
|
John Dennis |
38f226 |
# You have to be authentified already. We use "$cyrus" as the connection name.
|
|
John Dennis |
38f226 |
# partition can be 'default'
|
|
John Dennis |
38f226 |
sub CreateMailBox {
|
|
John Dennis |
38f226 |
my $mbuser = $_[0];
|
|
John Dennis |
38f226 |
my $mbpart = $_[1];
|
|
John Dennis |
38f226 |
my $mbquota = $_[2];
|
|
John Dennis |
38f226 |
|
|
John Dennis |
38f226 |
print "Creating $mbuser on $mbpart\n" if $debug;
|
|
John Dennis |
38f226 |
if ($mbpart eq 'default') {
|
|
John Dennis |
38f226 |
$cyrus->createmailbox($mbuser);
|
|
John Dennis |
38f226 |
}
|
|
John Dennis |
38f226 |
else {
|
|
John Dennis |
38f226 |
$cyrus->createmailbox($mbuser, $mbpart);
|
|
John Dennis |
38f226 |
}
|
|
John Dennis |
38f226 |
warn $cyrus->error if $cyrus->error;
|
|
John Dennis |
38f226 |
|
|
John Dennis |
38f226 |
# Set the quota
|
|
John Dennis |
38f226 |
if ($mbquota) {
|
|
John Dennis |
38f226 |
print "Setting quota for $mbuser to $mbquota\n" if $debug;
|
|
John Dennis |
38f226 |
$cyrus->setquota($mbuser, 'STORAGE', $mbquota);
|
|
John Dennis |
38f226 |
warn $cyrus->error if $cyrus->error;
|
|
John Dennis |
38f226 |
}
|
|
John Dennis |
38f226 |
}
|
|
John Dennis |
38f226 |
|
|
John Dennis |
38f226 |
# Delete a mailbox. Usage: $DeleteMailBox($user)
|
|
John Dennis |
38f226 |
# Assuming we use $user as the admin.
|
|
John Dennis |
38f226 |
sub DeleteMailBox {
|
|
John Dennis |
38f226 |
my $mbuser = $_[0];
|
|
John Dennis |
38f226 |
my $delacl = "c";
|
|
John Dennis |
38f226 |
|
|
John Dennis |
38f226 |
print "Deleting $mbuser\n" if $debug;
|
|
John Dennis |
38f226 |
$cyrus->setaclmailbox($mbuser, $user, $delacl);
|
|
John Dennis |
38f226 |
$cyrus->deletemailbox($mbuser);
|
|
John Dennis |
38f226 |
warn $cyrus->error if $cyrus->error;
|
|
John Dennis |
38f226 |
}
|
|
John Dennis |
38f226 |
|
|
John Dennis |
38f226 |
GetOptions("d|delete" => \$delete, "u|user=s" => \$user, "p|pass=s" => \$pass, "m|mailboxes=s" => \@mailboxes, "q|quota=s" => \$quota,
|
|
John Dennis |
38f226 |
"t|part=s" => \@part, "s|UnixHierarchy" => \$useunixhierarchy, "v|verbose" => \$debug );
|
|
John Dennis |
38f226 |
@part = split(/:/, join(':', @part));
|
|
John Dennis |
38f226 |
push @part, 'default' unless @part;
|
|
John Dennis |
38f226 |
my $pn = 0;
|
|
John Dennis |
38f226 |
@mailboxes = split(/,/, join(',', @mailboxes));
|
|
John Dennis |
38f226 |
|
|
John Dennis |
38f226 |
my $server = shift(@ARGV) if (@ARGV);
|
|
John Dennis |
38f226 |
usage unless $server;
|
|
John Dennis |
38f226 |
|
|
John Dennis |
38f226 |
# quotas formatting:
|
|
John Dennis |
38f226 |
if ($quota) {
|
|
John Dennis |
38f226 |
if ($quota =~ /^(\d+)([mk]?)$/i) {
|
|
John Dennis |
38f226 |
my $numb = $1;
|
|
John Dennis |
38f226 |
my $letter = $2;
|
|
John Dennis |
38f226 |
if ($letter =~ /^m$/i) {
|
|
John Dennis |
38f226 |
$quota = $numb * 1024;
|
|
John Dennis |
38f226 |
print "debug: quota=$quota\n" if $debug;
|
|
John Dennis |
38f226 |
} elsif ($letter =~ /^k$/i) {
|
|
John Dennis |
38f226 |
$quota = $numb;
|
|
John Dennis |
38f226 |
print "debug: quota=$quota\n" if $debug;
|
|
John Dennis |
38f226 |
} else {
|
|
John Dennis |
38f226 |
die "malformed quota: $quota (must be at least one digit eventually followed by m, M, k or K\n";
|
|
John Dennis |
38f226 |
# $quota = $numb;
|
|
John Dennis |
38f226 |
# print "debug: quota=$quota\n" if $debug;
|
|
John Dennis |
38f226 |
}
|
|
John Dennis |
38f226 |
} else {
|
|
John Dennis |
38f226 |
die "malformed quota: $quota (must be at least one digit eventually followed by m, M, k or K\n";
|
|
John Dennis |
38f226 |
}
|
|
John Dennis |
38f226 |
}
|
|
John Dennis |
38f226 |
|
|
John Dennis |
38f226 |
# Authenticate
|
|
John Dennis |
38f226 |
$cyrus = Cyrus::IMAP::Admin->new($server);
|
|
John Dennis |
38f226 |
$cyrus->authenticate(-mechanism => 'login', -user => $user,
|
|
John Dennis |
38f226 |
-password => $pass);
|
|
John Dennis |
38f226 |
die $cyrus->error if $cyrus->error;
|
|
John Dennis |
38f226 |
|
|
John Dennis |
38f226 |
# if there isn't any mailbox defined yet, get them from standard input
|
|
John Dennis |
38f226 |
if (! (defined $mailboxes[0])) {
|
|
John Dennis |
38f226 |
# For all users
|
|
John Dennis |
38f226 |
while (<>) {
|
|
John Dennis |
38f226 |
chomp;
|
|
John Dennis |
38f226 |
my $mbox = $_;
|
|
John Dennis |
38f226 |
push @mailboxes, $mbox;
|
|
John Dennis |
38f226 |
}
|
|
John Dennis |
38f226 |
}
|
|
John Dennis |
38f226 |
|
|
John Dennis |
38f226 |
# create/delete mailboxes for each user
|
|
John Dennis |
38f226 |
foreach my $mailbox (@mailboxes) {
|
|
John Dennis |
38f226 |
if ($useunixhierarchy) {
|
|
John Dennis |
38f226 |
$mailbox = 'user/' . $mailbox;
|
|
John Dennis |
38f226 |
} else {
|
|
John Dennis |
38f226 |
$mailbox = 'user.' . $mailbox;
|
|
John Dennis |
38f226 |
}
|
|
John Dennis |
38f226 |
|
|
John Dennis |
38f226 |
if ($delete) {
|
|
John Dennis |
38f226 |
&DeleteMailBox($mailbox)
|
|
John Dennis |
38f226 |
} else {
|
|
John Dennis |
38f226 |
# Select the partition
|
|
John Dennis |
38f226 |
my $pt = $part[$pn];
|
|
John Dennis |
38f226 |
$pn += 1;
|
|
John Dennis |
38f226 |
$pn = 0 unless $pn < @part;
|
|
John Dennis |
38f226 |
&CreateMailBox($mailbox,$pt,$quota)
|
|
John Dennis |
38f226 |
}
|
|
John Dennis |
38f226 |
}
|
|
John Dennis |
38f226 |
|