skip hosts without backups checked
[BackupPC.git] / lib / BackupPC / CGI / Archive.pm
index 43a9b8e..c6f2d40 100644 (file)
@@ -10,7 +10,7 @@
 #   Craig Barratt  <cbarratt@users.sourceforge.net>
 #
 # 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,16 +71,76 @@ 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
+                               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 ? 1 :
+                       $row->{size}     > 0 ? 1 :
+                       0;
+               }
+
+warn 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|
+<input type="hidden" name="fcb$checkBoxCnt" value="$host">
+<input type="checkbox" name="backup$checkBoxCnt" value="$backupnumber">$backupnumber
+                       |;
+                       $checkBoxCnt++;
+               }
+
+=for ASA extension removed this
             $str = <<EOF;
-<tr bgcolor="#ffffcc">
-<td><input type="hidden" name="backup$checkBoxCnt" value="$backupnumber"><input type="checkbox" name="fcb$checkBoxCnt" value="$host">&nbsp;${HostLink($host)} </td>
-<td align="center"> ${UserLink($Hosts->{$host}{user})} </td>
-<td align="center"> $fullSize </td>
+<tr>
+<td class="border"><input type="hidden" name="backup$checkBoxCnt" value="$backupnumber"><input type="checkbox" name="fcb$checkBoxCnt" value="$host">&nbsp;${HostLink($host)} </td>
+<td align="center" class="border"> ${UserLink($Hosts->{$host}{user})} </td>
+<td align="center" class="border"> $fullSize </td>
 EOF
             $checkBoxCnt++;
+=cut
+
+            $str = <<EOF;
+<tr>
+<td class="border">
+${HostLink($host)}
+$checkboxes
+</td>
+<td align="center" class="border">
+${UserLink($Hosts->{$host}{user})}
+</td>
+<td align="center" class="border"> $fullSize </td>
+EOF
+
             if ( @Backups == 0 ) {
                 $hostCntNone++;
                 $strNone .= $str;
@@ -90,37 +155,39 @@ EOF
         $strGood .= <<EOF;
 <input type="hidden" name="archivehost" value="$In{'archivehost'}">
 EOF
-        Header($Lang->{BackupPC__Archive});
-        print eval ("qq{$Lang->{BackupPC_Archive}}");
-
+        my $content = eval("qq{$Lang->{BackupPC_Archive}}");
+        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;
@@ -128,7 +195,7 @@ EOF
 <input type="hidden" name="backup$i" value="$In{'backup' . $i}">
 EOF
             $HostListStr .= <<EOF;
-<li> ${EscHTML($name)}
+<li> ${EscHTML($name)} $i
 EOF
         }
         $hiddenStr .= <<EOF;
@@ -138,33 +205,48 @@ EOF
         if ( @HostList == 0 ) {
             ErrorExit($Lang->{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
             #
-
-            Header($Lang->{BackupPC__Archive});
-            print eval ("qq{$Lang->{BackupPC_Archive2}}");
+            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, 1);
             Trailer();
         } elsif ( $In{type} == 2 ) {
             my $reqFileName;
@@ -173,20 +255,15 @@ 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';
@@ -200,7 +277,6 @@ EOF
                 splitsize   => $fullsplitsize,
                 host        => $archivehost,
 
-
                 # list of hosts to restore
                 HostList    => \@HostList,
                 BackupList  => \@BackupList,
@@ -213,23 +289,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");
+            $reply = $bpc->ServerMesg("archive $User $archivehost $reqFileName");
+            $str = eval("qq{$Lang->{Archive_requested}}");
 
-        $str = eval("qq{$Lang->{Archive_requested}}");
-            Header($Lang->{BackupPC__Archive});
-            print eval ("qq{$Lang->{BackupPC_Archive_Reply_from_server}}");
+            my $content = eval("qq{$Lang->{BackupPC_Archive_Reply_from_server}}");
+            Header(eval("qq{$Lang->{BackupPC__Archive}}"), $content, 1);
             Trailer();
         }
-
     }
-
 }
 
 1;