initial import
authorroot@cyrus.schlittermann.de
Thu, 11 Jun 2009 12:37:22 +0200
changeset 0 219322acb284
child 1 fba909f76790
initial import
cyrus-migrate.pl
--- /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