#
#========================================================================
#
-# Version 3.0.0alpha, released 23 Jan 2006.
+# Version 3.1.0beta0, released 3 Sep 2007.
#
# See http://backuppc.sourceforge.net.
#
package BackupPC::Xfer::Tar;
use strict;
+use Encode qw/from_to encode/;
sub new
{
if ( defined($conf->{BackupFilesExclude}{$t->{shareName}}) ) {
foreach my $file ( @{$conf->{BackupFilesExclude}{$t->{shareName}}} )
{
- $file = ".$file" if ( $file =~ /^\// );
+ $file = $2 if ( $file =~ m{^(\./+|/+)(.*)}s );
+ $file = "./$file";
+ $file = encode($conf->{ClientCharset}, $file)
+ if ( $conf->{ClientCharset} ne "" );
push(@fileList, "--exclude=$file");
}
}
if ( defined($conf->{BackupFilesOnly}{$t->{shareName}}) ) {
foreach my $file ( @{$conf->{BackupFilesOnly}{$t->{shareName}}} ) {
- $file = ".$file" if ( $file =~ /^\// );
+ $file = $2 if ( $file =~ m{^(\./+|/+)(.*)}s );
+ $file = "./$file";
+ $file = encode($conf->{ClientCharset}, $file)
+ if ( $conf->{ClientCharset} ne "" );
push(@fileList, $file);
}
} else {
$args = $conf->{TarFullArgs};
$logMsg = "full backup started for directory $t->{shareName}";
} else {
- $incrDate = $bpc->timeStamp($t->{lastFull} - 3600, 1);
+ $incrDate = $bpc->timeStamp($t->{incrBaseTime} - 3600, 1);
$args = $conf->{TarIncrArgs};
- $logMsg = "incr backup started back to $incrDate for directory"
+ $logMsg = "incr backup started back to $incrDate"
+ . " (backup #$t->{incrBaseBkupNum}) for directory"
. " $t->{shareName}";
}
push(@$tarClientCmd, split(/ +/, $args));
tarPath => $conf->{TarClientPath},
sshPath => $conf->{SshPath},
};
+ from_to($args->{shareName}, "utf8", $conf->{ClientCharset})
+ if ( $conf->{ClientCharset} ne "" );
$tarClientCmd = $bpc->cmdVarSubstitute($tarClientCmd, $args);
if ( !defined($t->{xferPid} = open(TAR, "-|")) ) {
$t->{_errStr} = "Can't fork to run tar";
return;
}
my $str = "Running: " . $bpc->execCmd2ShellCmd(@$tarClientCmd) . "\n";
+ from_to($str, $conf->{ClientCharset}, "utf8")
+ if ( $conf->{ClientCharset} ne "" );
$t->{XferLOG}->write(\"Running: @$tarClientCmd\n");
alarm($conf->{ClientTimeout});
$t->{_errStr} = undef;
my $mesg;
if ( sysread($t->{pipeTar}, $mesg, 8192) <= 0 ) {
vec($$FDreadRef, fileno($t->{pipeTar}), 1) = 0;
- if ( !close($t->{pipeTar}) ) {
+ if ( !close($t->{pipeTar}) && $? != 256 ) {
+ #
+ # Tar 1.16 uses exit status 1 (256) when some files
+ # changed during archive creation. We allow this
+ # as a benign error and consider the archive ok
+ #
$t->{tarOut} .= "Tar exited with error $? ($!) status\n";
$t->{xferOK} = 0 if ( !$t->{tarBadExitOk} );
}
$t->{tarOut} .= $mesg;
}
}
+ my $logFileThres = $t->{type} eq "restore" ? 1 : 2;
while ( $t->{tarOut} =~ /(.*?)[\n\r]+(.*)/s ) {
$_ = $1;
$t->{tarOut} = $2;
+ from_to($_, $conf->{ClientCharset}, "utf8")
+ if ( $conf->{ClientCharset} ne "" );
#
# refresh our inactivity alarm
#
alarm($conf->{ClientTimeout}) if ( !$t->{abort} );
$t->{lastOutputLine} = $_ if ( !/^$/ );
- if ( /^Total bytes written: / ) {
+ if ( /^Total bytes (written|read): / ) {
$t->{XferLOG}->write(\"$_\n") if ( $t->{logLevel} >= 1 );
$t->{xferOK} = 1;
} elsif ( /^\./ ) {
- $t->{XferLOG}->write(\"$_\n") if ( $t->{logLevel} >= 2 );
+ $t->{XferLOG}->write(\"$_\n") if ( $t->{logLevel} >= $logFileThres );
$t->{fileCnt}++;
} else {
#
# Ignore annoying log message on incremental for tar 1.15.x
#
- if ( !/: file is unchanged; not dumped$/ ) {
+ if ( !/: file is unchanged; not dumped$/ && !/: socket ignored$/ ) {
$t->{XferLOG}->write(\"$_\n") if ( $t->{logLevel} >= 0 );
$t->{xferErrCnt}++;
}