--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/cyrus-migrate.pl Thu Jun 11 12:37:22 2009 +0200
@@ -0,0 +1,119 @@
+#! /usr/bin/perl
+#
+# Ziel ist es die Cyrus-Daten zweier verschiedener Rechner (auch Architekturen)
+# zu synchornisieren.
+#
+# Wir kümmern uns hier nicht um das Anlegen der Mailbox, das muss anderweitig
+# geschehen.
+#
+# Die eigentlich Synchronisation wird durch das Tool imapsync vorgenommen, z.B.
+# so:
+#
+# imapsync --ssl1 --host1 pu.schlittermann.de --user1 mobst@schlittermann.de
+# --password1 gahlij \ --ssl2 --host2 cyrus.schlittermann.de --user2
+# mobst@schlittermann.de --password2 gahlij
+#
+# Es ist also notwendig für jeden zu synchronisierende Mailbox das Passwort zu
+# kennen. Dies lässt sich allerdings in unserm Falle leicht bewerkstelligen,
+# da wir die Passworte im Klartext in einer Mysql-Datenbank liegen haben.
+# (Theoretisch hat imapsync auch eine Funktion um mit Adminaccount zu Arbeitn,
+# allerdings hat das nicht auf Anhieb funktoniert)
+#
+# Auf der Stardardeingabe (alternativ auf Kommandozeilenargumente) wird eine
+# Liste mit zu importierenden Mailboxen erwartet. Man kann sich einfach eine
+# Liste aller eingerichtete# Mailboxen mit
+#
+# su - cyrus -c '/usr/sbin/ctl_mboxlist -d' | awk '{ print $4}' | sort |uniq
+#
+# geben lassen.
+#
+# -- <mobst@schlittermann.de>
+
+my $usage = <<'#';
+Usage: $ME <options> mailboxlist.txt
+
+ --dry-run dry run ($opt_dry)
+ --skip skipp missing mailboxes ($opt_skip)
+ --logdir=s directory where logfiles will go to ($opt_logdir)
+ --help this help text
+#
+
+use strict;
+use warnings;
+use Smart::Comments;
+use feature ':5.10';
+use File::Basename;
+use DBI;
+use Data::Dumper;
+use Getopt::Long;
+use File::Path;
+
+my $ME = basename $0;
+
+my $dsn = "DBI:mysql:database=mail;host=pu.schlittermann.de";
+my $db_user = "exim";
+my $db_pass = undef;
+
+my $imap_from_host = "pu.schlittermann.de";
+my $imap_to_host = "cyrus.schlittermann.de";
+
+my $opt_dry = 0;
+my $opt_skip = 0;
+my $opt_logdir = "./imapsync-log/";
+
+GetOptions(
+ "dry-ryn" => \$opt_dry,
+ "skip" => \$opt_skip,
+ "logdir=s" => \$opt_logdir,
+) or die eval "\"$usage\"";
+
+
+### connection to mysql account database
+my $dbh = DBI->connect($dsn, $db_user, $db_pass, { RaiseError => 1} ) or
+ die "$ME: cannot conncet to mysql: $!\n";
+
+### logfiles will go to: $opt_logdir
+-d $opt_logdir or mkpath $opt_logdir or die "$ME: cannot create log dir: $!\n";
+
+my %password_of_account_ = ();
+
+### reading list of mailboxes to import
+while (defined (my $mailbox = <>)) {
+ chomp($mailbox);
+ my ($user, $domain) = split('@', $mailbox);
+
+ # lookup user@domain in accout db and save password
+ my $sth = $dbh->prepare("SELECT userPassword FROM users WHERE user = ? AND domain = ?");
+ $sth->execute($user, $domain);
+ my $pass = ($sth->fetchrow_array())[0];
+
+ if (not defined $pass) {
+ warn "$ME: mailbox $mailbox does not existion on imap server!\n";
+ $opt_skip or exit;
+ next;
+ }
+
+ $password_of_account_{$mailbox} = $pass;
+}
+
+### starting imap migration
+
+foreach my $mailbox (keys %password_of_account_) {
+ ### processing mailbox: $mailbox
+ my $imapsync_options = "";
+ $imapsync_options .= " --dry" if $opt_dry;
+ my $logfile = "$opt_logdir/$mailbox.log";
+
+ my $cmd = sprintf( "imapsync %s --ssl1 --ssl2 --subscribed --subscribe"
+ . " --host1 %s --host2 %s"
+ . " --user1 %s --user2 %s --password1 %s --password2 %s > %s",
+ $imapsync_options, $imap_from_host, $imap_to_host,
+ $mailbox, $mailbox, $password_of_account_{$mailbox},
+ $password_of_account_{$mailbox},
+ $logfile);
+
+ system($cmd);
+ warn "$ME: migration of mailbox $mailbox failed, see $logfile\n" if ($? != 0);
+}
+
+# vim: sw=4 sts=4 aw