cyrus-migrate.pl
changeset 0 219322acb284
child 1 fba909f76790
equal deleted inserted replaced
-1:000000000000 0:219322acb284
       
     1 #! /usr/bin/perl
       
     2 #
       
     3 # Ziel ist es die Cyrus-Daten zweier verschiedener Rechner (auch Architekturen)
       
     4 # zu synchornisieren.
       
     5 #
       
     6 # Wir kümmern uns hier nicht um das Anlegen der Mailbox, das muss anderweitig
       
     7 # geschehen.
       
     8 #
       
     9 # Die eigentlich Synchronisation wird durch das Tool imapsync vorgenommen, z.B.
       
    10 # so:
       
    11 #
       
    12 # imapsync --ssl1 --host1 pu.schlittermann.de --user1 mobst@schlittermann.de
       
    13 # --password1 gahlij \ --ssl2 --host2 cyrus.schlittermann.de --user2
       
    14 # mobst@schlittermann.de --password2 gahlij
       
    15 #
       
    16 # Es ist also notwendig für jeden zu synchronisierende Mailbox das Passwort zu
       
    17 # kennen.  Dies lässt sich allerdings in unserm Falle leicht bewerkstelligen,
       
    18 # da wir die Passworte im Klartext in einer Mysql-Datenbank liegen haben.
       
    19 # (Theoretisch hat imapsync auch eine Funktion um mit Adminaccount zu Arbeitn,
       
    20 # allerdings hat das nicht auf Anhieb funktoniert)
       
    21 #
       
    22 # Auf der Stardardeingabe (alternativ auf Kommandozeilenargumente) wird eine
       
    23 # Liste mit zu importierenden Mailboxen erwartet.  Man kann sich einfach eine
       
    24 # Liste aller eingerichtete# Mailboxen mit
       
    25 #
       
    26 # su - cyrus -c '/usr/sbin/ctl_mboxlist -d' | awk '{ print $4}' | sort |uniq 
       
    27 #
       
    28 # geben lassen.
       
    29 #
       
    30 #  -- <mobst@schlittermann.de>
       
    31 
       
    32 my $usage = <<'#';
       
    33 Usage: $ME <options> mailboxlist.txt
       
    34     
       
    35     --dry-run	    dry run ($opt_dry)
       
    36     --skip	    skipp missing mailboxes ($opt_skip)
       
    37     --logdir=s	    directory where logfiles will go to ($opt_logdir)
       
    38     --help	    this help text
       
    39 #
       
    40 
       
    41 use strict;
       
    42 use warnings;
       
    43 use Smart::Comments;
       
    44 use feature ':5.10';
       
    45 use File::Basename;
       
    46 use DBI;
       
    47 use Data::Dumper;
       
    48 use Getopt::Long;
       
    49 use File::Path;
       
    50 
       
    51 my $ME = basename $0;
       
    52 
       
    53 my $dsn =  "DBI:mysql:database=mail;host=pu.schlittermann.de";
       
    54 my $db_user = "exim";
       
    55 my $db_pass = undef;
       
    56 
       
    57 my $imap_from_host  = "pu.schlittermann.de";
       
    58 my $imap_to_host    = "cyrus.schlittermann.de";
       
    59 
       
    60 my $opt_dry = 0;
       
    61 my $opt_skip = 0;
       
    62 my $opt_logdir = "./imapsync-log/";
       
    63 
       
    64 GetOptions(
       
    65     "dry-ryn"	    =>	\$opt_dry,
       
    66     "skip"	    =>	\$opt_skip,
       
    67     "logdir=s"	    =>	\$opt_logdir,
       
    68 ) or die eval "\"$usage\"";
       
    69 
       
    70 
       
    71 ### connection to mysql account database
       
    72 my $dbh = DBI->connect($dsn, $db_user, $db_pass, { RaiseError => 1} ) or
       
    73     die "$ME: cannot conncet to mysql: $!\n";
       
    74 
       
    75 ### logfiles will go to: $opt_logdir
       
    76 -d $opt_logdir or mkpath $opt_logdir or die "$ME: cannot create log dir: $!\n";
       
    77 
       
    78 my %password_of_account_ =  ();
       
    79 
       
    80 ### reading list of mailboxes to import
       
    81 while (defined (my $mailbox = <>)) {
       
    82     chomp($mailbox);
       
    83     my ($user, $domain) = split('@', $mailbox);
       
    84 
       
    85     # lookup user@domain in accout db and save password
       
    86     my $sth = $dbh->prepare("SELECT userPassword FROM users WHERE user = ? AND domain = ?"); 
       
    87     $sth->execute($user, $domain);
       
    88     my $pass = ($sth->fetchrow_array())[0];
       
    89     
       
    90     if (not defined $pass) {
       
    91 	warn "$ME: mailbox $mailbox does not existion on imap server!\n";
       
    92 	$opt_skip or exit;
       
    93 	next;
       
    94     }
       
    95 
       
    96     $password_of_account_{$mailbox} = $pass;
       
    97 }
       
    98 
       
    99 ### starting imap migration
       
   100 
       
   101 foreach my $mailbox (keys %password_of_account_) {
       
   102     ### processing mailbox: $mailbox
       
   103     my $imapsync_options = "";
       
   104     $imapsync_options .= " --dry" if $opt_dry;
       
   105     my $logfile = "$opt_logdir/$mailbox.log";
       
   106 
       
   107     my $cmd = sprintf(	"imapsync %s --ssl1 --ssl2 --subscribed --subscribe"
       
   108 		    . " --host1 %s --host2 %s"
       
   109 		    . " --user1 %s --user2 %s --password1 %s --password2 %s > %s",
       
   110 		    $imapsync_options, $imap_from_host, $imap_to_host,
       
   111 		    $mailbox, $mailbox, $password_of_account_{$mailbox},
       
   112 		    $password_of_account_{$mailbox},
       
   113 		    $logfile);
       
   114 
       
   115     system($cmd);
       
   116     warn "$ME: migration of mailbox $mailbox failed, see $logfile\n" if ($? != 0);
       
   117 }
       
   118 
       
   119 # vim: sw=4 sts=4 aw