use Time::HiRes qw/time/;
use XML::Writer;
use IO::File;
-use BackupPC::Search::Estraier;
+use Data::Dump qw(dump);
+
+require Exporter;
+our @ISA=qw(Exporter);
+our @EXPORT=qw(unit);
my $on_page = 100;
my $pager_pages = 10;
-my $dsn = $Conf{SearchDSN};
-my $db_user = $Conf{SearchUser} || '';
+my $dbh;
-my $hest_node_url = $Conf{HyperEstraierIndex};
+my $bpc = BackupPC::Lib->new || die;
+$bpc->ConfigRead('_search_archive');
+my %Conf = $bpc->Conf();
-my $dbh;
+sub search_module {
+
+ my $search_module = $Conf{SearchModule} || die "search is disabled";
+ eval "use $search_module";
+ if ( $@ ) {
+ warn "ERROR: $search_module: $!";
+ } else {
+ warn "# using $search_module for full-text search";
+ }
+ return $search_module->new( %Conf );
+}
+my $dbh;
sub get_dbh {
- $dbh ||= DBI->connect($dsn, $db_user, "", { RaiseError => 1, AutoCommit => 1 } );
+ $dbh ||= DBI->connect($Conf{SearchDSN}, $Conf{SearchUser}, "", { RaiseError => 1, AutoCommit => 1 } );
return $dbh;
}
search => {
default => 'date_a',
sql => {
- share_d => 'shares.name DESC',
- share_a => 'shares.name ASC',
- path_d => 'files.path DESC',
- path_a => 'files.path ASC',
- num_d => 'files.backupnum DESC',
- num_a => 'files.backupnum ASC',
+ sname_d => 'shares.name DESC',
+ sname_a => 'shares.name ASC',
+ filepath_d => 'files.path DESC',
+ filepath_a => 'files.path ASC',
+ backupnum_d => 'files.backupnum DESC',
+ backupnum_a => 'files.backupnum ASC',
size_d => 'files.size DESC',
size_a => 'files.size ASC',
date_d => 'files.date DESC',
}, burn => {
default => 'date_a',
sql => {
- share_d => 'host DESC, share DESC',
- share_a => 'host ASC, share ASC',
+ sname_d => 'host DESC, share DESC',
+ sname_a => 'host ASC, share ASC',
num_d => 'backupnum DESC',
num_a => 'backupnum ASC',
date_d => 'date DESC',
my $shareid = $param->{'search_share'};
my ($backup_from, $backup_to, $files_from, $files_to) = dates_from_form($param);
- return BackupPC::Search::Estraier->new( $hest_node_url )->search(
+ return search_module->search(
$offset, $on_page, $param->{sort},
$q, $shareid, $backup_from, $backup_to, $files_from, $files_to
);
sub get_tgz_size_by_name($) {
my $name = shift;
- my $tgz = $Conf{InstallDir}.'/'.$Conf{GzipTempDir}.'/'.$name;
+ my $tgz = $Conf{GzipTempDir}.'/'.$name;
my $size = -1;
- my $Dir = $Conf{InstallDir}."/data/log";
$|=1;
if (-f "${tgz}.tar.gz") {
$size = (stat("${tgz}.tar.gz"))[7];
);
}
-sub getVolumes($) {
- my $id = shift;
-
- my $max_archive_size = $Conf{MaxArchiveSize} || die "no MaxArchiveSize";
-
- my $sth = $dbh->prepare(qq{
- select
- size
- from backup_parts
- where backup_id = ?
- order by part_nr asc
- });
-
- $sth->execute($id);
-
- my $cumulative_size = 0;
- my $volumes = 1;
-
- while(my ($size) = $sth->fetchrow_array) {
- if ($cumulative_size + $size > $max_archive_size) {
- $volumes++;
- $cumulative_size = $size;
- } else {
- $cumulative_size += $size;
- }
- }
-
- return ($volumes,$cumulative_size);
-}
sub getBackupsNotBurned($) {
print STDERR "## sort=". ($param->{'sort'} || 'no sort param') . " burn sql order: $order\n";
my $sql = qq{
- SELECT
- backups.hostID AS hostID,
- hosts.name AS host,
- shares.name AS share,
- backups.num AS backupnum,
- backups.type AS type,
- backups.date AS date,
- date_part('epoch',now()) - backups.date as age,
- backups.size AS size,
- backups.id AS id,
- backups.inc_size AS inc_size,
- backups.parts AS parts
- FROM backups
- INNER JOIN shares ON backups.shareID=shares.ID
- INNER JOIN hosts ON backups.hostID = hosts.ID
- LEFT OUTER JOIN archive_backup ON archive_backup.backup_id = backups.id
- WHERE backups.inc_size > 0 AND backups.size > 0 AND backups.inc_deleted is false AND archive_backup.backup_id IS NULL AND backups.parts > 0
- GROUP BY
- backups.hostID,
- hosts.name,
- shares.name,
- backups.num,
- backups.shareid,
- backups.id,
- backups.type,
- backups.date,
- backups.size,
- backups.inc_size,
- backups.parts
- ORDER BY $order
+ SELECT
+ p.id,
+ p.filename,
+ b.date,
+ date_part('epoch',now()) - b.date as age,
+ p.size,
+ count(ap.*) as scheduled,
+ count(ab.*) as burned
+ FROM backup_parts p
+ JOIN backups b ON b.id = p.backup_id
+ LEFT OUTER JOIN archive_parts ap ON ap.backup_part_id = p.id
+ LEFT OUTER JOIN archive_burned ab ON ab.archive_id = ap.archive_id
+ GROUP BY p.id,filename,b.date,age,p.size,p.part_nr
+ ORDER BY b.date,p.part_nr
};
my $sth = $dbh->prepare( $sql );
my @ret;
while ( my $row = $sth->fetchrow_hashref() ) {
$row->{'age'} = sprintf("%0.1f", ( $row->{'age'} / 86400 ) );
#$row->{'age'} = sprintf("%0.1f", ( (time() - $row->{'date'}) / 86400 ) );
-
- my $max_archive_size = $Conf{MaxArchiveSize} || die "no MaxArchiveSize";
- if ($row->{size} > $max_archive_size) {
- ($row->{volumes}, $row->{inc_size_calc}) = getVolumes($row->{id});
- }
-
- $row->{size} = sprintf("%0.2f", $row->{size} / 1024 / 1024);
-
- # do some cluster calculation (approximate)
- $row->{inc_size} = int(( ($row->{inc_size} + 1023 ) / 2 ) * 2);
- $row->{inc_size_calc} ||= $row->{inc_size};
push @ret, $row;
}
my $param = shift;
- my $max_archive_size = $Conf{MaxArchiveSize} || die "no MaxArchiveSize";
- my $max_archive_file_size = $Conf{MaxArchiveFileSize} || die "no MaxFileInSize";
+ my $max_archive_size = $Conf{ArchiveMediaSize} || die "no ArchiveMediaSize";
+ my $max_archive_file_size = $Conf{ArchiveChunkSize} || die "no MaxFileInSize";
my $retHTML .= q{
<form id="forma" method="POST" action="}.$MyURL.q{?action=burn">
suma -= size;
}
- var volumes = parseInt( element_id("prt" + name).value);
- debug('update_size('+name+','+checked+') suma: '+suma+' volumes: '+volumes);
+ debug('update_size('+name+','+checked+') suma: '+suma);
+/* FIXME
if (volumes > 1) {
if (checked) {
element_id("volumes").innerHTML = "This will take "+volumes+" mediums!";
element_id("volumes").style.display = 'none';
}
}
-
+*/
return suma;
}
<input type="checkbox" name="allFiles" id="allFiles" onClick="checkAll('allFiles');">
</td>
} .
- sort_header($param, 'Share', 'share', 'center') .
- sort_header($param, '#', 'num', 'center') .
- qq{
- <td align="center">Type</td>
- } .
+ sort_header($param, 'Filename', 'filename', 'left') .
sort_header($param, 'Date', 'date', 'center') .
sort_header($param, 'Age/days', 'age', 'center') .
- sort_header($param, 'Size/Mb', 'size', 'center') .
- sort_header($param, 'gzip size/Kb', 'incsize', 'center') .
+ sort_header($param, 'Size', 'size', 'center') .
qq{
- <td align="center">medias</td></tr>
+ <td align="center" title="scheduled">sc</td>
+ <td align="center" title="burned">bu</td>
+ </tr>
};
my @color = (' bgcolor="#e0e0e0"', '');
- my $i = 0;
- my $host = '';
+ my $i = 1;
+# my $img_url = $Conf{CgiImageDirURL};
foreach my $backup ( getBackupsNotBurned($param) ) {
- if ($host ne $backup->{'host'}) {
- $i++;
- $host = $backup->{'host'};
- }
- my $ftype = "";
-
- my $checkbox_key = $backup->{'hostid'}. '_' .$backup->{'backupnum'} . '_' . $backup->{'id'};
-
- $retHTML .=
- '<tr' . $color[$i %2 ] . '>
- <td class="fview">';
-
- if (($backup->{'inc_size'} || 0) > 0) {
- $retHTML .= '
- <input type="checkbox" name="fcb' . $checkbox_key . '" value="' . $checkbox_key . '" onClick="sumiraj(this);">';
- }
-
- my $img_url = $Conf{CgiImageDirURL};
-
- $retHTML .=
- '</td>' .
- '<td align="right">' . $backup->{'host'} . ':' . $backup->{'share'} . '</td>' .
- '<td align="center">' . $backup->{'backupnum'} . '</td>' .
- '<td align="center">' . $backup->{'type'} . '</td>' .
- '<td align="center">' . epoch_to_iso( $backup->{'date'} ) . '</td>' .
- '<td align="center">' . $backup->{'age'} . '</td>' .
- '<td align="right">' . $backup->{'size'} . '</td>' .
- '<td align="right">' . sprintf("%0.1f", $backup->{'inc_size'} / 1024 ) .
- '<input type="hidden" id="fss'.$checkbox_key .'" value="'. $backup->{'inc_size_calc'} .'"></td>' .
- '<input type="hidden" id="prt'.$checkbox_key .'" value="'. $backup->{'volumes'} .'"></td>' .
- '<td align="left">' . ( qq{<img src="$img_url/icon-cd.gif" alt="media">} x $backup->{volumes} ) . '</td>' .
-
- "</tr>\n";
+ $retHTML .= join(''
+ ,'<tr',$color[$i++%2],'>'
+ ,'<td class="fview">'
+ ,'<input type="checkbox" name="fcb',$backup->{id},'" value="',$backup->{id},'" onClick="sumiraj(this);">'
+ ,'<input type="hidden" id="fss',$backup->{id},'" value="',$backup->{size},'">'
+ ,'</td>'
+ ,'<td align="left">', $backup->{'filename'}, '</td>'
+ ,'<td align="center">', epoch_to_iso( $backup->{'date'} ), '</td>'
+ ,'<td align="center">', $backup->{'age'}, '</td>'
+ ,'<td align="right">', unit($backup->{'size'}), '</td>'
+ ,'<td align="center">', $backup->{scheduled}, '</td>'
+ ,'<td align="center">', $backup->{burned}, '</td>'
+ ,"</tr>\n"
+ );
}
$retHTML .= "</table>";
}
$retHTML .=
- sort_header($param, 'Share', 'share', 'center') .
- sort_header($param, 'Type and Name', 'path', 'center') .
- sort_header($param, '#', 'num', 'center') .
+ sort_header($param, 'Share', 'sname', 'center') .
+ sort_header($param, 'Type and Name', 'filepath', 'center') .
+ sort_header($param, '#', 'backupnum', 'center') .
sort_header($param, 'Size', 'size', 'center') .
sort_header($param, 'Date', 'date', 'center');
return $retHTML;
}
+my @units = qw/b k M G/;
+sub unit {
+ my $v = shift;
+
+ my $o = 0;
+
+ while ( ( $v / 10000 ) >= 1 ) {
+ $o++;
+ $v /= 1024;
+ }
+
+ if ( $v >= 1 ) {
+ return sprintf("%d%s", $v, $units[$o]);
+ } elsif ( $v == 0 ) {
+ return 0;
+ } else {
+ return sprintf("%.1f%s", $v, $units[$o]);
+ }
+}
+
1;