X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=lib%2FBackupPC%2FCGI%2FRestore.pm;h=c871eb379f1fb015d3cc42b297b66716721b7001;hb=9cf3998c4ef71332dea96ff3115daf8b9f722acb;hp=8079d915588fd5438a7721317dcdb5b882ff0948;hpb=e951f787a66c5bd9e9955c3f657a5b44289c0fe1;p=BackupPC.git diff --git a/lib/BackupPC/CGI/Restore.pm b/lib/BackupPC/CGI/Restore.pm index 8079d91..c871eb3 100644 --- a/lib/BackupPC/CGI/Restore.pm +++ b/lib/BackupPC/CGI/Restore.pm @@ -10,7 +10,7 @@ # Craig Barratt # # COPYRIGHT -# Copyright (C) 2003 Craig Barratt +# Copyright (C) 2003-2009 Craig Barratt # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -28,7 +28,7 @@ # #======================================================================== # -# Version 2.1.0, released 20 Jun 2004. +# Version 3.2.0beta0, released 5 April 2009. # # See http://backuppc.sourceforge.net. # @@ -38,8 +38,10 @@ package BackupPC::CGI::Restore; use strict; use BackupPC::CGI::Lib qw(:all); +use BackupPC::Xfer; use Data::Dumper; use File::Path; +use Encode qw/decode_utf8/; sub action { @@ -73,12 +75,13 @@ sub action $hiddenStr .= < EOF + $name = decode_utf8($name); $fileListStr .= < ${EscHTML($name)} EOF } $hiddenStr .= "\n"; - $hiddenStr .= "\n"; + $hiddenStr .= "\n"; $badFileCnt++ if ( $In{pathHdr} =~ m{(^|/)\.\.(/|$)} ); $badFileCnt++ if ( $In{num} =~ m{(^|/)\.\.(/|$)} ); if ( @fileList == 0 ) { @@ -99,49 +102,55 @@ EOF # # Build list of hosts # - my $hostDestSel; - my @hosts; - foreach my $h ( GetUserHosts(1) ) { - my $sel = " selected" if ( $h eq $In{host} ); - $hostDestSel .= ""; - push(@hosts, $h); - } - - # - # Tell the user what options they have - # - $content .= eval("qq{$Lang->{Restore_Options_for__host2}}"); + my($hostDestSel, @hosts, $gotThisHost, $directHost); # - # If there is a single host, make sure direct restore is enabled + # Check all the hosts this user has permissions for + # and make sure direct restore is enabled. + # Note: after this loop we have the config for the + # last host in @hosts, not the original $In{host}!! # - if ( @hosts == 1 ) { + $directHost = $host; + foreach my $h ( GetUserHosts(1) ) { # # Pick up the host's config file # - $bpc->ConfigRead($hosts[0]); + $bpc->ConfigRead($h); %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}}"); + if ( BackupPC::Xfer::restoreEnabled( \%Conf ) ) { + # + # Direct restore is enabled + # + push(@hosts, $h); + $gotThisHost = 1 if ( $h eq $host ); } - } else { - $content .= eval("qq{$Lang->{Restore_Options_for__host_Option1}}"); + } + $directHost = $hosts[0] if ( !$gotThisHost && @hosts ); + foreach my $h ( @hosts ) { + my $sel = " selected" if ( $h eq $directHost ); + $hostDestSel .= ""; } + # + # Tell the user what options they have + # + $pathHdr = decode_utf8($pathHdr); + $share = decode_utf8($share); + $content = eval("qq{$Lang->{Restore_Options_for__host2}}"); + + # + # Decide if option 1 (direct restore) is available based + # on whether the restore command is set. + # + if ( $hostDestSel ne "" ) { + $content .= eval( + "qq{$Lang->{Restore_Options_for__host_Option1}}"); + } else { + my $hostDest = $In{host}; + $content .= eval( + "qq{$Lang->{Restore_Options_for__host_Option1_disabled}}"); + } + # # Verify that Archive::Zip is available before showing the # zip restore option @@ -251,11 +260,7 @@ EOF # 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) ) { + unless ( BackupPC::Xfer::restoreEnabled( \%Conf ) ) { ErrorExit(eval("qq{$Lang->{Restore_Options_for__host_Option1_disabled}}")); } @@ -266,10 +271,16 @@ EOF (my $strippedShareDest = $In{shareDest}) =~ s/^\///; substr($targetFile, 0, length($pathHdr)) = "/$In{pathHdr}/"; $targetFile =~ s{//+}{/}g; + $strippedShareDest = decode_utf8($strippedShareDest); + $targetFile = decode_utf8($targetFile); + $strippedShare = decode_utf8($strippedShare); + $f = decode_utf8($f); $fileListStr .= <$host:/$strippedShare$f$In{hostDest}:/$strippedShareDest$targetFile EOF } + $In{shareDest} = decode_utf8($In{shareDest}); + $In{pathHdr} = decode_utf8($In{pathHdr}); my $content = eval("qq{$Lang->{Are_you_sure}}"); Header(eval("qq{$Lang->{Restore_Confirm_on__host}}"), $content); Trailer(); @@ -319,14 +330,15 @@ EOF [ \%restoreReq], [qw(*RestoreReq)]); $dump->Indent(1); - mkpath("$TopDir/pc/$hostDest", 0, 0777) + eval { 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");