mirror of
https://github.com/imapsync/imapsync.git
synced 2024-11-17 00:02:29 +01:00
1.333
This commit is contained in:
parent
9372de1698
commit
250d6fab28
17
ChangeLog
17
ChangeLog
@ -1,17 +1,26 @@
|
||||
|
||||
RCS file: RCS/imapsync,v
|
||||
Working file: imapsync
|
||||
head: 1.331
|
||||
head: 1.333
|
||||
branch:
|
||||
locks: strict
|
||||
gilles: 1.331
|
||||
gilles: 1.333
|
||||
access list:
|
||||
symbolic names:
|
||||
keyword substitution: kv
|
||||
total revisions: 331; selected revisions: 331
|
||||
total revisions: 333; selected revisions: 333
|
||||
description:
|
||||
----------------------------
|
||||
revision 1.331 locked by: gilles;
|
||||
revision 1.333 locked by: gilles;
|
||||
date: 2010/07/14 23:55:13; author: gilles; state: Exp; lines: +7 -9
|
||||
docfix
|
||||
----------------------------
|
||||
revision 1.332
|
||||
date: 2010/07/14 23:09:02; author: gilles; state: Exp; lines: +251 -178
|
||||
Reviewed variable names.
|
||||
Began to push subroutines below main.
|
||||
----------------------------
|
||||
revision 1.331
|
||||
date: 2010/07/13 23:28:59; author: gilles; state: Exp; lines: +6 -6
|
||||
default values for h1_mess_duplicate h1_mess_size_total_duplicate
|
||||
----------------------------
|
||||
|
4
README
4
README
@ -3,7 +3,7 @@ NAME
|
||||
Synchronise mailboxes between two imap servers. Good at IMAP migration.
|
||||
More than 32 different IMAP server softwares supported with success.
|
||||
|
||||
$Revision: 1.331 $
|
||||
$Revision: 1.333 $
|
||||
|
||||
INSTALL
|
||||
imapsync works fine under any Unix OS with perl.
|
||||
@ -377,5 +377,5 @@ SIMILAR SOFTWARES
|
||||
|
||||
Feedback (good or bad) will always be welcome.
|
||||
|
||||
$Id: imapsync,v 1.331 2010/07/13 23:28:59 gilles Exp gilles $
|
||||
$Id: imapsync,v 1.333 2010/07/14 23:55:13 gilles Exp gilles $
|
||||
|
||||
|
2
TIME
2
TIME
@ -1,3 +1,5 @@
|
||||
|
||||
250 Reviewed varaibles names, statistics, sub definitions from top to connect_imap()
|
||||
120 W3C validation of web site
|
||||
120 --pidfile option. die_clean() exit_clean()
|
||||
120 reconnect counter, --debugimap1 --debugimap2
|
||||
|
433
imapsync
433
imapsync
@ -1,5 +1,15 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
# structure
|
||||
# pod documentation
|
||||
# pragmas
|
||||
# main program
|
||||
# global variables initialisation
|
||||
# default values
|
||||
# subroutines
|
||||
# IMAPClient 2.2.9 overrides
|
||||
# IMAPClient 2.2.9 3.xx ads
|
||||
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
@ -9,7 +19,7 @@ tool. Synchronise mailboxes between two imap servers. Good
|
||||
at IMAP migration. More than 32 different IMAP server softwares
|
||||
supported with success.
|
||||
|
||||
$Revision: 1.331 $
|
||||
$Revision: 1.333 $
|
||||
|
||||
=head1 INSTALL
|
||||
|
||||
@ -434,10 +444,13 @@ Entries for imapsync:
|
||||
|
||||
Feedback (good or bad) will always be welcome.
|
||||
|
||||
$Id: imapsync,v 1.331 2010/07/13 23:28:59 gilles Exp gilles $
|
||||
$Id: imapsync,v 1.333 2010/07/14 23:55:13 gilles Exp gilles $
|
||||
|
||||
=cut
|
||||
|
||||
|
||||
# pragmas
|
||||
|
||||
use warnings;
|
||||
++$|;
|
||||
use strict;
|
||||
@ -456,16 +469,15 @@ use File::Path qw(mkpath rmtree);
|
||||
use IO::Socket qw(:crlf SOL_SOCKET SO_KEEPALIVE);
|
||||
use Errno qw(EAGAIN EPIPE ECONNRESET);
|
||||
|
||||
|
||||
#use Test::Simple tests => 1;
|
||||
use Test::More 'no_plan';
|
||||
|
||||
eval { require 'usr/include/sysexits.ph' };
|
||||
|
||||
# global variables
|
||||
|
||||
my(
|
||||
$rcs, $pidfile,
|
||||
$debug, $debugimap, $debugimap1, $debugimap2, $error,
|
||||
$debug, $debugimap, $debugimap1, $debugimap2, $nb_errors,
|
||||
$host1, $host2, $port1, $port2,
|
||||
$user1, $user2, $password1, $password2, $passfile1, $passfile2,
|
||||
@folder, @include, @exclude, @folderrec,
|
||||
@ -484,15 +496,21 @@ my(
|
||||
$justfoldersizes,
|
||||
$authmd5,
|
||||
$subscribed, $subscribe, $subscribe_all,
|
||||
$version, $VERSION, $help,
|
||||
$version, $help,
|
||||
$justconnect, $justfolders, $justbanner,
|
||||
$fast,
|
||||
$mess_size_total_trans,
|
||||
$mess_size_total_skipped,
|
||||
$mess_size_total_error,
|
||||
$mess_trans, $mess_skipped, $mess_skipped_dry,
|
||||
$h1_mess_duplicate, $h1_mess_size_total_duplicate,
|
||||
$h1_mess_deleted, $h2_mess_deleted,
|
||||
$total_bytes_transferred,
|
||||
$total_bytes_skipped,
|
||||
$total_bytes_error,
|
||||
$nb_msg_transferred,
|
||||
$nb_msg_skipped,
|
||||
$nb_msg_skipped_dry_mode,
|
||||
$h1_nb_msg_duplicate,
|
||||
$h2_nb_msg_duplicate,
|
||||
$h1_total_bytes_duplicate,
|
||||
$h2_total_bytes_duplicate,
|
||||
$h1_nb_msg_deleted,
|
||||
$h2_nb_msg_deleted,
|
||||
$timeout,
|
||||
$timestart, $timeend, $timediff,
|
||||
$timesize, $timebefore,
|
||||
@ -507,153 +525,54 @@ my(
|
||||
$tmpdir,
|
||||
);
|
||||
|
||||
$rcs = '$Id: imapsync,v 1.331 2010/07/13 23:28:59 gilles Exp gilles $ ';
|
||||
$rcs =~ m/,v (\d+\.\d+)/;
|
||||
$VERSION = ($1) ? $1: "UNKNOWN";
|
||||
# main program
|
||||
|
||||
my $VERSION_IMAPClient = $Mail::IMAPClient::VERSION;
|
||||
# global variables initialisation
|
||||
|
||||
$mess_size_total_trans = 0;
|
||||
$mess_size_total_skipped = 0;
|
||||
$mess_size_total_error = 0;
|
||||
$mess_trans = $mess_skipped = $mess_skipped_dry = 0;
|
||||
$h1_mess_deleted = $h2_mess_deleted = 0;
|
||||
$h1_mess_duplicate = $h1_mess_size_total_duplicate = 0;
|
||||
$rcs = '$Id: imapsync,v 1.333 2010/07/14 23:55:13 gilles Exp gilles $ ';
|
||||
|
||||
$total_bytes_transferred = 0;
|
||||
$total_bytes_skipped = 0;
|
||||
$total_bytes_error = 0;
|
||||
$nb_msg_transferred = 0;
|
||||
$nb_msg_skipped = $nb_msg_skipped_dry_mode = 0;
|
||||
$h1_nb_msg_deleted = $h2_nb_msg_deleted = 0;
|
||||
$h1_nb_msg_duplicate = $h2_nb_msg_duplicate =0;
|
||||
$h1_total_bytes_duplicate = $h2_total_bytes_duplicate = 0;
|
||||
|
||||
sub check_lib_version {
|
||||
$debug and print "VERSION_IMAPClient $VERSION_IMAPClient\n";
|
||||
if ($VERSION_IMAPClient eq '2.2.9') {
|
||||
override_imapclient();
|
||||
return(1);
|
||||
}
|
||||
else{
|
||||
# 3.x.x is no longer buggy with imapsync.
|
||||
if ($allow3xx) {
|
||||
return(1);
|
||||
|
||||
}else{
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$error=0;
|
||||
|
||||
sub modules_VERSION() {
|
||||
|
||||
no warnings 'uninitialized';
|
||||
my $modules_releases = "
|
||||
Mail::IMAPClient $Mail::IMAPClient::VERSION
|
||||
IO::Socket $IO::Socket::VERSION
|
||||
IO::Socket::SSL $IO::Socket::SSL::VERSION
|
||||
Digest::MD5 $Digest::MD5::VERSION
|
||||
Digest::HMAC_MD5 $Digest::HMAC_MD5::VERSION
|
||||
Term::ReadKey $Term::ReadKey::VERSION
|
||||
Date::Manip $Date::Manip::VERSION
|
||||
";
|
||||
return($modules_releases);
|
||||
|
||||
}
|
||||
|
||||
|
||||
# Construct a command line copy with passwords replaced by MASKED.
|
||||
my @argv_nopassord;
|
||||
my @argv_copy = @ARGV;
|
||||
while (@argv_copy) {
|
||||
my $arg = shift(@argv_copy);
|
||||
if ($arg =~ m/-password[12]/) {
|
||||
shift(@argv_copy);
|
||||
push(@argv_nopassord, $arg, "MASKED");
|
||||
}else{
|
||||
push(@argv_nopassord, $arg);
|
||||
}
|
||||
}
|
||||
|
||||
my $banner_imapsync = join("",
|
||||
'$RCSfile: imapsync,v $ ',
|
||||
'$Revision: 1.331 $ ',
|
||||
'$Date: 2010/07/13 23:28:59 $ ',
|
||||
"\n",localhost_info(), "\n",
|
||||
"Command line used:\n",
|
||||
"$0 @argv_nopassord\n",
|
||||
);
|
||||
$nb_errors = 0;
|
||||
|
||||
unless(defined(&_SYSEXITS_H)) {
|
||||
# 64 on my linux box.
|
||||
eval 'sub EX_USAGE () {64;}' unless defined(&EX_USAGE);
|
||||
}
|
||||
|
||||
# @ARGV will be eat by get_options
|
||||
my @argv_copy = @ARGV;
|
||||
get_options();
|
||||
|
||||
|
||||
sub write_pidfile {
|
||||
my $pidfile = shift;
|
||||
|
||||
print "PID file is $pidfile\n";
|
||||
if (-e $pidfile) {
|
||||
warn "$pidfile already exists, overwriting it\n";
|
||||
}
|
||||
open(PIDFILE, ">$pidfile") or do {
|
||||
warn "Could not open $pidfile for writing";
|
||||
return undef;
|
||||
};
|
||||
|
||||
print PIDFILE $PROCESS_ID;
|
||||
close PIDFILE;
|
||||
return($PROCESS_ID);
|
||||
}
|
||||
# default values
|
||||
|
||||
$tmpdir ||= File::Spec->tmpdir();
|
||||
|
||||
$pidfile ||= $tmpdir . '/imapsync.pid';
|
||||
|
||||
sub check_dir {
|
||||
my $dir = shift;
|
||||
return(1) if (-d $dir and -r _ and -w _);
|
||||
# Trying to create it
|
||||
mkpath($dir) or die "Error creating tmpdir $tmpdir : $!";
|
||||
die "Error with tmpdir $tmpdir : $!" if not (-d $dir and -r _ and -w _);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
|
||||
# allow Mail::IMAPClient 3.0.xx by default
|
||||
|
||||
$allow3xx = defined($allow3xx) ? $allow3xx : 1;
|
||||
|
||||
check_lib_version() or
|
||||
die "imapsync needs perl lib Mail::IMAPClient release 2.2.9, or 3.0.25 or superior \n";
|
||||
|
||||
print banner_imapsync(@argv_copy);
|
||||
|
||||
print $banner_imapsync;
|
||||
print "Temp directory is $tmpdir\n";
|
||||
|
||||
check_dir($tmpdir);
|
||||
is_valid_directory($tmpdir);
|
||||
write_pidfile($pidfile) if ($pidfile);
|
||||
|
||||
print "Modules version list:\n", modules_VERSION(), "\n";
|
||||
|
||||
exit_clean(0) if ($justbanner);
|
||||
|
||||
sub exit_clean {
|
||||
my $status = shift;
|
||||
|
||||
unlink($pidfile);
|
||||
exit($status);
|
||||
}
|
||||
|
||||
sub die_clean {
|
||||
|
||||
unlink($pidfile);
|
||||
die @_;
|
||||
}
|
||||
|
||||
sub missing_option {
|
||||
my ($option) = @_;
|
||||
die_clean "$option option must be used, run $0 --help for help\n";
|
||||
}
|
||||
|
||||
# By default, 1000 at a time, not more.
|
||||
$split1 ||= 1000;
|
||||
$split2 ||= 1000;
|
||||
@ -1232,7 +1151,7 @@ sub foldersizes {
|
||||
warn
|
||||
"$side Folder $folder: Could not select: ",
|
||||
$imap->LastError, "\n";
|
||||
$error++;
|
||||
$nb_errors++;
|
||||
next;
|
||||
}
|
||||
if (defined($maxage) or defined($minage)) {
|
||||
@ -1596,7 +1515,7 @@ FOLDER: foreach my $h1_fold (@h1_folders) {
|
||||
warn
|
||||
"Host1 Folder $h1_fold: Could not select: ",
|
||||
$imap1->LastError, "\n";
|
||||
$error++;
|
||||
$nb_errors++;
|
||||
next FOLDER;
|
||||
}
|
||||
|
||||
@ -1607,7 +1526,7 @@ FOLDER: foreach my $h1_fold (@h1_folders) {
|
||||
unless ($imap2->create($h2_fold)){
|
||||
warn "Couldn't create [$h2_fold]: ",
|
||||
$imap2->LastError,"\n";
|
||||
$error++;
|
||||
$nb_errors++;
|
||||
next FOLDER;
|
||||
}
|
||||
}
|
||||
@ -1622,7 +1541,7 @@ FOLDER: foreach my $h1_fold (@h1_folders) {
|
||||
warn
|
||||
"Host2 folder $h2_fold: Could not select: ",
|
||||
$imap2->LastError, "\n";
|
||||
$error++;
|
||||
$nb_errors++;
|
||||
next FOLDER;
|
||||
}
|
||||
my @select_results = $imap2->Results();
|
||||
@ -1649,10 +1568,8 @@ FOLDER: foreach my $h1_fold (@h1_folders) {
|
||||
|
||||
my @h1_msgs = select_msgs($imap1);
|
||||
|
||||
|
||||
|
||||
$debug and print "LIST Host1: ", scalar(@h1_msgs), " messages [@h1_msgs]\n";
|
||||
# internal dates on "TO" are after the ones on "FROM"
|
||||
# internal dates on host2 are after the ones on host1
|
||||
# normally...
|
||||
my @h2_msgs = select_msgs($imap2);
|
||||
|
||||
@ -1679,7 +1596,7 @@ FOLDER: foreach my $h1_fold (@h1_folders) {
|
||||
warn
|
||||
"Host1 Folder $h1_fold: Could not fetch_hash ",
|
||||
scalar(@h1_msgs), " msgs: ", $imap1->LastError, "\n";
|
||||
$error++;
|
||||
$nb_errors++;
|
||||
next FOLDER;
|
||||
}
|
||||
last FOLDER if $imap1->IsUnconnected();
|
||||
@ -1691,15 +1608,15 @@ FOLDER: foreach my $h1_fold (@h1_folders) {
|
||||
if (! defined($rc)) {
|
||||
my $h1_size = $h1_fir->{$m}->{"RFC822.SIZE"} || 0;
|
||||
print "+ Skipping msg #$m:$h1_size on host1 folder $h1_fold (no header so we ignore this message)\n";
|
||||
$mess_size_total_skipped += $h1_size;
|
||||
$mess_skipped += 1;
|
||||
$total_bytes_skipped += $h1_size;
|
||||
$nb_msg_skipped += 1;
|
||||
} elsif(0 == $rc) {
|
||||
# duplicate
|
||||
push(@h1_msgs_duplicate, $m);
|
||||
# duplicate, same id same size?
|
||||
my $h1_size = $h1_fir->{$m}->{"RFC822.SIZE"} || 0;
|
||||
$h1_mess_size_total_duplicate += $h1_size;
|
||||
$h1_mess_duplicate += 1;
|
||||
$h1_total_bytes_duplicate += $h1_size;
|
||||
$h1_nb_msg_duplicate += 1;
|
||||
}
|
||||
}
|
||||
$debug and print "Time parsing headers on host1: ", timenext(), " s\n";
|
||||
@ -1724,6 +1641,9 @@ FOLDER: foreach my $h1_fold (@h1_folders) {
|
||||
print "+ Skipping msg #$m:$h2_size in host2 folder $h2_fold (no header so we ignore this message)\n";
|
||||
} elsif(0 == $rc) {
|
||||
# duplicate
|
||||
my $h2_size = $h2_fir->{$m}->{"RFC822.SIZE"} || 0;
|
||||
$h2_nb_msg_duplicate += 1;
|
||||
$h2_total_bytes_duplicate += $h2_size;
|
||||
push(@h2_msgs_duplicate, $m);
|
||||
}
|
||||
}
|
||||
@ -1754,7 +1674,7 @@ FOLDER: foreach my $h1_fold (@h1_folders) {
|
||||
push(@h2_expunge, $h2_msg) if $uidexpunge2;
|
||||
unless ($dry or $isdel) {
|
||||
$imap2->delete_message($h2_msg);
|
||||
$h2_mess_deleted += 1;
|
||||
$h2_nb_msg_deleted += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1763,7 +1683,7 @@ FOLDER: foreach my $h1_fold (@h1_folders) {
|
||||
push(@h2_expunge, $h2_msg) if $uidexpunge2;
|
||||
unless ($dry) {
|
||||
$imap2->delete_message($h2_msg);
|
||||
$h2_mess_deleted += 1;
|
||||
$h2_nb_msg_deleted += 1;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1784,8 +1704,8 @@ FOLDER: foreach my $h1_fold (@h1_folders) {
|
||||
|
||||
if (defined $maxsize and $h1_size > $maxsize) {
|
||||
print "+ Skipping msg #$h1_msg:$h1_size in host1 folder $h1_fold (exceeds maxsize limit $maxsize bytes)\n";
|
||||
$mess_size_total_skipped += $h1_size;
|
||||
$mess_skipped += 1;
|
||||
$total_bytes_skipped += $h1_size;
|
||||
$nb_msg_skipped += 1;
|
||||
next MESS;
|
||||
}
|
||||
$debug and print "+ key $m_id #$h1_msg\n";
|
||||
@ -1801,8 +1721,8 @@ FOLDER: foreach my $h1_fold (@h1_folders) {
|
||||
warn
|
||||
"Could not fetch message #$h1_msg from $h1_fold: ",
|
||||
$imap1->LastError, "\n";
|
||||
$error++;
|
||||
$mess_size_total_error += $h1_size;
|
||||
$nb_errors++;
|
||||
$total_bytes_error += $h1_size;
|
||||
next MESS;
|
||||
}
|
||||
|
||||
@ -1812,8 +1732,8 @@ FOLDER: foreach my $h1_fold (@h1_folders) {
|
||||
#$imap1->message_to_file($message_file, $h1_msg) or do {
|
||||
# warn "Could not put message #$h1_msg to file $message_file",
|
||||
# $imap1->LastError;
|
||||
# $error++;
|
||||
# $mess_size_total_error += $h1_size;
|
||||
# $nb_errors++;
|
||||
# $total_bytes_error += $h1_size;
|
||||
# next MESS;
|
||||
#};
|
||||
#$string = file_to_string($message_file);
|
||||
@ -1959,8 +1879,8 @@ Bye.'
|
||||
warn "Couldn't append msg #$h1_msg (Subject:[".
|
||||
$imap1->subject($h1_msg)."]) to folder $h2_fold: ",
|
||||
$imap2->LastError, "\n";
|
||||
$error++;
|
||||
$mess_size_total_error += $h1_size;
|
||||
$nb_errors++;
|
||||
$total_bytes_error += $h1_size;
|
||||
next MESS;
|
||||
}
|
||||
else{
|
||||
@ -1968,13 +1888,13 @@ Bye.'
|
||||
# $new_id is an id if the IMAP server has the
|
||||
# UIDPLUS capability else just a ref
|
||||
print "Copied msg id [$h1_msg] to folder $h2_fold msg id [$new_id]\n";
|
||||
$mess_size_total_trans += $h1_size;
|
||||
$mess_trans += 1;
|
||||
$total_bytes_transferred += $h1_size;
|
||||
$nb_msg_transferred += 1;
|
||||
if($delete) {
|
||||
print "Deleting msg #$h1_msg in host1 folder $h1_fold\n";
|
||||
print "Deleting msg #$h1_msg on host1 folder $h1_fold\n";
|
||||
unless($dry) {
|
||||
$imap1->delete_message($h1_msg);
|
||||
$h1_mess_deleted += 1;
|
||||
$h1_nb_msg_deleted += 1;
|
||||
last FOLDER if $imap1->IsUnconnected();
|
||||
$imap1->expunge() if ($expunge);
|
||||
last FOLDER if $imap1->IsUnconnected();
|
||||
@ -1983,15 +1903,15 @@ Bye.'
|
||||
}
|
||||
}
|
||||
else{
|
||||
$mess_skipped_dry += 1;
|
||||
$nb_msg_skipped_dry_mode += 1;
|
||||
}
|
||||
#unlink($message_file);
|
||||
next MESS;
|
||||
}
|
||||
else{
|
||||
$debug and print "Message id [$m_id] found in t:$h2_fold\n";
|
||||
$mess_size_total_skipped += $h1_size;
|
||||
$mess_skipped += 1;
|
||||
$total_bytes_skipped += $h1_size;
|
||||
$nb_msg_skipped += 1;
|
||||
}
|
||||
|
||||
$fast and next MESS;
|
||||
@ -2025,7 +1945,7 @@ Bye.'
|
||||
warn "Could not add flags @h1_flags",
|
||||
" on msg #$h2_msg in $h2_fold: ",
|
||||
$imap2->LastError, "\n";
|
||||
#$error++;
|
||||
#$nb_errors++;
|
||||
}
|
||||
last FOLDER if $imap2->IsUnconnected();
|
||||
|
||||
@ -2053,17 +1973,17 @@ Bye.'
|
||||
# Bad size
|
||||
print
|
||||
"Message $m_id SZ_BAD f:$h1_msg:$h1_size t:$h2_msg:$h2_size\n";
|
||||
$error++;
|
||||
$nb_errors++;
|
||||
}
|
||||
else {
|
||||
# Good
|
||||
$debug and print
|
||||
"Message $m_id SZ_GOOD f:$h1_msg:$h1_size t:$h2_msg:$h2_size\n";
|
||||
if($delete) {
|
||||
print "Deleting msg #$h1_msg in host1 folder $h1_fold\n";
|
||||
print "Deleting msg #$h1_msg on host1 folder $h1_fold\n";
|
||||
unless($dry) {
|
||||
$imap1->delete_message($h1_msg);
|
||||
$h1_mess_deleted += 1;
|
||||
$h1_nb_msg_deleted += 1;
|
||||
$imap1->expunge() if ($expunge);
|
||||
}
|
||||
}
|
||||
@ -2106,7 +2026,7 @@ sub _filter {
|
||||
sub lost_connection {
|
||||
my($imap, $error_message) = @_;
|
||||
if ( $imap->IsUnconnected() ) {
|
||||
$error++;
|
||||
$nb_errors++;
|
||||
my $lcomm = $imap->LastIMAPCommand || "";
|
||||
my $einfo = $imap->LastError || @{$imap->History}[-1] || "";
|
||||
|
||||
@ -2133,10 +2053,156 @@ $timediff = $timeend - $timestart;
|
||||
|
||||
stats();
|
||||
|
||||
exit_clean(1) if($error);
|
||||
exit_clean(1) if($nb_errors);
|
||||
|
||||
exit_clean(0);
|
||||
|
||||
# END of main program
|
||||
|
||||
# subroutines
|
||||
|
||||
sub imapsync_version {
|
||||
my $rcs = '$Id: imapsync,v 1.333 2010/07/14 23:55:13 gilles Exp gilles $ ';
|
||||
$rcs =~ m/,v (\d+\.\d+)/;
|
||||
my $VERSION = ($1) ? $1: "UNKNOWN";
|
||||
return($VERSION);
|
||||
}
|
||||
|
||||
|
||||
sub check_lib_version {
|
||||
$debug and print "IMAPClient $Mail::IMAPClient::VERSION\n";
|
||||
if ($Mail::IMAPClient::VERSION eq '2.2.9') {
|
||||
override_imapclient();
|
||||
return(1);
|
||||
}
|
||||
else{
|
||||
# 3.x.x is no longer buggy with imapsync.
|
||||
if ($allow3xx) {
|
||||
return(1);
|
||||
}else{
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub modules_VERSION {
|
||||
|
||||
my @list_version;
|
||||
|
||||
foreach my $module (qw(
|
||||
Mail::IMAPClient
|
||||
IO::Socket
|
||||
IO::Socket::SSL
|
||||
Digest::MD5
|
||||
Digest::HMAC_MD5
|
||||
Term::ReadKey
|
||||
Date::Manip))
|
||||
{
|
||||
my $v = "?";
|
||||
|
||||
if (eval "require $module") {
|
||||
# module is here
|
||||
$v = eval "\$${module}::VERSION";
|
||||
}else{
|
||||
# no module
|
||||
$v = "?";
|
||||
}
|
||||
#print ("$module ", $v, "\n");
|
||||
push (@list_version, sprintf("%-20s %s\n", $module, $v));
|
||||
}
|
||||
return(@list_version);
|
||||
}
|
||||
|
||||
# Construct a command line copy with passwords replaced by MASKED.
|
||||
sub command_line_nopassword {
|
||||
my @argv_copy = @_;
|
||||
my @argv_nopassword;
|
||||
while (@argv_copy) {
|
||||
my $arg = shift(@argv_copy); # option name or value
|
||||
if ($arg =~ m/-password[12]/) {
|
||||
shift(@argv_copy); # password value
|
||||
push(@argv_nopassword, $arg, "MASKED"); # option name and fake value
|
||||
}else{
|
||||
push(@argv_nopassword, $arg); # same option or value
|
||||
}
|
||||
}
|
||||
return("@argv_nopassword");
|
||||
}
|
||||
|
||||
sub tests_command_line_nopassword {
|
||||
|
||||
ok('' eq command_line_nopassword(), 'command_line_nopassword void');
|
||||
ok('--blabla' eq command_line_nopassword('--blabla'), 'command_line_nopassword --blabla');
|
||||
#print command_line_nopassword((qw{ --password1 secret1 })), "\n";
|
||||
ok('--password1 MASKED' eq command_line_nopassword(qw{ --password1 secret1}), 'command_line_nopassword --password1');
|
||||
ok('--blabla --password1 MASKED --blibli'
|
||||
eq command_line_nopassword(qw{ --blabla --password1 secret1 --blibli }), 'command_line_nopassword --password1 --blibli');
|
||||
|
||||
|
||||
}
|
||||
|
||||
sub banner_imapsync {
|
||||
|
||||
my @argv_copy = @_;
|
||||
my $banner_imapsync = join("",
|
||||
'$RCSfile: imapsync,v $ ',
|
||||
'$Revision: 1.333 $ ',
|
||||
'$Date: 2010/07/14 23:55:13 $ ',
|
||||
"\n",localhost_info(), "\n",
|
||||
"Command line used:\n",
|
||||
"$0 ", command_line_nopassword(@argv_copy), "\n",
|
||||
);
|
||||
}
|
||||
|
||||
sub is_valid_directory {
|
||||
my $dir = shift;
|
||||
return(1) if (-d $dir and -r _ and -w _);
|
||||
# Trying to create it
|
||||
mkpath($dir) or die "Error creating tmpdir $tmpdir : $!";
|
||||
die "Error with tmpdir $tmpdir : $!" if not (-d $dir and -r _ and -w _);
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
sub write_pidfile {
|
||||
my $pidfile = shift;
|
||||
|
||||
print "PID file is $pidfile\n";
|
||||
if (-e $pidfile) {
|
||||
warn "$pidfile already exists, overwriting it\n";
|
||||
}
|
||||
open(PIDFILE, ">$pidfile") or do {
|
||||
warn "Could not open $pidfile for writing";
|
||||
return undef;
|
||||
};
|
||||
|
||||
print PIDFILE $PROCESS_ID;
|
||||
close PIDFILE;
|
||||
return($PROCESS_ID);
|
||||
}
|
||||
|
||||
sub exit_clean {
|
||||
my $status = shift;
|
||||
|
||||
unlink($pidfile);
|
||||
exit($status);
|
||||
}
|
||||
|
||||
sub die_clean {
|
||||
|
||||
unlink($pidfile);
|
||||
die @_;
|
||||
}
|
||||
|
||||
sub missing_option {
|
||||
my ($option) = @_;
|
||||
die_clean("$option option must be used, run $0 --help for help\n");
|
||||
}
|
||||
|
||||
|
||||
|
||||
sub select_msgs {
|
||||
my ($imap) = @_;
|
||||
my (@msgs,@max,@min,@union,@inter);
|
||||
@ -2169,31 +2235,33 @@ sub select_msgs {
|
||||
|
||||
sub stats {
|
||||
print "++++ Statistics ++++\n";
|
||||
print "Time : $timediff sec\n";
|
||||
print "Messages transferred : $mess_trans ";
|
||||
print "(could be $mess_skipped_dry without dry mode)" if ($dry);
|
||||
print "Transfer time : $timediff sec\n";
|
||||
print "Messages transferred : $nb_msg_transferred ";
|
||||
print "(could be $nb_msg_skipped_dry_mode without dry mode)" if ($dry);
|
||||
print "\n";
|
||||
print "Messages skipped : $mess_skipped\n";
|
||||
print "Messages duplicate on host1 : $h1_mess_duplicate\n";
|
||||
print "Messages deleted on host1 : $h1_mess_deleted\n";
|
||||
print "Messages deleted on host2 : $h2_mess_deleted\n";
|
||||
print "Total bytes transferred : $mess_size_total_trans\n";
|
||||
print "Total bytes duplicate host1 : $h1_mess_size_total_duplicate\n";
|
||||
print "Total bytes skipped : $mess_size_total_skipped\n";
|
||||
print "Total bytes error : $mess_size_total_error\n";
|
||||
print "Messages skipped : $nb_msg_skipped\n";
|
||||
print "Messages duplicate on host1 : $h1_nb_msg_duplicate\n";
|
||||
print "Messages duplicate on host2 : $h2_nb_msg_duplicate\n";
|
||||
print "Messages deleted on host1 : $h1_nb_msg_deleted\n";
|
||||
print "Messages deleted on host2 : $h2_nb_msg_deleted\n";
|
||||
print "Total bytes transferred : $total_bytes_transferred\n";
|
||||
print "Total bytes duplicate host1 : $h1_total_bytes_duplicate\n";
|
||||
print "Total bytes duplicate host2 : $h2_total_bytes_duplicate\n";
|
||||
print "Total bytes skipped : $total_bytes_skipped\n";
|
||||
print "Total bytes error : $total_bytes_error\n";
|
||||
$timediff ||= 1; # No division per 0
|
||||
printf ("Average bandwidth rate : %.1f KiB/s\n", $mess_size_total_trans / 1024 / $timediff);
|
||||
printf ("Message rate : %.1f messages/s\n", $nb_msg_transferred / $timediff);
|
||||
printf ("Average bandwidth rate : %.1f KiB/s\n", $total_bytes_transferred / 1024 / $timediff);
|
||||
print "Reconnections to host1 : $host1_reconnect_count\n";
|
||||
print "Reconnections to host2 : $host2_reconnect_count\n";
|
||||
print "Detected $error errors\n\n";
|
||||
print "Detected $nb_errors errors\n\n";
|
||||
print thank_author();
|
||||
}
|
||||
|
||||
sub thank_author {
|
||||
|
||||
return(join("", "Happy with this free, open and gratis DWTFPL software?\n",
|
||||
"Encourage the author (Gilles LAMIRAL) by giving him a book:\n",
|
||||
"http://www.amazon.com/gp/registry/wishlist/1C9UNDIH3P7R7/\n",
|
||||
"Encourage the author (Gilles LAMIRAL) by giving him a book\n",
|
||||
"or just money via paypal:\n",
|
||||
"http://www.linux-france.org/prj/imapsync/\n"));
|
||||
}
|
||||
@ -2292,7 +2360,7 @@ sub get_options {
|
||||
$debug and print "get options: [$opt_ret]\n";
|
||||
|
||||
# just the version
|
||||
print "$VERSION\n" and exit if ($version) ;
|
||||
print imapsync_version(), "\n" and exit if ($version) ;
|
||||
|
||||
if ($tests) {
|
||||
$test_builder->no_ending(0);
|
||||
@ -2615,9 +2683,12 @@ sub tests {
|
||||
tests_permanentflags();
|
||||
tests_flags_filter();
|
||||
tests_imap2_folder_name();
|
||||
tests_command_line_nopassword();
|
||||
}
|
||||
}
|
||||
|
||||
# IMAPClient 2.2.9 overrides
|
||||
|
||||
sub override_imapclient {
|
||||
no warnings 'redefine';
|
||||
no strict 'subs';
|
||||
@ -3714,7 +3785,7 @@ sub starttls {
|
||||
$banner;
|
||||
}
|
||||
|
||||
|
||||
# IMAPClient 2.2.9 3.xx ads
|
||||
|
||||
package Mail::IMAPClient;
|
||||
|
||||
|
13
index.shtml
13
index.shtml
@ -2,10 +2,10 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<title>imapsync</title>
|
||||
<title>imapsync <!--#exec cmd="cat VERSION" --> </title>
|
||||
<meta name="generator" content="Bluefish 1.0.7"/>
|
||||
<meta name="author" content="Gilles LAMIRAL"/>
|
||||
<meta name="date" content="2010-07-14T15:55:32+0200"/>
|
||||
<meta name="date" content="2010-07-15T02:06:30+0200"/>
|
||||
<meta name="copyright" content="None"/>
|
||||
<meta name="keywords" content="imap, transfert, migration"/>
|
||||
<meta name="description" content="imap migration tool"/>
|
||||
@ -47,8 +47,8 @@ recursive <b>imap</b> transfers from one mailbox to another.
|
||||
imapsync mailing-list (see below).</p>
|
||||
|
||||
<p>Gilles LAMIRAL earns his living writing, installing, configuring and
|
||||
teaching free, open and gratis softwares. Do not hesitate to pay him for
|
||||
that services.</p>
|
||||
teaching free, open and gratis softwares. <br/>
|
||||
Do not hesitate to pay him for that services.</p>
|
||||
|
||||
<p>If you <b>use imapsync</b> as a <b>professionnal worker</b> you may
|
||||
<b><a href="http://www.linux-france.org/prj/imapsync_list/msg00470.html">read this call</a></b>
|
||||
@ -57,7 +57,7 @@ recursive <b>imap</b> transfers from one mailbox to another.
|
||||
|
||||
<h2>imapsync donation</h2>
|
||||
<p>Happy with this <b>free</b>, <b>open</b> and <b>gratis</b> software?<br/></p>
|
||||
<p>Help the author to maintain imapsync and support users:</p>
|
||||
<p><b>Help</b> the author to <b>maintain</b> imapsync and <b>support</b> users:</p>
|
||||
|
||||
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
|
||||
<p>
|
||||
@ -161,9 +161,8 @@ If you really want a feature you can donate money and I'll code it.<br/>
|
||||
<!--#config timefmt="%D" -->
|
||||
<!--#config timefmt="%A %B %d, %Y" -->
|
||||
This document last modified <!--#echo var="LAST_MODIFIED" --> <br/>
|
||||
$Id: index.shtml,v 1.9 2010/07/14 13:56:44 gilles Exp gilles $
|
||||
$Id: index.shtml,v 1.10 2010/07/15 00:06:46 gilles Exp gilles $
|
||||
</p>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
143
tests.sh
143
tests.sh
@ -1,6 +1,6 @@
|
||||
#!/bin/sh
|
||||
|
||||
# $Id: tests.sh,v 1.105 2010/07/12 00:14:00 gilles Exp gilles $
|
||||
# $Id: tests.sh,v 1.106 2010/07/14 23:25:14 gilles Exp gilles $
|
||||
|
||||
# Example:
|
||||
# CMD_PERL='perl -I./Mail-IMAPClient-3.14/lib' sh -x tests.sh
|
||||
@ -40,7 +40,7 @@ run_tests() {
|
||||
for t in "$@"; do
|
||||
test_count=`expr 1 + $test_count`
|
||||
run_test "$t"
|
||||
sleep 1
|
||||
#sleep 1
|
||||
done
|
||||
}
|
||||
|
||||
@ -1286,9 +1286,80 @@ genomics() {
|
||||
##########################
|
||||
##########################
|
||||
|
||||
# Tests list
|
||||
|
||||
mandatory_tests='
|
||||
no_args
|
||||
option_version
|
||||
option_tests
|
||||
option_bad_delete2
|
||||
first_sync_dry
|
||||
first_sync
|
||||
locallocal
|
||||
ll_pidfile
|
||||
ll_ask_password
|
||||
ll_bug_folder_name_with_blank
|
||||
ll_timeout
|
||||
ll_folder
|
||||
ll_buffersize
|
||||
ll_justfolders
|
||||
ll_prefix12
|
||||
ll_internaldate
|
||||
ll_idatefromheader
|
||||
ll_folder_rev
|
||||
ll_subscribed
|
||||
ll_subscribe
|
||||
ll_justfoldersizes
|
||||
ll_authmd5
|
||||
ll_noauthmd5
|
||||
ll_maxage
|
||||
ll_maxsize
|
||||
ll_skipsize
|
||||
ll_skipheader
|
||||
ll_include
|
||||
ll_exclude
|
||||
ll_regextrans2
|
||||
ll_sep2
|
||||
ll_bad_login
|
||||
ll_bad_host
|
||||
ll_bad_host_ssl
|
||||
ll_justfoldersizes
|
||||
ll_useheader
|
||||
ll_regexmess
|
||||
ll_regexmess_scwchu
|
||||
ll_flags
|
||||
ll_regex_flag
|
||||
ll_regex_flag_keep_only
|
||||
ll_justconnect
|
||||
ll_justlogin
|
||||
ll_ssl
|
||||
ll_ssl_justconnect
|
||||
ll_ssl_justlogin
|
||||
ll_tls_justconnect
|
||||
ll_tls_justlogin
|
||||
ll_tls
|
||||
ll_authmech_PLAIN
|
||||
ll_authmech_LOGIN
|
||||
ll_authmech_CRAMMD5
|
||||
ll_authuser
|
||||
ll_delete2
|
||||
ll_delete
|
||||
ll_folderrec
|
||||
ll_bigmail
|
||||
gmail
|
||||
gmail_gmail
|
||||
gmail_gmail2
|
||||
archiveopteryx_1
|
||||
allow3xx
|
||||
noallow3xx'
|
||||
|
||||
other_tests='
|
||||
msw
|
||||
ll_justlogin_backslash_char'
|
||||
|
||||
l() {
|
||||
echo "$mandatory_tests" "$other_tests"
|
||||
}
|
||||
|
||||
# mandatory tests
|
||||
|
||||
@ -1296,73 +1367,7 @@ run_tests perl_syntax
|
||||
|
||||
# All tests
|
||||
|
||||
test $# -eq 0 && run_tests \
|
||||
no_args \
|
||||
option_version \
|
||||
option_tests \
|
||||
option_bad_delete2 \
|
||||
first_sync_dry \
|
||||
first_sync \
|
||||
locallocal \
|
||||
ll_pidfile \
|
||||
ll_ask_password \
|
||||
ll_bug_folder_name_with_blank \
|
||||
ll_timeout \
|
||||
ll_folder \
|
||||
ll_buffersize \
|
||||
ll_justfolders \
|
||||
ll_prefix12 \
|
||||
ll_internaldate \
|
||||
ll_idatefromheader \
|
||||
ll_folder_rev \
|
||||
ll_subscribed \
|
||||
ll_subscribe \
|
||||
ll_justfoldersizes \
|
||||
ll_authmd5 \
|
||||
ll_noauthmd5 \
|
||||
ll_maxage \
|
||||
ll_maxsize \
|
||||
ll_skipsize \
|
||||
ll_skipheader \
|
||||
ll_include \
|
||||
ll_exclude \
|
||||
ll_regextrans2 \
|
||||
ll_sep2 \
|
||||
ll_bad_login \
|
||||
ll_bad_host \
|
||||
ll_bad_host_ssl \
|
||||
ll_justfoldersizes \
|
||||
ll_useheader \
|
||||
ll_regexmess \
|
||||
ll_regexmess_scwchu \
|
||||
ll_flags \
|
||||
ll_regex_flag \
|
||||
ll_regex_flag_keep_only \
|
||||
ll_justconnect \
|
||||
ll_justlogin \
|
||||
ll_ssl \
|
||||
ll_ssl_justconnect \
|
||||
ll_ssl_justlogin \
|
||||
ll_tls_justconnect \
|
||||
ll_tls_justlogin \
|
||||
ll_tls \
|
||||
ll_authmech_PLAIN \
|
||||
ll_authmech_LOGIN \
|
||||
ll_authmech_CRAMMD5 \
|
||||
ll_authuser \
|
||||
ll_delete2 \
|
||||
ll_delete \
|
||||
ll_folderrec \
|
||||
ll_bigmail \
|
||||
gmail \
|
||||
gmail_gmail \
|
||||
gmail_gmail2 \
|
||||
archiveopteryx_1 \
|
||||
allow3xx \
|
||||
noallow3xx \
|
||||
|
||||
# msw
|
||||
# ll_justlogin_backslash_char
|
||||
test $# -eq 0 && run_tests $mandatory_tests
|
||||
|
||||
|
||||
# selective tests
|
||||
|
Loading…
Reference in New Issue
Block a user