# 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
#
#========================================================================
#
-# Version 2.1.0_CVS, released 3 Jul 2003.
+# Version 3.2.0, released 31 Jul 2010.
#
# See http://backuppc.sourceforge.net.
#
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);
$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|
+<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>
<td class="border"><input type="hidden" name="backup$checkBoxCnt" value="$backupnumber"><input type="checkbox" name="fcb$checkBoxCnt" value="$host"> ${HostLink($host)} </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;
<input type="hidden" name="archivehost" value="$In{'archivehost'}">
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;
<input type="hidden" name="backup$i" value="$In{'backup' . $i}">
EOF
$HostListStr .= <<EOF;
-<li> ${EscHTML($name)}
+<li> ${EscHTML($name)} $i
EOF
}
$hiddenStr .= <<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
#
-
+ 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;
$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},
splitsize => $fullsplitsize,
host => $archivehost,
-
# list of hosts to restore
HostList => \@HostList,
BackupList => \@BackupList,
[ \%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;