X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;ds=sidebyside;f=lib%2FBackupPC%2FCGI%2FRestore.pm;h=a57422eea025ca8b50ed79c1dc1f89681e6526e2;hb=bd6334a9c72e7fa75f13fd6426f5a8a8cd4ab8b1;hp=29cfcf8bc84f97516fbdc6865f9e5ee6ed806491;hpb=a7690ea45972ea3db587bd94fa573edf20d75c91;p=BackupPC.git diff --git a/lib/BackupPC/CGI/Restore.pm b/lib/BackupPC/CGI/Restore.pm index 29cfcf8..a57422e 100644 --- a/lib/BackupPC/CGI/Restore.pm +++ b/lib/BackupPC/CGI/Restore.pm @@ -28,7 +28,7 @@ # #======================================================================== # -# Version 2.1.0_CVS, released 3 Jul 2003. +# Version 2.1.0_CVS, released 8 Feb 2004. # # See http://backuppc.sourceforge.net. # @@ -39,6 +39,7 @@ package BackupPC::CGI::Restore; use strict; use BackupPC::CGI::Lib qw(:all); use Data::Dumper; +use File::Path; sub action { @@ -62,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, "/")); @@ -102,9 +103,11 @@ EOF # Build list of hosts # my $hostDestSel; + my @hosts; foreach my $h ( GetUserHosts() ) { my $sel = " selected" if ( $h eq $In{host} ); $hostDestSel .= ""; + push(@hosts, $h); } # @@ -112,6 +115,36 @@ 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}}"); + } + # # Verify that Archive::Zip is available before showing the # zip restore option @@ -208,6 +241,25 @@ EOF if ( !CheckPermission($In{hostDest}) ) { ErrorExit(eval("qq{$Lang->{You_don_t_have_permission_to_restore_onto_host}}")); } + # + # Pick up the destination host's config file + # + my $hostDest = $1 if ( $In{hostDest} =~ /(.*)/ ); + $bpc->ConfigRead($hostDest); + %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) ) { + ErrorExit(eval("qq{$Lang->{Restore_Options_for__host_Option1_disabled}}")); + } + $fileListStr = ""; foreach my $f ( @fileList ) { my $targetFile = $f; @@ -264,6 +316,8 @@ EOF [ \%restoreReq], [qw(*RestoreReq)]); $dump->Indent(1); + mkpath("$TopDir/pc/$hostDest", 0, 0777) + if ( !-d "$TopDir/pc/$hostDest" ); if ( open(REQ, ">$TopDir/pc/$hostDest/$reqFileName") ) { binmode(REQ); print(REQ $dump->Dump);