X-Git-Url: http://git.rot13.org/?p=BackupPC.git;a=blobdiff_plain;f=lib%2FBackupPC%2FLib.pm;h=5ad2770d166ec2190980a7fb00c1c5ca52553e6a;hp=ad6af10c0897f9f9fe79c686a2386a2006b36ba3;hb=e951f787a66c5bd9e9955c3f657a5b44289c0fe1;hpb=5c6a6cc4f333ce44a9df62ab828b0b9341579f7c diff --git a/lib/BackupPC/Lib.pm b/lib/BackupPC/Lib.pm index ad6af10..5ad2770 100644 --- a/lib/BackupPC/Lib.pm +++ b/lib/BackupPC/Lib.pm @@ -29,7 +29,7 @@ # #======================================================================== # -# Version 2.1.0beta1, released 9 Apr 2004. +# Version 2.1.0, released 20 Jun 2004. # # See http://backuppc.sourceforge.net. # @@ -59,7 +59,7 @@ sub new TopDir => $topDir || '/data/BackupPC', BinDir => $installDir || '/usr/local/BackupPC', LibDir => $installDir || '/usr/local/BackupPC', - Version => '2.1.0beta1', + Version => '2.1.0', BackupFields => [qw( num type startTime endTime nFiles size nFilesExist sizeExist nFilesNew sizeNew @@ -220,11 +220,13 @@ sub BackupInfoWrite my($i); flock(LOCK, LOCK_EX) if open(LOCK, "$bpc->{TopDir}/pc/$host/LOCK"); - unlink("$bpc->{TopDir}/pc/$host/backups.old") - if ( -f "$bpc->{TopDir}/pc/$host/backups.old" ); - rename("$bpc->{TopDir}/pc/$host/backups", - "$bpc->{TopDir}/pc/$host/backups.old") - if ( -f "$bpc->{TopDir}/pc/$host/backups" ); + if ( -s "$bpc->{TopDir}/pc/$host/backups" ) { + unlink("$bpc->{TopDir}/pc/$host/backups.old") + if ( -f "$bpc->{TopDir}/pc/$host/backups.old" ); + rename("$bpc->{TopDir}/pc/$host/backups", + "$bpc->{TopDir}/pc/$host/backups.old") + if ( -f "$bpc->{TopDir}/pc/$host/backups" ); + } if ( open(BK_INFO, ">$bpc->{TopDir}/pc/$host/backups") ) { binmode(BK_INFO); for ( $i = 0 ; $i < @Backups ; $i++ ) { @@ -264,11 +266,13 @@ sub RestoreInfoWrite my($i); flock(LOCK, LOCK_EX) if open(LOCK, "$bpc->{TopDir}/pc/$host/LOCK"); - unlink("$bpc->{TopDir}/pc/$host/restores.old") - if ( -f "$bpc->{TopDir}/pc/$host/restores.old" ); - rename("$bpc->{TopDir}/pc/$host/restores", - "$bpc->{TopDir}/pc/$host/restores.old") - if ( -f "$bpc->{TopDir}/pc/$host/restores" ); + if ( -s "$bpc->{TopDir}/pc/$host/restores" ) { + unlink("$bpc->{TopDir}/pc/$host/restores.old") + if ( -f "$bpc->{TopDir}/pc/$host/restores.old" ); + rename("$bpc->{TopDir}/pc/$host/restores", + "$bpc->{TopDir}/pc/$host/restores.old") + if ( -f "$bpc->{TopDir}/pc/$host/restores" ); + } if ( open(RESTORE_INFO, ">$bpc->{TopDir}/pc/$host/restores") ) { binmode(RESTORE_INFO); for ( $i = 0 ; $i < @Restores ; $i++ ) { @@ -309,11 +313,13 @@ sub ArchiveInfoWrite my($i); flock(LOCK, LOCK_EX) if open(LOCK, "$bpc->{TopDir}/pc/$host/LOCK"); - unlink("$bpc->{TopDir}/pc/$host/archives.old") - if ( -f "$bpc->{TopDir}/pc/$host/archives.old" ); - rename("$bpc->{TopDir}/pc/$host/archives", - "$bpc->{TopDir}/pc/$host/archives.old") - if ( -f "$bpc->{TopDir}/pc/$host/archives" ); + if ( -s "$bpc->{TopDir}/pc/$host/archives" ) { + unlink("$bpc->{TopDir}/pc/$host/archives.old") + if ( -f "$bpc->{TopDir}/pc/$host/archives.old" ); + rename("$bpc->{TopDir}/pc/$host/archives", + "$bpc->{TopDir}/pc/$host/archives.old") + if ( -f "$bpc->{TopDir}/pc/$host/archives" ); + } if ( open(ARCHIVE_INFO, ">$bpc->{TopDir}/pc/$host/archives") ) { binmode(ARCHIVE_INFO); for ( $i = 0 ; $i < @Archives ; $i++ ) { @@ -1137,9 +1143,9 @@ sub cmdExecOrEval # # Also, $? should be set when the CHILD pipe is closed. # -sub cmdSystemOrEval +sub cmdSystemOrEvalLong { - my($bpc, $cmd, $stdoutCB, @args) = @_; + my($bpc, $cmd, $stdoutCB, $ignoreStderr, $pidHandlerCB, @args) = @_; my($pid, $out, $allOut); local(*CHILD); @@ -1173,7 +1179,11 @@ sub cmdSystemOrEval # This is the child # close(STDERR); - open(STDERR, ">&STDOUT"); + if ( $ignoreStderr ) { + open(STDERR, ">", "/dev/null"); + } else { + open(STDERR, ">&STDOUT"); + } alarm(0); $cmd = [map { m/(.*)/ } @$cmd]; # untaint # @@ -1183,6 +1193,12 @@ sub cmdSystemOrEval print(STDERR "Exec of @$cmd failed\n"); exit(1); } + + # + # Notify caller of child's pid + # + &$pidHandlerCB($pid) if ( ref($pidHandlerCB) eq "CODE" ); + # # The parent gathers the output from the child # @@ -1200,4 +1216,34 @@ sub cmdSystemOrEval return $out; } +# +# The shorter version that sets $ignoreStderr = 0, ie: merges stdout +# and stderr together. +# +sub cmdSystemOrEval +{ + my($bpc, $cmd, $stdoutCB, @args) = @_; + + return $bpc->cmdSystemOrEvalLong($cmd, $stdoutCB, 0, undef, @args); +} + + +# +# Promotes $conf->{BackupFilesOnly}, $conf->{BackupFilesExclude} +# to hashes and $conf->{$shareName} to an array +# +sub backupFileConfFix +{ + my($bpc, $conf, $shareName) = @_; + + $conf->{$shareName} = [ $conf->{$shareName} ] + if ( ref($conf->{$shareName}) ne "ARRAY" ); + foreach my $param qw(BackupFilesOnly BackupFilesExclude) { + next if ( !defined($conf->{$param}) || ref($conf->{$param}) eq "HASH" ); + $conf->{$param} = [ $conf->{$param} ] + if ( ref($conf->{$param}) ne "ARRAY" ); + $conf->{$param} = { map { $_ => $conf->{$param} } @{$conf->{$shareName}} }; + } +} + 1;