X-Git-Url: http://git.rot13.org/?p=BackupPC.git;a=blobdiff_plain;f=lib%2FBackupPC%2FXfer%2FRsync.pm;h=8972a98f887c6a34d77e646ce76c9eae3148fce8;hp=e8b605adf78b045dabc1679479f283bf64a091fd;hb=5b3e6091d542c2e7445d5dd511cdf6e20aec8b8d;hpb=bd6334a9c72e7fa75f13fd6426f5a8a8cd4ab8b1 diff --git a/lib/BackupPC/Xfer/Rsync.pm b/lib/BackupPC/Xfer/Rsync.pm index e8b605a..8972a98 100644 --- a/lib/BackupPC/Xfer/Rsync.pm +++ b/lib/BackupPC/Xfer/Rsync.pm @@ -29,7 +29,7 @@ # #======================================================================== # -# Version 2.1.0_CVS, released 8 Feb 2004. +# Version 3.0.0alpha, released 23 Jan 2006. # # See http://backuppc.sourceforge.net. # @@ -52,9 +52,13 @@ BEGIN { $RsyncLibOK = 0; $RsyncLibErr = "File::RsyncP module doesn't exist"; } else { - if ( $File::RsyncP::VERSION < 0.44 ) { + # + # Note: also update configure.pl when this version number is changed! + # + if ( $File::RsyncP::VERSION < 0.52 ) { $RsyncLibOK = 0; - $RsyncLibErr = "File::RsyncP module version too old: need 0.44"; + $RsyncLibErr = "File::RsyncP module version" + . " ($File::RsyncP::VERSION) too old: need 0.52"; } else { $RsyncLibOK = 1; } @@ -138,24 +142,11 @@ sub start } else { # # Turn $conf->{BackupFilesOnly} and $conf->{BackupFilesExclude} - # into a hash of arrays of files. + # into a hash of arrays of files, and $conf->{RsyncShareName} + # to an array # - $conf->{RsyncShareName} = [ $conf->{RsyncShareName} ] - unless ref($conf->{RsyncShareName}) eq "ARRAY"; - foreach my $param qw(BackupFilesOnly BackupFilesExclude) { - next if ( !defined($conf->{$param}) ); - if ( ref($conf->{$param}) eq "ARRAY" ) { - $conf->{$param} = { - $conf->{RsyncShareName}[0] => $conf->{$param} - }; - } elsif ( ref($conf->{$param}) eq "HASH" ) { - # do nothing - } else { - $conf->{$param} = { - $conf->{RsyncShareName}[0] => [ $conf->{$param} ] - }; - } - } + $bpc->backupFileConfFix($conf, "RsyncShareName"); + if ( defined($conf->{BackupFilesOnly}{$t->{shareName}}) ) { my(@inc, @exc, %incDone, %excDone); foreach my $file ( @{$conf->{BackupFilesOnly}{$t->{shareName}}} ) { @@ -248,6 +239,9 @@ sub start $rsyncClientCmd = $conf->{RsyncClientCmd}; $argList = ['--server', '--sender', @$rsyncArgs, '.', $t->{shareNameSlash}]; + eval { + $argList = File::RsyncP->excludeStrip($argList); + }; $fioArgs = { client => $t->{client}, share => $t->{shareName}, @@ -278,7 +272,7 @@ sub start # $t->{rsyncClientCmd} = $rsyncClientCmd; $t->{rs} = File::RsyncP->new({ - logLevel => $conf->{RsyncLogLevel}, + logLevel => $t->{logLevel} || $conf->{RsyncLogLevel}, rsyncCmd => sub { $bpc->verbose(0); $bpc->cmdExecOrEval($rsyncClientCmd, $args); @@ -287,25 +281,43 @@ sub start rsyncArgs => $rsyncArgs, timeout => $conf->{ClientTimeout}, doPartial => defined($t->{partialNum}) ? 1 : undef, - logHandler => sub { - my($str) = @_; - $str .= "\n"; - $t->{XferLOG}->write(\$str); - }, + logHandler => + sub { + my($str) = @_; + $str .= "\n"; + $t->{XferLOG}->write(\$str); + if ( $str =~ /^Remote\[1\]: read errors mapping "(.*)"/ ) { + # + # Files with read errors (eg: region locked files + # on WinXX) are filled with 0 by rsync. Remember + # them and delete them later. + # + my $badFile = $1; + $badFile =~ s/^\/+//; + push(@{$t->{badFiles}}, { + share => $t->{shareName}, + file => $badFile + }); + } + }, pidHandler => sub { $t->{pidHandler}(@_); }, + clientCharset => $conf->{ClientCharset}, fio => BackupPC::Xfer::RsyncFileIO->new({ xfer => $t, bpc => $t->{bpc}, conf => $t->{conf}, backups => $t->{backups}, - logLevel => $conf->{RsyncLogLevel}, + logLevel => $t->{logLevel} + || $conf->{RsyncLogLevel}, logHandler => sub { my($str) = @_; $str .= "\n"; $t->{XferLOG}->write(\$str); }, + cacheCheckProb => $conf->{RsyncCsumCacheVerifyProb}, + clientCharset => $conf->{ClientCharset}, %$fioArgs, }), }); @@ -427,6 +439,15 @@ sub run } } +sub abort +{ + my($t, $reason) = @_; + my $rs = $t->{rs}; + + $rs->abort($reason); + return 1; +} + sub setSelectMask { my($t, $FDreadRef) = @_;