exec perl -x -S $0 ${1+"$@"}
if ($] !~ /^5\..*/) {
foreach (split(/:/, $ENV{PATH})) { exec("$_/perl5", "-x", "-S", $0, @ARGV) if (-x "$_/perl5");
}
die "Your perl is too old; I need perl 5.\n";
}
eval join("\n", <DATA>);
if ($@) { die "$@"; }
__END__
require 5;
$| = 1;
if ("-i" eq $ARGV[0]) {
$interactive = 1;
shift @ARGV;
}
if ("-f" eq $ARGV[0]) {
$force = 1;
shift @ARGV;
}
if ("-h" eq $ARGV[0] || $ print "usage: dohash [-i] [-f] [imapd.conf]\n";
print " -i interactive\n";
print " -f keep going on errors\n";
exit;
}
sub ouch {
my $msg = shift;
if ($force) {
print "fatal error: $msg\n";
} else {
print "error: $msg\n";
exit 1;
}
}
$imapdconf = shift || "/etc/imapd.conf";
$yn = "y";
$hashispool = 0;
open CONF, $imapdconf or die "can't open $imapdconf";
while (<CONF>) {
if (/^configdirectory:\s*(.*)$/) {
$conf = $1;
}
if (/^partition-.*:\s*(.*)$/) {
if (grep /$1/, @parts) {
next;
}
push @parts, $1;
}
if (/^hashimapspool:\s*(1|t|yes|on)/) {
$hashispool = 1;
print "i will also hash partitions.\n";
}
}
close CONF;
if (! $conf) { $conf = "/var/imap"; }
if ($interactive) {
print "upgrade $conf? ";
$yn = <STDIN>;
}
if ($yn =~ /^y/) {
print "upgrading configuration directory $conf...";
chdir $conf or die "couldn't change to $conf";
print "user ";
chdir "user" or die "couldn't change to user subdir";
foreach $i ("a".."z") {
mkdir ("$i", 0755) or ouch "couldn't create $i";
}
opendir (USER, ".");
while ($f = readdir USER) {
print;
if ($f =~ /(.).*\.sub/s) {
print;
$h = lc($1);
if (!($h =~ /[a-z]/)) { $h = 'q'; }
rename ($f, "$h/$f") or ouch "couldn't move $f into $h";
}
}
closedir USER;
chdir "..";
print "quota ";
chdir "quota" or die "couldn't change to quota subdir";
foreach $i ("a".."z") {
mkdir (".$i", 0755) or ouch "couldn't create .$i";
}
opendir QUOTA, ".";
while ($mbox = readdir QUOTA) {
if ($mbox =~ /^\./s) { next; }
if ($mbox =~ /^.*\.(.).*$/s) {
$h = lc($1);
if ($h =~ /[a-z]/) {
rename($mbox, ".$h/$mbox")
or ouch "couldn't move $mbox into $h";
} else {
rename($mbox, ".q/$mbox")
or ouch "couldn't move $mbox into q";
}
next;
}
if ($mbox =~ /(.).*/) {
$h = lc($1);
if ($h =~ /[a-z]/) {
rename($mbox, ".$h/$mbox")
or ouch "couldn't move $mbox into $h";
} else {
rename($mbox, ".q/$mbox")
or ouch "couldn't move $mbox into q";
}
next;
}
print "weird mailbox '$mbox'?\n";
}
closedir QUOTA;
foreach $i ("a".."z") {
rename (".$i", $i) or ouch "couldn't rename $i into place";
}
print "done\n";
}
while ($part = shift @parts) {
if ($interactive) {
print "upgrade $part? ";
$yn = <STDIN>;
}
if ($yn =~ /^y/) {
print "upgrading data partition $part...";
chdir $part or die "couldn't chdir to $part";
if ($hashispool) {
foreach $i ("a".."z") {
mkdir (".$i", 0755) or ouch "couldn't create .$i";
}
opendir PART, ".";
while ($dir = readdir PART) {
if ($dir =~ /^\./s) { next; }
if ($dir eq "lost+found") { next; }
print "$dir ";
opendir DIR, $dir;
$ismbox = 0;
while ($sub = readdir DIR) {
if ($sub =~ /^\./s) { next; }
if ($sub =~ /(.*)\.(.*)/) { $ismbox = 1; next; }
if ($sub =~ /^(.).*$/s) {
$h = lc($1);
if (!($h =~ /[a-z]/)) {
$h = 'q';
}
mkdir (".$h/$dir", 0755); rename("$dir/$sub", ".$h/$dir/$sub") or
ouch "couldn't move $dir/$sub into $h";
} else {
print "weird mailbox '$dir/$sub'?\n";
}
}
closedir DIR;
if ($ismbox && $dir =~ /^(.).*/s) {
$h = lc($1);
if (!($h =~ /[a-z]/)) {
$h = 'q';
}
mkdir (".$h/$dir", 0755); opendir DIR, $dir;
while ($sub = readdir DIR) {
if ($sub =~ /^\./s) { next; }
rename("$dir/$sub", ".$h/$dir/$sub") or
ouch "couldn't move $dir into $h";
}
closedir DIR;
}
rmdir $dir or print "\ncouldn't remove '$dir'??\n";
}
closedir PART;
foreach $i ("a".."z") {
rename (".$i", $i) or ouch "couldn't rename .$i to $i";
}
}
chdir $part or die "couldn't chdir to $part";
mkdir "stage.", 0755;
print "done\n";
}
}