X-Git-Url: http://git.rot13.org/?p=BackupPC.git;a=blobdiff_plain;f=lib%2FBackupPC%2FCGI%2FRestore.pm;h=0310c63621bddb9c9680840adbe04822b927f8ef;hp=12d6020378c584fdaedd44340f651baf68ae6573;hb=17dcbbebb871212f90b81bb97f8d1feb528bdc43;hpb=2c14784ad71874ec850d189060fe63d6eb9eba95 diff --git a/lib/BackupPC/CGI/Restore.pm b/lib/BackupPC/CGI/Restore.pm index 12d6020..0310c63 100644 --- a/lib/BackupPC/CGI/Restore.pm +++ b/lib/BackupPC/CGI/Restore.pm @@ -28,7 +28,7 @@ # #======================================================================== # -# Version 2.1.0_CVS, released 8 Feb 2004. +# Version 2.1.0, released 20 Jun 2004. # # See http://backuppc.sourceforge.net. # @@ -63,7 +63,7 @@ sub action (my $name = $In{"fcb$i"}) =~ s/%([0-9A-F]{2})/chr(hex($1))/eg; $badFileCnt++ if ( $name =~ m{(^|/)\.\.(/|$)} ); if ( @fileList == 0 ) { - $pathHdr = $name; + $pathHdr = substr($name, 0, rindex($name, "/")); } else { while ( substr($name, 0, length($pathHdr)) ne $pathHdr ) { $pathHdr = substr($pathHdr, 0, rindex($pathHdr, "/")); @@ -87,9 +87,6 @@ EOF if ( $badFileCnt ) { ErrorExit($Lang->{Nice_try__but_you_can_t_put}); } - if ( @fileList == 1 ) { - $pathHdr =~ s/(.*)\/.*/$1/; - } $pathHdr = "/" if ( $pathHdr eq "" ); if ( $In{type} != 0 && @fileList == $In{fcbMax} ) { # @@ -104,7 +101,7 @@ EOF # my $hostDestSel; my @hosts; - foreach my $h ( GetUserHosts() ) { + foreach my $h ( GetUserHosts(1) ) { my $sel = " selected" if ( $h eq $In{host} ); $hostDestSel .= ""; push(@hosts, $h); @@ -115,35 +112,30 @@ EOF # $content .= eval("qq{$Lang->{Restore_Options_for__host2}}"); - # - # If there is a single host, make sure direct restore is enabled - # if ( @hosts == 1 ) { # # Pick up the host's config file # $bpc->ConfigRead($hosts[0]); %Conf = $bpc->Conf(); + } - # - # Decide if option 1 (direct restore) is available based - # on whether the restore command is set. - # - my $cmd = $Conf{XferMethod} eq "smb" ? $Conf{SmbClientRestoreCmd} - : $Conf{XferMethod} eq "tar" ? $Conf{TarClientRestoreCmd} - : $Conf{XferMethod} eq "archive" ? undef - : $Conf{RsyncRestoreArgs}; - if ( defined($cmd) ) { - $content .= eval( - "qq{$Lang->{Restore_Options_for__host_Option1}}"); - } else { - my $hostDest = $hosts[0]; - $content .= eval( - "qq{$Lang->{Restore_Options_for__host_Option1_disabled}}"); - } - } else { - $content .= eval("qq{$Lang->{Restore_Options_for__host_Option1}}"); - } + # + # Decide if option 1 (direct restore) is available based + # on whether the restore command is set. + # + my $cmd = $Conf{XferMethod} eq "smb" ? $Conf{SmbClientRestoreCmd} + : $Conf{XferMethod} eq "tar" ? $Conf{TarClientRestoreCmd} + : $Conf{XferMethod} eq "archive" ? undef + : $Conf{RsyncRestoreArgs}; + if ( defined($cmd) ) { + $content .= eval( + "qq{$Lang->{Restore_Options_for__host_Option1}}"); + } else { + my $hostDest = $hosts[0]; + $content .= eval( + "qq{$Lang->{Restore_Options_for__host_Option1_disabled}}"); + } # # Verify that Archive::Zip is available before showing the @@ -184,14 +176,15 @@ EOF # This is necessary to ensure the output gets to the correct place # under mod_perl. # - $bpc->cmdSystemOrEval(["$BinDir/BackupPC_tarCreate", + $bpc->cmdSystemOrEvalLong(["$BinDir/BackupPC_tarCreate", "-h", $host, "-n", $num, "-s", $share, @pathOpts, @fileList ], - sub { print(@_); } + sub { print(@_); }, + 1, # ignore stderr ); } elsif ( $In{type} == 2 ) { # @@ -221,7 +214,7 @@ EOF # This is necessary to ensure the output gets to the correct place # under mod_perl. # - $bpc->cmdSystemOrEval(["$BinDir/BackupPC_zipCreate", + $bpc->cmdSystemOrEvalLong(["$BinDir/BackupPC_zipCreate", "-h", $host, "-n", $num, "-c", $In{compressLevel}, @@ -229,7 +222,8 @@ EOF @pathOpts, @fileList ], - sub { print(@_); } + sub { print(@_); }, + 1, # ignore stderr ); } elsif ( $In{type} == 3 ) { # @@ -265,7 +259,8 @@ EOF my $targetFile = $f; (my $strippedShare = $share) =~ s/^\///; (my $strippedShareDest = $In{shareDest}) =~ s/^\///; - substr($targetFile, 0, length($pathHdr)) = $In{pathHdr}; + substr($targetFile, 0, length($pathHdr)) = "/$In{pathHdr}/"; + $targetFile =~ s{//+}{/}g; $fileListStr .= <$host:/$strippedShare$f$In{hostDest}:/$strippedShareDest$targetFile EOF @@ -293,6 +288,9 @@ EOF $reqFileName = "restoreReq.$$.$i"; last if ( !-f "$TopDir/pc/$hostDest/$reqFileName" ); } + my $inPathHdr = $In{pathHdr}; + $inPathHdr = "/$inPathHdr" if ( $inPathHdr !~ m{^/} ); + $inPathHdr = "$inPathHdr/" if ( $inPathHdr !~ m{/$} ); my %restoreReq = ( # source of restore is hostSrc, #num, path shareSrc/pathHdrSrc num => $In{num}, @@ -303,7 +301,7 @@ EOF # destination of restore is hostDest:shareDest/pathHdrDest hostDest => $hostDest, shareDest => $In{shareDest}, - pathHdrDest => $In{pathHdr}, + pathHdrDest => $inPathHdr, # list of files to restore fileList => \@fileList, @@ -318,12 +316,13 @@ EOF $dump->Indent(1); mkpath("$TopDir/pc/$hostDest", 0, 0777) if ( !-d "$TopDir/pc/$hostDest" ); - if ( open(REQ, ">$TopDir/pc/$hostDest/$reqFileName") ) { + my $openPath = "$TopDir/pc/$hostDest/$reqFileName"; + if ( open(REQ, ">", $openPath) ) { binmode(REQ); print(REQ $dump->Dump); close(REQ); } else { - ErrorExit(eval("qq{$Lang->{Can_t_open_create}}")); + ErrorExit(eval("qq{$Lang->{Can_t_open_create__openPath}}")); } $reply = $bpc->ServerMesg("restore ${EscURI($ipAddr)}" . " ${EscURI($hostDest)} $User $reqFileName");