/[BackupPC]/trunk/lib/BackupPC/SearchLib.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /trunk/lib/BackupPC/SearchLib.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 194 - (hide annotations)
Thu Oct 13 17:11:59 2005 UTC (18 years, 7 months ago) by dpavlin
File size: 22016 byte(s)
 r8502@llin:  dpavlin | 2005-10-13 19:05:29 +0200
 split archives which are larger than MaxArchiveSize to multiple parts

1 dpavlin 4 #!/usr/bin/perl
2     package BackupPC::SearchLib;
3    
4     use strict;
5     use BackupPC::CGI::Lib qw(:all);
6     use BackupPC::Attrib qw(:all);
7     use DBI;
8 dpavlin 51 use DateTime;
9 dpavlin 31 use vars qw(%In $MyURL);
10 dpavlin 55 use Time::HiRes qw/time/;
11 iklaric 187 use XML::Writer;
12     use IO::File;
13 dpavlin 4
14 dpavlin 31 my $on_page = 100;
15     my $pager_pages = 10;
16    
17 dpavlin 51 my $dsn = $Conf{SearchDSN};
18     my $db_user = $Conf{SearchUser} || '';
19    
20 dpavlin 123 my $hest_index_path = $Conf{HyperEstraierIndex};
21 dpavlin 86
22 dpavlin 84 my $dbh;
23    
24     sub get_dbh {
25     $dbh ||= DBI->connect($dsn, $db_user, "", { RaiseError => 1, AutoCommit => 1 } );
26     return $dbh;
27     }
28    
29 dpavlin 4 sub getUnits() {
30 dpavlin 59 my @ret;
31    
32 dpavlin 84 my $dbh = get_dbh();
33 dpavlin 86 my $sth = $dbh->prepare(qq{
34     SELECT
35     shares.id as id,
36     hosts.name || ':' || shares.name as share
37     FROM shares
38     JOIN hosts on hostid = hosts.id
39     ORDER BY share
40     } );
41 dpavlin 59 $sth->execute();
42     push @ret, { 'id' => '', 'share' => '-'}; # dummy any
43    
44     while ( my $row = $sth->fetchrow_hashref() ) {
45     push @ret, $row;
46     }
47     return @ret;
48 dpavlin 4 }
49    
50 dpavlin 51 sub epoch_to_iso {
51     my $t = shift || return;
52 dpavlin 86 my $iso = BackupPC::Lib::timeStamp(undef, $t);
53 dpavlin 79 $iso =~ s/\s/ /g;
54     return $iso;
55 dpavlin 51 }
56    
57 dpavlin 83 sub dates_from_form($) {
58     my $param = shift || return;
59 dpavlin 4
60 dpavlin 51 sub mk_epoch_date($$) {
61 dpavlin 19 my ($name,$suffix) = @_;
62 dpavlin 4
63 dpavlin 87 my $yyyy = $param->{ $name . '_year_' . $suffix} || return undef;
64 dpavlin 19 my $mm .= $param->{ $name . '_month_' . $suffix} ||
65     ( $suffix eq 'from' ? 1 : 12);
66     my $dd .= $param->{ $name . '_day_' . $suffix} ||
67     ( $suffix eq 'from' ? 1 : 31);
68 dpavlin 87
69     $yyyy =~ s/\D//g;
70     $mm =~ s/\D//g;
71     $dd =~ s/\D//g;
72    
73 dpavlin 186 my $h = my $m = my $s = 0;
74     if ($suffix eq 'to') {
75     $h = 23;
76     $m = 59;
77     $s = 59;
78     }
79    
80 dpavlin 51 my $dt = new DateTime(
81     year => $yyyy,
82     month => $mm,
83 dpavlin 186 day => $dd,
84     hour => $h,
85     minute => $m,
86     second => $s,
87 dpavlin 51 );
88 dpavlin 87 print STDERR "mk_epoch_date($name,$suffix) [$yyyy-$mm-$dd] = " . $dt->ymd . " " . $dt->hms . "\n";
89 dpavlin 51 return $dt->epoch || 'NULL';
90 dpavlin 19 }
91 dpavlin 4
92 dpavlin 87 my @ret = (
93 dpavlin 83 mk_epoch_date('search_backup', 'from'),
94     mk_epoch_date('search_backup', 'to'),
95     mk_epoch_date('search', 'from'),
96     mk_epoch_date('search', 'to'),
97     );
98 dpavlin 87
99     return @ret;
100    
101 dpavlin 83 }
102    
103    
104     sub getWhere($) {
105     my $param = shift || return;
106    
107     my ($backup_from, $backup_to, $files_from, $files_to) = dates_from_form($param);
108    
109     my @conditions;
110 dpavlin 51 push @conditions, qq{ backups.date >= $backup_from } if ($backup_from);
111     push @conditions, qq{ backups.date <= $backup_to } if ($backup_to);
112     push @conditions, qq{ files.date >= $files_from } if ($files_from);
113     push @conditions, qq{ files.date <= $files_to } if ($files_to);
114 dpavlin 19
115 dpavlin 186 print STDERR "backup: $backup_from - $backup_to files: $files_from - $files_to cond:" . join(" and ",@conditions);
116 dpavlin 83
117 dpavlin 60 push( @conditions, ' files.shareid = ' . $param->{'search_share'} ) if ($param->{'search_share'});
118 dpavlin 62 push (@conditions, " upper(files.path) LIKE upper('%".$param->{'search_filename'}."%')") if ($param->{'search_filename'});
119 dpavlin 19
120 dpavlin 83 return join(" and ", @conditions);
121 dpavlin 4 }
122    
123 dpavlin 19
124 dpavlin 87 sub getFiles($) {
125     my ($param) = @_;
126 dpavlin 31
127 dpavlin 87 my $offset = $param->{'offset'} || 0;
128     $offset *= $on_page;
129    
130 dpavlin 84 my $dbh = get_dbh();
131 dpavlin 31
132     my $sql_cols = qq{
133     files.id AS fid,
134     hosts.name AS hname,
135     shares.name AS sname,
136 dpavlin 86 files.backupnum AS backupnum,
137 dpavlin 31 files.path AS filepath,
138 dpavlin 51 files.date AS date,
139 dpavlin 86 files.type AS type,
140 dpavlin 87 files.size AS size
141 dpavlin 31 };
142    
143     my $sql_from = qq{
144 dpavlin 16 FROM files
145     INNER JOIN shares ON files.shareID=shares.ID
146     INNER JOIN hosts ON hosts.ID = shares.hostID
147 dpavlin 87 INNER JOIN backups ON backups.num = files.backupnum and backups.hostID = hosts.ID AND backups.shareID = files.shareID
148 dpavlin 55 };
149    
150 dpavlin 31 my $sql_where;
151 dpavlin 83 my $where = getWhere($param);
152 dpavlin 31 $sql_where = " WHERE ". $where if ($where);
153 dpavlin 4
154 dpavlin 31 my $sql_order = qq{
155 dpavlin 64 ORDER BY files.date
156 dpavlin 59 LIMIT $on_page
157     OFFSET ?
158 dpavlin 9 };
159 dpavlin 31
160 dpavlin 59 my $sql_count = qq{ select count(files.id) $sql_from $sql_where };
161 dpavlin 87 my $sql_results = qq{ select $sql_cols $sql_from $sql_where $sql_order };
162 dpavlin 59
163     my $sth = $dbh->prepare($sql_count);
164 dpavlin 31 $sth->execute();
165     my ($results) = $sth->fetchrow_array();
166    
167 dpavlin 59 $sth = $dbh->prepare($sql_results);
168 dpavlin 31 $sth->execute( $offset );
169    
170 dpavlin 59 if ($sth->rows != $results) {
171     my $bug = "$0 BUG: [[ $sql_count ]] = $results while [[ $sql_results ]] = " . $sth->rows;
172     $bug =~ s/\s+/ /gs;
173     print STDERR "$bug\n";
174     }
175    
176 dpavlin 31 my @ret;
177 dpavlin 4
178 dpavlin 31 while (my $row = $sth->fetchrow_hashref()) {
179 dpavlin 86 push @ret, $row;
180 dpavlin 4 }
181 dpavlin 59
182 dpavlin 31 $sth->finish();
183     return ($results, \@ret);
184     }
185 dpavlin 4
186 dpavlin 117 sub getHyperEstraier_url($) {
187     my ($use_hest) = @_;
188    
189     return unless $use_hest;
190    
191     use HyperEstraier;
192     my ($index_path, $index_node_url);
193    
194     if ($use_hest =~ m#^http://#) {
195     $index_node_url = $use_hest;
196     } else {
197     $index_path = $TopDir . '/' . $index_path;
198     $index_path =~ s#//#/#g;
199     }
200     return ($index_path, $index_node_url);
201     }
202    
203 dpavlin 87 sub getFilesHyperEstraier($) {
204     my ($param) = @_;
205 dpavlin 86
206 dpavlin 87 my $offset = $param->{'offset'} || 0;
207     $offset *= $on_page;
208    
209 dpavlin 123 die "no index_path?" unless ($hest_index_path);
210 dpavlin 86
211     use HyperEstraier;
212    
213 dpavlin 123 my ($index_path, $index_node_url) = getHyperEstraier_url($hest_index_path);
214 dpavlin 117
215 dpavlin 86 # open the database
216 dpavlin 117 my $db;
217     if ($index_path) {
218     $db = HyperEstraier::Database->new();
219     $db->open($index_path, $HyperEstraier::ESTDBREADER);
220     } elsif ($index_node_url) {
221     $db ||= HyperEstraier::Node->new($index_node_url);
222     $db->set_auth('admin', 'admin');
223     } else {
224     die "BUG: unimplemented";
225     }
226 dpavlin 86
227     # create a search condition object
228     my $cond = HyperEstraier::Condition->new();
229    
230     my $q = $param->{'search_filename'};
231     my $shareid = $param->{'search_share'};
232    
233 dpavlin 88 if (length($q) > 0) {
234 dpavlin 91 # exact match
235     $cond->add_attr("filepath ISTRINC $q");
236    
237 dpavlin 86 $q =~ s/(.)/$1 /g;
238     # set the search phrase to the search condition object
239     $cond->set_phrase($q);
240 dpavlin 87 }
241 dpavlin 86
242 dpavlin 87 my ($backup_from, $backup_to, $files_from, $files_to) = dates_from_form($param);
243 dpavlin 86
244 dpavlin 87 $cond->add_attr("backup_date NUMGE $backup_from") if ($backup_from);
245     $cond->add_attr("backup_date NUMLE $backup_to") if ($backup_to);
246 dpavlin 86
247 dpavlin 87 $cond->add_attr("date NUMGE $files_from") if ($files_from);
248     $cond->add_attr("date NUMLE $files_to") if ($files_to);
249 dpavlin 86
250 dpavlin 87 $cond->add_attr("shareid NUMEQ $shareid") if ($shareid);
251 dpavlin 86
252     # $cond->set_max( $offset + $on_page );
253     $cond->set_options( $HyperEstraier::Condition::SURE );
254     $cond->set_order( 'date NUMA' );
255    
256     # get the result of search
257     my @res;
258 dpavlin 117 my ($result, $hits);
259 dpavlin 86
260 dpavlin 117 if ($index_path) {
261     $result = $db->search($cond, 0);
262     $hits = $result->size;
263     } elsif ($index_node_url) {
264     $result = $db->search($cond, 0);
265     $hits = $result->doc_num;
266     } else {
267     die "BUG: unimplemented";
268     }
269    
270 dpavlin 86 # for each document in result
271 dpavlin 87 for my $i ($offset .. ($offset + $on_page - 1)) {
272     last if ($i >= $hits);
273    
274 dpavlin 117 my $doc;
275     if ($index_path) {
276     my $id = $result->get($i);
277     $doc = $db->get_doc($id, 0);
278     } elsif ($index_node_url) {
279     $doc = $result->get_doc($i);
280     } else {
281     die "BUG: unimplemented";
282     }
283 dpavlin 86
284     my $row;
285     foreach my $c (qw/fid hname sname backupnum fiilename filepath date type size/) {
286     $row->{$c} = $doc->attr($c);
287     }
288     push @res, $row;
289     }
290    
291     return ($hits, \@res);
292     }
293    
294 dpavlin 109 sub getGzipName($$$)
295     {
296     my ($host, $share, $backupnum) = @_;
297     my $ret = $Conf{GzipSchema};
298    
299     $share =~ s/\//_/g;
300     $ret =~ s/\\h/$host/ge;
301     $ret =~ s/\\s/$share/ge;
302     $ret =~ s/\\n/$backupnum/ge;
303 dpavlin 155
304     $ret =~ s/__+/_/g;
305    
306 dpavlin 109 return $ret;
307    
308     }
309    
310 dpavlin 194 sub get_tgz_size_by_name($) {
311     my $name = shift;
312    
313     my $tgz = $Conf{InstallDir}.'/'.$Conf{GzipTempDir}.'/'.$name;
314    
315     my $size = -1;
316    
317     if (-f $tgz) {
318     $size = (stat($tgz))[7];
319     } elsif (-d $tgz) {
320     opendir(my $dir, $tgz) || die "can't opendir $tgz: $!";
321     my @parts = grep { !/^\./ && -f "$tgz/$_" } readdir($dir);
322     $size = 0;
323     foreach my $part (@parts) {
324     $size += (stat("$tgz/$part"))[7] || die "can't stat $tgz/$part: $!";
325     }
326     closedir $dir;
327     }
328    
329     return $size;
330     }
331    
332 iklaric 143 sub getGzipSize($$)
333     {
334     my ($hostID, $backupNum) = @_;
335     my $sql;
336     my $dbh = get_dbh();
337    
338     $sql = q{
339     SELECT hosts.name as host,
340     shares.name as share,
341     backups.num as backupnum
342     FROM hosts, backups, shares
343     WHERE shares.id=backups.shareid AND
344     hosts.id =backups.hostid AND
345     hosts.id=? AND
346 dpavlin 145 backups.num=?
347 iklaric 143 };
348     my $sth = $dbh->prepare($sql);
349 dpavlin 145 $sth->execute($hostID, $backupNum);
350    
351     my $row = $sth->fetchrow_hashref();
352 dpavlin 194
353     return get_tgz_size_by_name(
354     getGzipName($row->{'host'}, $row->{share}, $row->{'backupnum'})
355     );
356 iklaric 143 }
357    
358 dpavlin 51 sub getBackupsNotBurned() {
359    
360 dpavlin 84 my $dbh = get_dbh();
361 iklaric 121
362 dpavlin 122 my $sql = q{
363 iklaric 121 SELECT
364     backups.hostID AS hostID,
365     hosts.name AS host,
366     shares.name AS share,
367 dpavlin 145 backups.num AS backupnum,
368 iklaric 121 backups.type AS type,
369     backups.date AS date,
370 dpavlin 145 backups.size AS size,
371 dpavlin 161 backups.id AS id,
372     backups.inc_size AS inc_size
373 iklaric 121 FROM backups
374 dpavlin 122 INNER JOIN shares ON backups.shareID=shares.ID
375     INNER JOIN hosts ON backups.hostID = hosts.ID
376 iklaric 137 LEFT OUTER JOIN archive_backup ON archive_backup.backup_id = backups.id
377 dpavlin 171 WHERE backups.inc_size > 0 AND backups.inc_deleted is false AND archive_backup.backup_id IS NULL
378 dpavlin 122 GROUP BY
379     backups.hostID,
380     hosts.name,
381     shares.name,
382     backups.num,
383     backups.shareid,
384     backups.id,
385     backups.type,
386     backups.date,
387 dpavlin 161 backups.size,
388     backups.inc_size
389 iklaric 121 ORDER BY backups.date
390 dpavlin 53 };
391     my $sth = $dbh->prepare( $sql );
392     my @ret;
393     $sth->execute();
394 dpavlin 4
395 dpavlin 66 while ( my $row = $sth->fetchrow_hashref() ) {
396     $row->{'age'} = sprintf("%0.1f", ( (time() - $row->{'date'}) / 86400 ) );
397     $row->{'size'} = sprintf("%0.2f", $row->{'size'} / 1024 / 1024);
398 dpavlin 161
399     # do some cluster calculation (approximate) and convert to kB
400 dpavlin 166 $row->{'inc_size'} = int(($row->{'inc_size'} + 1023 ) / ( 2 * 1024 ) * 2);
401 dpavlin 66 push @ret, $row;
402 dpavlin 4 }
403    
404 dpavlin 53 return @ret;
405     }
406 dpavlin 4
407 dpavlin 126 sub displayBackupsGrid() {
408    
409     my $retHTML .= q{
410 ravilov 140 <form id="forma" method="POST" action="}.$MyURL.q{?action=burn">
411 dpavlin 126 };
412    
413 dpavlin 127 $retHTML .= <<'EOF3';
414 ravilov 140 <style type="text/css">
415 dpavlin 127 <!--
416 ravilov 140 DIV#fixedBox {
417 dpavlin 128 position: absolute;
418 ravilov 140 top: 50em;
419     left: -24%;
420 dpavlin 128 padding: 0.5em;
421 ravilov 140 width: 20%;
422     background-color: #E0F0E0;
423     border: 1px solid #00C000;
424 dpavlin 128 }
425 ravilov 140
426     DIV#fixedBox, DIV#fixedBox INPUT, DIV#fixedBox TEXTAREA {
427     font-size: 10pt;
428 dpavlin 128 }
429 dpavlin 127
430 ravilov 140 FORM>DIV#fixedBox {
431     position: fixed !important;
432     left: 0.5em !important;
433     top: auto !important;
434     bottom: 1em !important;
435     width: 15% !important;
436     }
437    
438     DIV#fixedBox INPUT[type=text], DIV#fixedBox TEXTAREA {
439     border: 1px solid #00C000;
440     }
441    
442     DIV#fixedBox #note {
443     display: block;
444 dpavlin 128 width: 100%;
445     }
446    
447 ravilov 140 DIV#fixedBox #submitBurner {
448     display: block;
449 dpavlin 128 width: 100%;
450 ravilov 140 margin-top: 0.5em;
451     cursor: pointer;
452     }
453    
454     * HTML {
455     overflow-y: hidden;
456     }
457    
458     * HTML BODY {
459     overflow-y: auto;
460 dpavlin 128 height: 100%;
461 ravilov 140 font-size: 100%;
462     }
463    
464     * HTML DIV#fixedBox {
465     position: absolute;
466     }
467    
468     #mContainer, #gradient, #mask, #progressIndicator {
469 dpavlin 128 display: block;
470 ravilov 140 width: 100%;
471     font-size: 10pt;
472     font-weight: bold;
473     text-align: center;
474     vertical-align: middle;
475     padding: 1px;
476 dpavlin 128 }
477    
478 ravilov 140 #gradient, #mask, #progressIndicator {
479     left: 0;
480     border-width: 1px;
481     border-style: solid;
482     border-color: #000000;
483     color: #404040;
484     margin: 0.4em;
485 dpavlin 128 position: absolute;
486 ravilov 140 margin-left: -1px;
487     margin-top: -1px;
488     margin-bottom: -1px;
489     overflow: hidden;
490     }
491    
492     #mContainer {
493 dpavlin 128 display: block;
494 ravilov 140 position: relative;
495     padding: 0px;
496     margin-top: 0.4em;
497     margin-bottom: 0.5em;
498     }
499    
500     #gradient {
501     z-index: 1;
502     background-color: #FFFF00;
503     }
504    
505     #mask {
506     z-index: 2;
507 dpavlin 128 background-color: #FFFFFF;
508     }
509    
510     #progressIndicator {
511 ravilov 140 z-index: 3;
512     background-color: transparent;
513 dpavlin 128 }
514 dpavlin 127 -->
515     </style>
516 ravilov 140 <script type="text/javascript">
517 dpavlin 4 <!--
518    
519 dpavlin 126 var debug_div = null;
520 dpavlin 149 EOF3
521 dpavlin 126
522 dpavlin 149 # take maximum archive size from configuration
523     $retHTML .= 'var media_size = '. $Conf{MaxArchiveSize} .';';
524    
525     $retHTML .= <<'EOF3';
526    
527 dpavlin 126 function debug(msg) {
528     // return; // Disable debugging
529    
530     if (! debug_div) debug_div = document.getElementById('debug');
531    
532     // this will create debug div if it doesn't exist.
533     if (! debug_div) {
534     debug_div = document.createElement('div');
535     if (document.body) document.body.appendChild(debug_div);
536     else debug_div = null;
537     }
538     if (debug_div) {
539     debug_div.appendChild(document.createTextNode(msg));
540     debug_div.appendChild(document.createElement("br"));
541     }
542     }
543    
544    
545     var element_id_cache = Array();
546    
547     function element_id(name,element) {
548     if (! element_id_cache[name]) {
549     element_id_cache[name] = self.document.getElementById(name);
550     }
551     return element_id_cache[name];
552     }
553    
554     function checkAll(location) {
555 ravilov 142 var f = element_id('forma') || null;
556     if (!f) return false;
557    
558     var len = f.elements.length;
559 dpavlin 126 var check_all = element_id('allFiles');
560 ravilov 142 var suma = check_all.checked ? (parseInt(f.elements['totalsize'].value) || 0) : 0;
561 dpavlin 126
562     for (var i = 0; i < len; i++) {
563 ravilov 142 var e = f.elements[i];
564     if (e.name != 'all' && e.name.substr(0, 3) == 'fcb') {
565 dpavlin 126 if (check_all.checked) {
566 ravilov 142 if (e.checked) continue;
567 dpavlin 129 var el = element_id("fss" + e.name.substr(3));
568     var size = parseInt(el.value) || 0;
569     debug('suma: '+suma+' size: '+size);
570     if ((suma + size) < media_size) {
571     suma += size;
572     e.checked = true;
573     } else {
574     break;
575     }
576 dpavlin 126 } else {
577     e.checked = false;
578     }
579     }
580     }
581 dpavlin 129 update_sum(suma);
582     }
583 dpavlin 126
584 dpavlin 129 function update_sum(suma) {
585 ravilov 141 element_id('forma').elements['totalsize'].value = suma;
586 dpavlin 129 pbar_set(suma, media_size);
587 ravilov 141 debug('total size: ' + suma);
588 dpavlin 126 }
589 dpavlin 129
590 dpavlin 126 function sumiraj(e) {
591 ravilov 141 var suma = parseInt(element_id('forma').elements['totalsize'].value) || 0;
592 dpavlin 126 var len = element_id('forma').elements.length;
593     if (e) {
594 ravilov 140 var size = parseInt( element_id("fss" + e.name.substr(3)).value);
595 dpavlin 126 if (e.checked) {
596     suma += size;
597     } else {
598     suma -= size;
599     }
600     } else {
601     suma = 0;
602     for (var i = 0; i < len; i++) {
603     var e = element_id('forma').elements[i];
604 dpavlin 127 if (e.name != 'all' && e.checked && e.name.substr(0,3) == 'fcb') {
605 dpavlin 126 var el = element_id("fss" + e.name.substr(3));
606     if (el && el.value) suma += parseInt(el.value) || 0;
607     }
608     }
609     }
610 dpavlin 129 update_sum(suma);
611 iklaric 121 return suma;
612 dpavlin 126 }
613    
614 dpavlin 128 /* progress bar */
615    
616 ravilov 140 var _pbar_width = null;
617 dpavlin 128 var _pbar_warn = 10; // change color in last 10%
618    
619     function pbar_reset() {
620     element_id("mask").style.left = "0px";
621     _pbar_width = element_id("mContainer").offsetWidth - 2;
622     element_id("mask").style.width = _pbar_width + "px";
623 ravilov 140 element_id("mask").style.display = "block";
624 dpavlin 128 element_id("progressIndicator").style.zIndex = 10;
625     element_id("progressIndicator").innerHTML = "0";
626     }
627    
628     function dec2hex(d) {
629 ravilov 140 var hch = '0123456789ABCDEF';
630     var a = d % 16;
631     var q = (d - a) / 16;
632     return hch.charAt(q) + hch.charAt(a);
633 dpavlin 128 }
634    
635     function pbar_set(amount, max) {
636 ravilov 140 debug('pbar_set('+amount+', '+max+')');
637 dpavlin 128
638 ravilov 140 if (_pbar_width == null) {
639     var _mc = element_id("mContainer");
640     if (_pbar_width == null) _pbar_width = parseInt(_mc.offsetWidth ? (_mc.offsetWidth - 2) : 0) || null;
641     if (_pbar_width == null) _pbar_width = parseInt(_mc.clientWidth ? (_mc.clientWidth + 2) : 0) || null;
642     if (_pbar_width == null) _pbar_width = 0;
643     }
644 dpavlin 128
645 ravilov 140 var pcnt = Math.floor(amount * 100 / max);
646 dpavlin 128 var p90 = 100 - _pbar_warn;
647     var pcol = pcnt - p90;
648 ravilov 140 if (Math.round(pcnt) <= 100) {
649 dpavlin 128 if (pcol < 0) pcol = 0;
650     var e = element_id("submitBurner");
651 ravilov 140 debug('enable_button');
652     e.disabled = false;
653     var a = e.getAttributeNode('disabled') || null;
654     if (a) e.removeAttributeNode(a);
655     } else {
656 dpavlin 128 debug('disable button');
657     pcol = _pbar_warn;
658     var e = element_id("submitBurner");
659 ravilov 140 if (!e.disabled) e.disabled = true;
660 dpavlin 128 }
661 ravilov 140 var col_g = Math.floor((_pbar_warn - pcol) * 255 / _pbar_warn);
662     var col = '#FF' + dec2hex(col_g) + '00';
663 dpavlin 128
664     //debug('pcol: '+pcol+' g:'+col_g+' _pbar_warn:'+ _pbar_warn + ' color: '+col);
665     element_id("gradient").style.backgroundColor = col;
666    
667     element_id("progressIndicator").innerHTML = pcnt + '%';
668     //element_id("progressIndicator").innerHTML = amount;
669    
670 ravilov 140 element_id("mask").style.clip = 'rect(' + Array(
671     '0px',
672     element_id("mask").offsetWidth + 'px',
673     element_id("mask").offsetHeight + 'px',
674     Math.round(_pbar_width * amount / max) + 'px'
675     ).join(' ') + ')';
676 dpavlin 128 }
677    
678 dpavlin 126 if (!self.body) self.body = new Object();
679     self.onload = self.document.onload = self.body.onload = function() {
680 ravilov 140 //pbar_reset();
681 dpavlin 126 sumiraj();
682 ravilov 140 };
683 dpavlin 126
684 ravilov 140 // -->
685 dpavlin 126 </script>
686 dpavlin 127 <div id="fixedBox">
687    
688 ravilov 140 Size: <input type="text" name="totalsize" size="7" readonly="readonly" style="text-align:right;" value="0" /> kB
689 dpavlin 128
690     <div id="mContainer">
691 ravilov 140 <div id="gradient">&nbsp;</div>
692     <div id="mask">&nbsp;</div>
693     <div id="progressIndicator">0%</div>
694 dpavlin 128 </div>
695 ravilov 140 <br/>
696 dpavlin 128
697 dpavlin 126 Note:
698 ravilov 140 <textarea name="note" cols="10" rows="5" id="note"></textarea>
699 dpavlin 127
700 ravilov 140 <input type="submit" id="submitBurner" value="Burn selected" name="submitBurner" />
701    
702 dpavlin 126 </div>
703 ravilov 140 <!--
704 dpavlin 127 <div id="debug" style="float: right; width: 10em; border: 1px #ff0000 solid; background-color: #ffe0e0; -moz-opacity: 0.7;">
705     no debug output yet
706     </div>
707 ravilov 140 -->
708 dpavlin 4 EOF3
709 dpavlin 102 $retHTML .= q{
710 iklaric 121 <input type="hidden" value="burn" name="action">
711     <input type="hidden" value="results" name="search_results">
712     <table style="fview" border="0" cellspacing="0" cellpadding="2">
713     <tr class="tableheader">
714     <td class="tableheader">
715 dpavlin 126 <input type="checkbox" name="allFiles" id="allFiles" onClick="checkAll('allFiles');">
716 iklaric 121 </td>
717     <td align="center">Share</td>
718     <td align="center">Backup no</td>
719     <td align="center">Type</td>
720     <td align="center">date</td>
721     <td align="center">age/days</td>
722     <td align="center">size/MB</td>
723 dpavlin 161 <td align="center">gzip size/kB</td>
724 iklaric 121 </tr>
725 dpavlin 102
726 dpavlin 58 };
727 dpavlin 4
728 dpavlin 102 my @color = (' bgcolor="#e0e0e0"', '');
729 dpavlin 31
730 dpavlin 102 my $i = 0;
731     my $host = '';
732 dpavlin 31
733 dpavlin 102 foreach my $backup ( getBackupsNotBurned() ) {
734 dpavlin 31
735 dpavlin 102 if ($host ne $backup->{'host'}) {
736     $i++;
737     $host = $backup->{'host'};
738     }
739 dpavlin 31 my $ftype = "";
740 dpavlin 125
741 dpavlin 145 my $checkbox_key = $backup->{'hostid'}. '_' .$backup->{'backupnum'} . '_' . $backup->{'id'};
742    
743 dpavlin 102 $retHTML .=
744 dpavlin 125 '<tr' . $color[$i %2 ] . '>
745     <td class="fview">';
746 dpavlin 145
747 dpavlin 161 if (($backup->{'inc_size'} || 0) > 0) {
748 dpavlin 125 $retHTML .= '
749 dpavlin 145 <input type="checkbox" name="fcb' . $checkbox_key . '" value="' . $checkbox_key . '" onClick="sumiraj(this);">';
750 dpavlin 125 }
751 dpavlin 145
752 dpavlin 125 $retHTML .=
753     '</td>' .
754 dpavlin 102 '<td align="right">' . $backup->{'host'} . ':' . $backup->{'share'} . '</td>' .
755     '<td align="center">' . $backup->{'backupnum'} . '</td>' .
756     '<td align="center">' . $backup->{'type'} . '</td>' .
757     '<td align="center">' . epoch_to_iso( $backup->{'date'} ) . '</td>' .
758     '<td align="center">' . $backup->{'age'} . '</td>' .
759     '<td align="right">' . $backup->{'size'} . '</td>' .
760 dpavlin 161 '<td align="right">' . $backup->{'inc_size'} .
761     '<input type="hidden" iD="fss'.$checkbox_key .'" value="'. $backup->{'inc_size'} .'"></td>' .
762 dpavlin 125
763 dpavlin 102 "</tr>\n";
764 dpavlin 4 }
765 dpavlin 31
766     $retHTML .= "</table>";
767 dpavlin 102 $retHTML .= "</form>";
768 dpavlin 4
769 dpavlin 31 return $retHTML;
770     }
771 dpavlin 4
772 dpavlin 86 sub displayGrid($) {
773     my ($param) = @_;
774 dpavlin 83
775     my $offset = $param->{'offset'};
776     my $hilite = $param->{'search_filename'};
777    
778 dpavlin 17 my $retHTML = "";
779    
780 dpavlin 55 my $start_t = time();
781    
782 dpavlin 86 my ($results, $files);
783 dpavlin 88 if ($param->{'use_hest'} && length($hilite) > 0) {
784 dpavlin 87 ($results, $files) = getFilesHyperEstraier($param);
785 dpavlin 86 } else {
786 dpavlin 87 ($results, $files) = getFiles($param);
787 dpavlin 86 }
788 dpavlin 31
789 dpavlin 55 my $dur_t = time() - $start_t;
790     my $dur = sprintf("%0.4fs", $dur_t);
791    
792 dpavlin 31 my ($from, $to) = (($offset * $on_page) + 1, ($offset * $on_page) + $on_page);
793    
794 dpavlin 59 if ($results <= 0) {
795     $retHTML .= qq{
796     <p style="color: red;">No results found...</p>
797     };
798     return $retHTML;
799     } else {
800     # DEBUG
801     #use Data::Dumper;
802     #$retHTML .= '<pre>' . Dumper($files) . '</pre>';
803     }
804    
805    
806 dpavlin 17 $retHTML .= qq{
807 dpavlin 79 <div>
808     Found <b>$results files</b> showing <b>$from - $to</b> (took $dur)
809     </div>
810     <table style="fview" width="100%" border="0" cellpadding="2" cellspacing="0">
811     <tr class="fviewheader">
812 dpavlin 87 <td></td>
813 dpavlin 79 <td align="center">Share</td>
814     <td align="center">Type and Name</td>
815     <td align="center">#</td>
816     <td align="center">Size</td>
817     <td align="center">Date</td>
818     <td align="center">Media</td>
819 dpavlin 17 </tr>
820     };
821 dpavlin 31
822 dpavlin 17 my $file;
823 dpavlin 4
824 dpavlin 17 sub hilite_html($$) {
825     my ($html, $search) = @_;
826     $html =~ s#($search)#<b>$1</b>#gis;
827     return $html;
828 dpavlin 4 }
829 dpavlin 9
830 dpavlin 26 sub restore_link($$$$$$) {
831     my $type = shift;
832     my $action = 'RestoreFile';
833     $action = 'browse' if (lc($type) eq 'dir');
834     return sprintf(qq{<a href="?action=%s&host=%s&num=%d&share=%s&dir=%s">%s</a>}, $action, @_);
835     }
836    
837 dpavlin 87 my $i = $offset * $on_page;
838    
839 dpavlin 31 foreach $file (@{ $files }) {
840 dpavlin 87 $i++;
841    
842 dpavlin 24 my $typeStr = BackupPC::Attrib::fileType2Text(undef, $file->{'type'});
843 dpavlin 79 $retHTML .= qq{<tr class="fviewborder">};
844 dpavlin 9
845 dpavlin 88 $retHTML .= qq{<td class="fviewborder">$i</td>};
846 dpavlin 87
847 dpavlin 79 $retHTML .=
848 dpavlin 86 qq{<td class="fviewborder" align="right">} . $file->{'hname'} . ':' . $file->{'sname'} . qq{</td>} .
849     qq{<td class="fviewborder"><img src="$Conf{CgiImageDirURL}/icon-$typeStr.gif" alt="$typeStr" align="middle">&nbsp;} . hilite_html( $file->{'filepath'}, $hilite ) . qq{</td>} .
850     qq{<td class="fviewborder" align="center">} . restore_link( $typeStr, ${EscURI( $file->{'hname'} )}, $file->{'backupnum'}, ${EscURI( $file->{'sname'})}, ${EscURI( $file->{'filepath'} )}, $file->{'backupnum'} ) . qq{</td>} .
851 dpavlin 79 qq{<td class="fviewborder" align="right">} . $file->{'size'} . qq{</td>} .
852     qq{<td class="fviewborder">} . epoch_to_iso( $file->{'date'} ) . qq{</td>} .
853 dpavlin 87 qq{<td class="fviewborder">} . '?' . qq{</td>};
854 dpavlin 9
855 dpavlin 17 $retHTML .= "</tr>";
856     }
857     $retHTML .= "</table>";
858    
859 dpavlin 31 # all variables which has to be transfered
860     foreach my $n (qw/search_day_from search_month_from search_year_from search_day_to search_month_to search_year_to search_backup_day_from search_backup_month_from search_backup_year_from search_backup_day_to search_backup_month_to search_backup_year_to search_filename offset/) {
861     $retHTML .= qq{<INPUT TYPE="hidden" NAME="$n" VALUE="$In{$n}">\n};
862     }
863 dpavlin 17
864 dpavlin 31 my $del = '';
865     my $max_page = int( $results / $on_page );
866     my $page = 0;
867    
868 dpavlin 85 sub page_link($$$) {
869     my ($param,$page,$display) = @_;
870 dpavlin 31
871 dpavlin 85 $param->{'offset'} = $page;
872    
873     my $html = '<a href = "' . $MyURL;
874     my $del = '?';
875     foreach my $k (keys %{ $param }) {
876     if ($param->{$k}) {
877     $html .= $del . $k . '=' . ${EscURI( $param->{$k} )};
878     $del = '&';
879     }
880     }
881     $html .= '">' . $display . '</a>';
882     }
883    
884 dpavlin 31 $retHTML .= '<div style="text-align: center;">';
885    
886     if ($offset > 0) {
887 dpavlin 85 $retHTML .= page_link($param, $offset - 1, '&lt;&lt;') . ' ';
888 dpavlin 31 }
889    
890     while ($page <= $max_page) {
891     if ($page == $offset) {
892     $retHTML .= $del . '<b>' . ($page + 1) . '</b>';
893     } else {
894 dpavlin 85 $retHTML .= $del . page_link($param, $page, $page + 1);
895 dpavlin 17 }
896 dpavlin 31
897     if ($page < $offset - $pager_pages && $page != 0) {
898     $retHTML .= " ... ";
899     $page = $offset - $pager_pages;
900     $del = '';
901     } elsif ($page > $offset + $pager_pages && $page != $max_page) {
902     $retHTML .= " ... ";
903     $page = $max_page;
904     $del = '';
905     } else {
906     $del = ' | ';
907     $page++;
908     }
909 dpavlin 17 }
910    
911 dpavlin 31 if ($offset < $max_page) {
912 dpavlin 85 $retHTML .= ' ' . page_link($param, $offset + 1, '&gt;&gt;');
913 dpavlin 31 }
914    
915     $retHTML .= "</div>";
916    
917 dpavlin 17 return $retHTML;
918     }
919 dpavlin 4
920     1;

  ViewVC Help
Powered by ViewVC 1.1.26