X-Git-Url: http://git.rot13.org/?p=BackupPC.git;a=blobdiff_plain;f=lib%2FBackupPC%2FCGI%2FArchive.pm;h=24ebaac828ac4c4846cafe7909668069370487ec;hp=2a774ebe45ba0857e13dc797ef0f6cc08c9475eb;hb=730841807f5da0e0626be75a4d2e828b7584057f;hpb=a7690ea45972ea3db587bd94fa573edf20d75c91 diff --git a/lib/BackupPC/CGI/Archive.pm b/lib/BackupPC/CGI/Archive.pm index 2a774eb..24ebaac 100644 --- a/lib/BackupPC/CGI/Archive.pm +++ b/lib/BackupPC/CGI/Archive.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_CVS, released 3 Jul 2003. +# Version 3.2.0, released 31 Jul 2010. # # See http://backuppc.sourceforge.net. # @@ -39,25 +39,30 @@ package BackupPC::CGI::Archive; use strict; use BackupPC::CGI::Lib qw(:all); use Data::Dumper; +use DBI; sub action { + my $archHost = $In{host}; + my $Privileged = CheckPermission(); + + if ( !$Privileged ) { + ErrorExit($Lang->{Only_privileged_users_can_archive} ); + } if ( $In{type} == 0 ) { my($fullTot, $fullSizeTot, $incrTot, $incrSizeTot, $str, - $strNone, $strGood, $hostCntGood, $hostCntNone, $checkBoxCnt, - $backupnumber); + $strNone, $strGood, $hostCntGood, $hostCntNone, $checkBoxCnt, + $backupnumber); $hostCntGood = $hostCntNone = $checkBoxCnt = $fullSizeTot = 0; GetStatusInfo("hosts"); - my $Privileged = CheckPermission(); - if ( !$Privileged ) { - ErrorExit($Lang->{Only_privileged_users_can_archive} ); - } foreach my $host ( sort(keys(%Status)) ) { my($fullDur, $incrCnt, $fullSize, $fullRate); my @Backups = $bpc->BackupInfoRead($host); my $fullCnt = $incrCnt = 0; + my $all_backup_numbers; + for ( my $i = 0 ; $i < @Backups ; $i++ ) { if ( $Backups[$i]{type} eq "full" ) { $fullSize = $Backups[$i]{size} / (1024 * 1024); @@ -66,9 +71,56 @@ sub action $incrSizeTot = $Backups[$i]{size} / (1024 * 1024); } $backupnumber = $Backups[$i]{num}; + $all_backup_numbers->{$backupnumber}++; } $fullSizeTot += $fullSize + $incrSizeTot; $fullSize = sprintf("%.2f", ($fullSize + $incrSizeTot) / 1000); + + $bpc->ConfigRead($archHost); + %Conf = $bpc->Conf(); + +use Data::Dump qw(dump); + + my $dbh = DBI->connect($Conf{SearchDSN}, $Conf{SearchUser}, "", { RaiseError => 1, AutoCommit => 0 }); + my $sth = $dbh->prepare(qq{ + select + hosts.name as host, -- FIXME for debug + backups.num as num, + inc_size, + size, + inc_deleted + from backups + join hosts on hosts.id = hostid + where hosts.name = ? + }); + $sth->execute($host); + # and inc_size < 0 and size > 0 and not inc_deleted + while( my $row = $sth->fetchrow_hashref ) { +warn "# row ",dump $row; + $all_backup_numbers->{ $row->{num} } = + $row->{inc_deleted} ? 0 : + $row->{size} == 0 ? 0 : + $row->{inc_size} > 0 ? 0 : + $row->{size} > 0 ? 1 : + 0; + } + +warn "# host $host all_backup_numbers = ",dump($all_backup_numbers); + my @backup_nums = + sort + grep { $all_backup_numbers->{$_} } + keys %$all_backup_numbers; + + my $checkboxes; + foreach my $backupnumber ( @backup_nums ) { + $checkboxes .= qq| + +$backupnumber + |; + $checkBoxCnt++; + } + +=for ASA extension removed this $str = <  ${HostLink($host)} @@ -76,6 +128,20 @@ sub action $fullSize EOF $checkBoxCnt++; +=cut + + $str = < + +${HostLink($host)} +$checkboxes + + +${UserLink($Hosts->{$host}{user})} + + $fullSize +EOF + if ( @Backups == 0 ) { $hostCntNone++; $strNone .= $str; @@ -91,35 +157,38 @@ EOF EOF my $content = eval("qq{$Lang->{BackupPC_Archive}}"); - Header(eval("qq{$Lang->{BackupPC__Archive}}"),$content); + Header(eval("qq{$Lang->{BackupPC__Archive}}"), $content, 1); Trailer(); } else { + my(@HostList, @BackupList, $HostListStr, $hiddenStr, $pathHdr, + $badFileCnt, $reply, $str); - my(@HostList, @BackupList, $HostListStr, $hiddenStr, $pathHdr, $badFileCnt, $reply, $str); + # + # Pick up the archive host's config file + # + $bpc->ConfigRead($archHost); + %Conf = $bpc->Conf(); - my $Privileged = CheckPermission(); my $args = { - SplitPath => $bpc->{Conf}{SplitPath}, - ParPath => $bpc->{Conf}{ParPath}, - CatPath => $bpc->{Conf}{CatPath}, - GzipPath => $bpc->{Conf}{GzipPath}, - Bzip2Path => $bpc->{Conf}{Bzip2Path}, - ArchiveDest => $bpc->{Conf}{ArchiveDest}, - ArchiveComp => $bpc->{Conf}{ArchiveComp}, - ArchivePar => $bpc->{Conf}{ArchivePar}, - ArchiveSplit => $bpc->{Conf}{ArchiveSplit}, + SplitPath => $Conf{SplitPath}, + ParPath => $Conf{ParPath}, + CatPath => $Conf{CatPath}, + GzipPath => $Conf{GzipPath}, + Bzip2Path => $Conf{Bzip2Path}, + ArchiveDest => $Conf{ArchiveDest}, + ArchiveComp => $Conf{ArchiveComp}, + ArchivePar => $Conf{ArchivePar}, + ArchiveSplit => $Conf{ArchiveSplit}, topDir => $bpc->{TopDir}, }; - if ( !$Privileged ) { - ErrorExit($Lang->{Only_privileged_users_can_archive} ); - } ServerConnect(); for ( my $i = 0 ; $i < $In{fcbMax} ; $i++ ) { next if ( !defined($In{"fcb$i"}) ); my $name = $In{"fcb$i"}; my $backupno = $In{"backup$i"}; + next unless defined $backupno; # ASA - skip hosts without backups checked push(@HostList, $name); push(@BackupList, $backupno); $hiddenStr .= < EOF $HostListStr .= < ${EscHTML($name)} +
  • ${EscHTML($name)} $i EOF } $hiddenStr .= <{You_haven_t_selected_any_hosts}); } - my ($ArchiveDest, $ArchiveCompNone, $ArchiveCompGzip, $ArchiveCompBzip2, $ArchivePar, $ArchiveSplit); - $ArchiveDest = $bpc->{Conf}{ArchiveDest}; - if ( $bpc->{Conf}{ArchiveComp} eq "none" ) { + my ($ArchiveDest, $ArchiveCompNone, $ArchiveCompGzip, + $ArchiveCompBzip2, $ArchivePar, $ArchiveSplit); + $ArchiveDest = $Conf{ArchiveDest}; + if ( $Conf{ArchiveComp} eq "none" ) { $ArchiveCompNone = "checked"; } else { $ArchiveCompNone = ""; } - if ( $bpc->{Conf}{ArchiveComp} eq "gzip" ) { + if ( $Conf{ArchiveComp} eq "gzip" ) { $ArchiveCompGzip = "checked"; } else { $ArchiveCompGzip = ""; } - if ( $bpc->{Conf}{ArchiveComp} eq "bzip2" ) { + if ( $Conf{ArchiveComp} eq "bzip2" ) { $ArchiveCompBzip2 = "checked"; } else { $ArchiveCompBzip2 = ""; } - $ArchivePar = $bpc->{Conf}{ArchivePar}; - $ArchiveSplit = $bpc->{Conf}{ArchiveSplit}; + $ArchivePar = $Conf{ArchivePar}; + $ArchiveSplit = $Conf{ArchiveSplit}; if ( $In{type} == 1 ) { # # Tell the user what options they have # - + my $paramStr = ""; + if ( $Conf{ArchiveClientCmd} =~ /\$archiveloc\b/ ) { + $paramStr .= eval("qq{$Lang->{BackupPC_Archive2_location}}"); + } + if ( $Conf{ArchiveClientCmd} =~ /\$compression\b/ ) { + $paramStr .= eval("qq{$Lang->{BackupPC_Archive2_compression}}"); + } + if ( $Conf{ArchiveClientCmd} =~ /\$parfile\b/ + && -x $Conf{ParPath} ) { + $paramStr .= eval("qq{$Lang->{BackupPC_Archive2_parity}}"); + } + if ( $Conf{ArchiveClientCmd} =~ /\$splitsize\b/ + && -x $Conf{SplitPath} ) { + $paramStr .= eval("qq{$Lang->{BackupPC_Archive2_split}}"); + } my $content = eval("qq{$Lang->{BackupPC_Archive2}}"); - Header(eval("qq{$Lang->{BackupPC__Archive}}"),$content); + Header(eval("qq{$Lang->{BackupPC__Archive}}"), $content, 1); Trailer(); } elsif ( $In{type} == 2 ) { my $reqFileName; @@ -172,23 +256,18 @@ EOF $reqFileName = "archiveReq.$$.$i"; last if ( !-f "$TopDir/pc/$archivehost/$reqFileName" ); } - my $compname; - if ( $In{compression} == 2 ) { # bzip2 compression + my($compname, $compext); + if ( $In{compression} == 2 ) { # bzip2 compression $compname = $Conf{Bzip2Path}; - } elsif ( $In{compression} == 1 ) { # gzip compression - $compname = $Conf{GzipPath}; - } else { # No Compression - $compname = $Conf{CatPath}; - } - my $compext; - if ( $In{compression} == 2 ) { # bzip2 compression $compext = '.bz2'; - } elsif ( $In{compression} == 1 ) { # gzip compression + } elsif ( $In{compression} == 1 ) { # gzip compression + $compname = $Conf{GzipPath}; $compext = '.gz'; } else { # No Compression + $compname = $Conf{CatPath}; $compext = '.raw'; } - my $fullsplitsize = $In{splitsize} . '000000'; + my $fullsplitsize = $In{splitsize} . '000000'; # mb -> bytes my %ArchiveReq = ( # parameters for the archive archiveloc => $In{archive_device}, @@ -199,7 +278,6 @@ EOF splitsize => $fullsplitsize, host => $archivehost, - # list of hosts to restore HostList => \@HostList, BackupList => \@BackupList, @@ -212,24 +290,22 @@ EOF [ \%ArchiveReq], [qw(*ArchiveReq)]); $archive->Indent(1); - if ( open(REQ, ">$TopDir/pc/$archivehost/$reqFileName") ) { + my $openPath = "$TopDir/pc/$archivehost/$reqFileName"; + if ( open(REQ, ">", $openPath) ) { binmode(REQ); print(REQ $archive->Dump); close(REQ); } else { - ErrorExit($Lang->{Can_t_open_create} ); + ErrorExit(eval("qq{$Lang->{Can_t_open_create__openPath}}")); } - $reply = $bpc->ServerMesg("archive $User $archivehost $reqFileName"); - - $str = eval("qq{$Lang->{Archive_requested}}"); + $reply = $bpc->ServerMesg("archive $User $archivehost $reqFileName"); + $str = eval("qq{$Lang->{Archive_requested}}"); my $content = eval("qq{$Lang->{BackupPC_Archive_Reply_from_server}}"); - Header(eval("qq{$Lang->{BackupPC__Archive}}"),$content); + Header(eval("qq{$Lang->{BackupPC__Archive}}"), $content, 1); Trailer(); } - } - } 1;