|
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 |