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 (($ $force = 1;
shift @ARGV;
}
if ((($ print "usage: translatesieve [-f] [imapd.conf]\n";
print " -f keep going on errors\n";
exit;
}
sub ouch {
my $msg = shift;
if ($force) {
print "error: $msg\n";
} else {
print "fatal error: $msg\n";
exit 1;
}
}
$imapdconf = shift || "/etc/imapd.conf";
$sievedir = "/usr/sieve";
$unixhierarchysep = 0;
$altnamespace = 0;
$userprefix = "Other Users";
$sharedprefix = "Shared Folders";
open CONF, $imapdconf or die "can't open $imapdconf";
while (<CONF>) {
if (/^sievedir:\s*(.*)$/) {
$sievedir = $1;
print "you are using $sievedir as your sieve directory.\n";
}
if (/^unixhierarchysep:\s*(1|t|yes|on)/) {
$unixhierarchysep = 1;
}
if (/^altnamespace:\s*(1|t|yes|on)/) {
$altnamespace = 1;
}
if (/^userprefix:\s*(.*)$/) {
$userprefix = $1;
print "you are using $userprefix as your other users prefix.\n";
}
if (/^sharedprefix:\s*(.*)$/) {
$sharedprefix = $1;
print "you are using $sharedprefix as your shared prefix.\n";
}
}
close CONF;
unless ($unixhierarchysep || $altnamespace) {
ouch "you are not using the Unix hierarchy separator or the alternate namespace";
exit;
}
print "translating sievedir $sievedir... ";
chdir $sievedir or die "couldn't change to $sievedir";
foreach $i ("a".."z") {
print "$i ";
if (! chdir $i) {
ouch "couldn't chdir to $i";
next;
}
opendir (D, ".");
while ($d = readdir D) {
next if ($d =~ /^\./s);
if (! -d $d) {
ouch "expected $d to be a directory";
next;
}
if (! chdir $d) {
ouch "couldn't chdir to $d";
next;
}
opendir DIR, ".";
while ($file = readdir DIR) {
next if (!($file =~ /\.script$/));
if (!open(IN, $file)) {
ouch "cannot open $file for reading: $!";
next;
}
if (!open(OUT, ">.$file")) {
close(IN);
ouch "cannot create /.$file: $!";
next;
}
$inbox = "[Ii][Nn][Bb][Oo][Xx]";
while (<IN>) {
if ($altnamespace) {
if (/\s+fileinto\s+"$inbox"\s*;/) {
}
elsif (/\s+fileinto\s+"($inbox\.[^"]*)"\s*;/) {
substr($_, index($_, $1), 6) = "";
}
# Other Users namespace
elsif (/\s+fileinto\s+"(user\.[^"]*)"\s*;/) {
substr($_, index($_, $1), 4) = $userprefix;
}
elsif (/\s+fileinto\s+"([^"]*)"\s*;/) {
substr($_, index($_, $1), 0) = $sharedprefix . ".";
}
}
# Hierarchy separator
if ($unixhierarchysep) {
if (/\s+fileinto\s+"([^"]*)"\s*;/) {
substr($_, index($_, $1)) =~ s~\.~/~g;
}
}
print OUT $_;
}
close(IN);
close(OUT);
rename(".$file", "$file")
or ouch "couldn't move .$file to $file";
}
closedir DIR;
chdir "..";
}
closedir D;
chdir "..";
}
print "done\n";