# HG changeset patch # User root@cyrus.schlittermann.de # Date 1244716642 -7200 # Node ID 219322acb2848f31cbe5b9e072e00b0efe71ac98 initial import diff -r 000000000000 -r 219322acb284 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. +# +# -- + +my $usage = <<'#'; +Usage: $ME 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