X-Git-Url: http://git.rot13.org/?p=BackupPC.git;a=blobdiff_plain;f=bin%2FBackupPC_restore;h=212f928183d4b42b21f7ba4adf1188f9f16d910f;hp=709e7fd8f313685cd5884b7f3b5ec02b9b9ce934;hb=7dee89bfce659051d486cc66515bb7f22bbc4f09;hpb=d422c3ce2641545c262cc6e09220c79f8d0a16e9 diff --git a/bin/BackupPC_restore b/bin/BackupPC_restore index 709e7fd..212f928 100755 --- a/bin/BackupPC_restore +++ b/bin/BackupPC_restore @@ -29,7 +29,7 @@ # #======================================================================== # -# Version 2.0.0_CVS, released 3 Feb 2003. +# Version 2.0.0beta1, released 30 Mar 2003. # # See http://backuppc.sourceforge.net. # @@ -79,7 +79,7 @@ my $startTime = time(); my $Hosts = $bpc->HostInfoRead($client); my $Dir = "$TopDir/pc/$client"; -my $xferPid = -1; +my @xferPid = (); my $tarPid = -1; # @@ -254,6 +254,7 @@ my $xferArgs = { pathHdrSrc => $RestoreReq{pathHdrSrc}, pathHdrDest => $RestoreReq{pathHdrDest}, fileList => $RestoreReq{fileList}, + pidHandler => \&pidHandler, }; $xfer->args($xferArgs); @@ -324,9 +325,12 @@ if ( $useTar ) { # close(WH); - $xferPid = $xfer->xferPid; - print(LOG $bpc->timeStamp, $logMsg, " (tarPid=$tarPid, xferPid=$xferPid)\n"); - print("started restore, tarPid=$tarPid, xferPid=$xferPid\n"); + @xferPid = $xfer->xferPid; + + print(LOG $bpc->timeStamp, $logMsg, "\n"); + print("started_restore\n"); + + pidHandler(@xferPid); # # Parse the output of the transfer program and BackupPC_tarCreate @@ -384,8 +388,8 @@ if ( $useTar ) { # # otherwise the xfer module does everything for us # - print(LOG $bpc->timeStamp, "Starting restore (tarPid=-1, xferPid=-1)\n"); - print("started restore, tarPid=-1, xferPid=-1\n"); + print(LOG $bpc->timeStamp, "Starting restore\n"); + print("started_restore\n"); ($tarCreateFileCnt, $tarCreateByteCnt, $tarCreateErrCnt, $tarCreateErr) = $xfer->run(); } @@ -434,17 +438,15 @@ sub catch_signal # Note: needs to be tested for each kind of XferMethod # print(LOG $bpc->timeStamp, "cleaning up after signal $signame\n"); - if ( $xferPid > 0 ) { - if ( kill(2, $xferPid) <= 0 ) { - sleep(1); - kill(9, $xferPid); - } + if ( @xferPid ) { + kill(2, @xferPid); + sleep(1); + kill(9, @xferPid); } if ( $tarPid > 0 ) { - if ( kill(2, $tarPid) <= 0 ) { - sleep(1); - kill(9, $tarPid); - } + kill(2, $tarPid); + sleep(1); + kill(9, $tarPid); } $stat{xferOK} = 0; $stat{hostError} = "aborted by signal $signame"; @@ -464,15 +466,19 @@ sub RestoreCleanup # # kill off the tranfer program, first nicely then forcefully # - kill(2, $xferPid) if ( $xferPid > 0 ); - sleep(1); - kill(9, $xferPid) if ( $xferPid > 0 ); + if ( @xferPid ) { + kill(2, @xferPid); + sleep(1); + kill(9, @xferPid); + } # # kill off the tar process, first nicely then forcefully # - kill(2, $tarPid) if ( $tarPid > 0 ); - sleep(1); - kill(9, $tarPid) if ( $tarPid > 0 ); + if ( $tarPid > 0 ) { + kill(2, $tarPid); + sleep(1); + kill(9, $tarPid); + } } my $lastNum = -1; @@ -553,6 +559,23 @@ sub RestoreCleanup } } +# +# The Xfer method might tell us from time to time about processes +# it forks. We tell BackupPC about this (for status displays) and +# keep track of the pids in case we cancel the backup +# +sub pidHandler +{ + @xferPid = @_; + @xferPid = grep(/./, @xferPid); + return if ( !@xferPid && $tarPid < 0 ); + my @pids = @xferPid; + push(@pids, $tarPid) if ( $tarPid > 0 ); + my $str = join(",", @pids); + $XferLOG->write(\"Xfer PIDs are now $str\n") if ( defined($XferLOG) ); + print("xferPids $str\n"); +} + # # Run an optional pre- or post-dump command #