/[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 197 - (hide annotations)
Thu Oct 13 18:33:00 2005 UTC (18 years, 7 months ago) by dpavlin
File size: 22755 byte(s)
 r8507@llin:  dpavlin | 2005-10-13 20:32:53 +0200
 added support for multiple parts to user interface

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 dpavlin 197 backups.inc_size AS inc_size,
373     backups.parts AS parts
374 iklaric 121 FROM backups
375 dpavlin 122 INNER JOIN shares ON backups.shareID=shares.ID
376     INNER JOIN hosts ON backups.hostID = hosts.ID
377 iklaric 137 LEFT OUTER JOIN archive_backup ON archive_backup.backup_id = backups.id
378 dpavlin 171 WHERE backups.inc_size > 0 AND backups.inc_deleted is false AND archive_backup.backup_id IS NULL
379 dpavlin 122 GROUP BY
380     backups.hostID,
381     hosts.name,
382     shares.name,
383     backups.num,
384     backups.shareid,
385     backups.id,
386     backups.type,
387     backups.date,
388 dpavlin 161 backups.size,
389 dpavlin 197 backups.inc_size,
390     backups.parts
391 iklaric 121 ORDER BY backups.date
392 dpavlin 53 };
393     my $sth = $dbh->prepare( $sql );
394     my @ret;
395     $sth->execute();
396 dpavlin 4
397 dpavlin 66 while ( my $row = $sth->fetchrow_hashref() ) {
398     $row->{'age'} = sprintf("%0.1f", ( (time() - $row->{'date'}) / 86400 ) );
399     $row->{'size'} = sprintf("%0.2f", $row->{'size'} / 1024 / 1024);
400 dpavlin 161
401     # do some cluster calculation (approximate) and convert to kB
402 dpavlin 166 $row->{'inc_size'} = int(($row->{'inc_size'} + 1023 ) / ( 2 * 1024 ) * 2);
403 dpavlin 66 push @ret, $row;
404 dpavlin 4 }
405    
406 dpavlin 53 return @ret;
407     }
408 dpavlin 4
409 dpavlin 126 sub displayBackupsGrid() {
410    
411     my $retHTML .= q{
412 ravilov 140 <form id="forma" method="POST" action="}.$MyURL.q{?action=burn">
413 dpavlin 126 };
414    
415 dpavlin 127 $retHTML .= <<'EOF3';
416 ravilov 140 <style type="text/css">
417 dpavlin 127 <!--
418 ravilov 140 DIV#fixedBox {
419 dpavlin 128 position: absolute;
420 ravilov 140 top: 50em;
421     left: -24%;
422 dpavlin 128 padding: 0.5em;
423 ravilov 140 width: 20%;
424     background-color: #E0F0E0;
425     border: 1px solid #00C000;
426 dpavlin 128 }
427 ravilov 140
428     DIV#fixedBox, DIV#fixedBox INPUT, DIV#fixedBox TEXTAREA {
429     font-size: 10pt;
430 dpavlin 128 }
431 dpavlin 127
432 ravilov 140 FORM>DIV#fixedBox {
433     position: fixed !important;
434     left: 0.5em !important;
435     top: auto !important;
436     bottom: 1em !important;
437     width: 15% !important;
438     }
439    
440     DIV#fixedBox INPUT[type=text], DIV#fixedBox TEXTAREA {
441     border: 1px solid #00C000;
442     }
443    
444     DIV#fixedBox #note {
445     display: block;
446 dpavlin 128 width: 100%;
447     }
448    
449 ravilov 140 DIV#fixedBox #submitBurner {
450     display: block;
451 dpavlin 128 width: 100%;
452 ravilov 140 margin-top: 0.5em;
453     cursor: pointer;
454     }
455    
456     * HTML {
457     overflow-y: hidden;
458     }
459    
460     * HTML BODY {
461     overflow-y: auto;
462 dpavlin 128 height: 100%;
463 ravilov 140 font-size: 100%;
464     }
465    
466     * HTML DIV#fixedBox {
467     position: absolute;
468     }
469    
470     #mContainer, #gradient, #mask, #progressIndicator {
471 dpavlin 128 display: block;
472 ravilov 140 width: 100%;
473     font-size: 10pt;
474     font-weight: bold;
475     text-align: center;
476     vertical-align: middle;
477     padding: 1px;
478 dpavlin 128 }
479    
480 ravilov 140 #gradient, #mask, #progressIndicator {
481     left: 0;
482     border-width: 1px;
483     border-style: solid;
484     border-color: #000000;
485     color: #404040;
486     margin: 0.4em;
487 dpavlin 128 position: absolute;
488 ravilov 140 margin-left: -1px;
489     margin-top: -1px;
490     margin-bottom: -1px;
491     overflow: hidden;
492     }
493    
494     #mContainer {
495 dpavlin 128 display: block;
496 ravilov 140 position: relative;
497     padding: 0px;
498     margin-top: 0.4em;
499     margin-bottom: 0.5em;
500     }
501    
502     #gradient {
503     z-index: 1;
504     background-color: #FFFF00;
505     }
506    
507     #mask {
508     z-index: 2;
509 dpavlin 128 background-color: #FFFFFF;
510     }
511    
512     #progressIndicator {
513 ravilov 140 z-index: 3;
514     background-color: transparent;
515 dpavlin 128 }
516 dpavlin 197
517     #parts {
518     padding: 0.4em;
519     display: none;
520     width: 100%;
521     font-size: 80%;
522     color: #ff0000;
523     text-align: center;
524     }
525 dpavlin 127 -->
526     </style>
527 ravilov 140 <script type="text/javascript">
528 dpavlin 4 <!--
529    
530 dpavlin 126 var debug_div = null;
531 dpavlin 149 EOF3
532 dpavlin 126
533 dpavlin 149 # take maximum archive size from configuration
534     $retHTML .= 'var media_size = '. $Conf{MaxArchiveSize} .';';
535    
536     $retHTML .= <<'EOF3';
537    
538 dpavlin 126 function debug(msg) {
539 dpavlin 197 return; // Disable debugging
540 dpavlin 126
541     if (! debug_div) debug_div = document.getElementById('debug');
542    
543     // this will create debug div if it doesn't exist.
544     if (! debug_div) {
545     debug_div = document.createElement('div');
546     if (document.body) document.body.appendChild(debug_div);
547     else debug_div = null;
548     }
549     if (debug_div) {
550     debug_div.appendChild(document.createTextNode(msg));
551     debug_div.appendChild(document.createElement("br"));
552     }
553     }
554    
555    
556     var element_id_cache = Array();
557    
558     function element_id(name,element) {
559     if (! element_id_cache[name]) {
560     element_id_cache[name] = self.document.getElementById(name);
561     }
562     return element_id_cache[name];
563     }
564    
565     function checkAll(location) {
566 ravilov 142 var f = element_id('forma') || null;
567     if (!f) return false;
568    
569     var len = f.elements.length;
570 dpavlin 126 var check_all = element_id('allFiles');
571 ravilov 142 var suma = check_all.checked ? (parseInt(f.elements['totalsize'].value) || 0) : 0;
572 dpavlin 126
573     for (var i = 0; i < len; i++) {
574 ravilov 142 var e = f.elements[i];
575     if (e.name != 'all' && e.name.substr(0, 3) == 'fcb') {
576 dpavlin 126 if (check_all.checked) {
577 ravilov 142 if (e.checked) continue;
578 dpavlin 129 var el = element_id("fss" + e.name.substr(3));
579     var size = parseInt(el.value) || 0;
580     debug('suma: '+suma+' size: '+size);
581     if ((suma + size) < media_size) {
582     suma += size;
583     e.checked = true;
584     } else {
585     break;
586     }
587 dpavlin 126 } else {
588     e.checked = false;
589     }
590     }
591     }
592 dpavlin 129 update_sum(suma);
593     }
594 dpavlin 126
595 dpavlin 197 function update_sum(suma, suma_disp) {
596     if (! suma_disp) suma_disp = suma;
597     element_id('forma').elements['totalsize'].value = suma_disp;
598 dpavlin 129 pbar_set(suma, media_size);
599 ravilov 141 debug('total size: ' + suma);
600 dpavlin 126 }
601 dpavlin 129
602 dpavlin 126 function sumiraj(e) {
603 ravilov 141 var suma = parseInt(element_id('forma').elements['totalsize'].value) || 0;
604 dpavlin 126 var len = element_id('forma').elements.length;
605     if (e) {
606 ravilov 140 var size = parseInt( element_id("fss" + e.name.substr(3)).value);
607 dpavlin 126 if (e.checked) {
608     suma += size;
609     } else {
610     suma -= size;
611     }
612 dpavlin 197
613     var parts = parseInt( element_id("prt" + e.name.substr(3)).value);
614     if (suma > media_size && suma == size && parts > 1) {
615     element_id("parts").innerHTML = "This will take "+parts+" mediums!";
616     element_id("parts").style.display = 'block';
617     update_sum(media_size, suma);
618     suma = media_size;
619     return suma;
620     } else {
621     element_id("parts").style.display = 'none';
622     }
623    
624     if (suma < 0) suma = 0;
625 dpavlin 126 } else {
626     suma = 0;
627     for (var i = 0; i < len; i++) {
628     var e = element_id('forma').elements[i];
629 dpavlin 127 if (e.name != 'all' && e.checked && e.name.substr(0,3) == 'fcb') {
630 dpavlin 126 var el = element_id("fss" + e.name.substr(3));
631     if (el && el.value) suma += parseInt(el.value) || 0;
632     }
633     }
634     }
635 dpavlin 129 update_sum(suma);
636 iklaric 121 return suma;
637 dpavlin 126 }
638    
639 dpavlin 128 /* progress bar */
640    
641 ravilov 140 var _pbar_width = null;
642 dpavlin 128 var _pbar_warn = 10; // change color in last 10%
643    
644     function pbar_reset() {
645     element_id("mask").style.left = "0px";
646     _pbar_width = element_id("mContainer").offsetWidth - 2;
647     element_id("mask").style.width = _pbar_width + "px";
648 ravilov 140 element_id("mask").style.display = "block";
649 dpavlin 128 element_id("progressIndicator").style.zIndex = 10;
650     element_id("progressIndicator").innerHTML = "0";
651     }
652    
653     function dec2hex(d) {
654 ravilov 140 var hch = '0123456789ABCDEF';
655     var a = d % 16;
656     var q = (d - a) / 16;
657     return hch.charAt(q) + hch.charAt(a);
658 dpavlin 128 }
659    
660     function pbar_set(amount, max) {
661 ravilov 140 debug('pbar_set('+amount+', '+max+')');
662 dpavlin 128
663 ravilov 140 if (_pbar_width == null) {
664     var _mc = element_id("mContainer");
665     if (_pbar_width == null) _pbar_width = parseInt(_mc.offsetWidth ? (_mc.offsetWidth - 2) : 0) || null;
666     if (_pbar_width == null) _pbar_width = parseInt(_mc.clientWidth ? (_mc.clientWidth + 2) : 0) || null;
667     if (_pbar_width == null) _pbar_width = 0;
668     }
669 dpavlin 128
670 ravilov 140 var pcnt = Math.floor(amount * 100 / max);
671 dpavlin 128 var p90 = 100 - _pbar_warn;
672     var pcol = pcnt - p90;
673 ravilov 140 if (Math.round(pcnt) <= 100) {
674 dpavlin 128 if (pcol < 0) pcol = 0;
675     var e = element_id("submitBurner");
676 ravilov 140 debug('enable_button');
677     e.disabled = false;
678     var a = e.getAttributeNode('disabled') || null;
679     if (a) e.removeAttributeNode(a);
680     } else {
681 dpavlin 128 debug('disable button');
682     pcol = _pbar_warn;
683     var e = element_id("submitBurner");
684 ravilov 140 if (!e.disabled) e.disabled = true;
685 dpavlin 128 }
686 ravilov 140 var col_g = Math.floor((_pbar_warn - pcol) * 255 / _pbar_warn);
687     var col = '#FF' + dec2hex(col_g) + '00';
688 dpavlin 128
689     //debug('pcol: '+pcol+' g:'+col_g+' _pbar_warn:'+ _pbar_warn + ' color: '+col);
690     element_id("gradient").style.backgroundColor = col;
691    
692     element_id("progressIndicator").innerHTML = pcnt + '%';
693     //element_id("progressIndicator").innerHTML = amount;
694    
695 ravilov 140 element_id("mask").style.clip = 'rect(' + Array(
696     '0px',
697     element_id("mask").offsetWidth + 'px',
698     element_id("mask").offsetHeight + 'px',
699     Math.round(_pbar_width * amount / max) + 'px'
700     ).join(' ') + ')';
701 dpavlin 128 }
702    
703 dpavlin 126 if (!self.body) self.body = new Object();
704     self.onload = self.document.onload = self.body.onload = function() {
705 ravilov 140 //pbar_reset();
706 dpavlin 126 sumiraj();
707 ravilov 140 };
708 dpavlin 126
709 ravilov 140 // -->
710 dpavlin 126 </script>
711 dpavlin 127 <div id="fixedBox">
712    
713 ravilov 140 Size: <input type="text" name="totalsize" size="7" readonly="readonly" style="text-align:right;" value="0" /> kB
714 dpavlin 128
715     <div id="mContainer">
716 ravilov 140 <div id="gradient">&nbsp;</div>
717     <div id="mask">&nbsp;</div>
718     <div id="progressIndicator">0%</div>
719 dpavlin 128 </div>
720 ravilov 140 <br/>
721 dpavlin 128
722 dpavlin 197 <div id="parts">&nbsp;</div>
723    
724 dpavlin 126 Note:
725 ravilov 140 <textarea name="note" cols="10" rows="5" id="note"></textarea>
726 dpavlin 127
727 ravilov 140 <input type="submit" id="submitBurner" value="Burn selected" name="submitBurner" />
728    
729 dpavlin 126 </div>
730 ravilov 140 <!--
731 dpavlin 127 <div id="debug" style="float: right; width: 10em; border: 1px #ff0000 solid; background-color: #ffe0e0; -moz-opacity: 0.7;">
732     no debug output yet
733     </div>
734 ravilov 140 -->
735 dpavlin 4 EOF3
736 dpavlin 102 $retHTML .= q{
737 iklaric 121 <input type="hidden" value="burn" name="action">
738     <input type="hidden" value="results" name="search_results">
739     <table style="fview" border="0" cellspacing="0" cellpadding="2">
740     <tr class="tableheader">
741     <td class="tableheader">
742 dpavlin 126 <input type="checkbox" name="allFiles" id="allFiles" onClick="checkAll('allFiles');">
743 iklaric 121 </td>
744     <td align="center">Share</td>
745     <td align="center">Backup no</td>
746     <td align="center">Type</td>
747     <td align="center">date</td>
748     <td align="center">age/days</td>
749     <td align="center">size/MB</td>
750 dpavlin 161 <td align="center">gzip size/kB</td>
751 iklaric 121 </tr>
752 dpavlin 102
753 dpavlin 58 };
754 dpavlin 4
755 dpavlin 102 my @color = (' bgcolor="#e0e0e0"', '');
756 dpavlin 31
757 dpavlin 102 my $i = 0;
758     my $host = '';
759 dpavlin 31
760 dpavlin 102 foreach my $backup ( getBackupsNotBurned() ) {
761 dpavlin 31
762 dpavlin 102 if ($host ne $backup->{'host'}) {
763     $i++;
764     $host = $backup->{'host'};
765     }
766 dpavlin 31 my $ftype = "";
767 dpavlin 125
768 dpavlin 145 my $checkbox_key = $backup->{'hostid'}. '_' .$backup->{'backupnum'} . '_' . $backup->{'id'};
769    
770 dpavlin 102 $retHTML .=
771 dpavlin 125 '<tr' . $color[$i %2 ] . '>
772     <td class="fview">';
773 dpavlin 145
774 dpavlin 161 if (($backup->{'inc_size'} || 0) > 0) {
775 dpavlin 125 $retHTML .= '
776 dpavlin 145 <input type="checkbox" name="fcb' . $checkbox_key . '" value="' . $checkbox_key . '" onClick="sumiraj(this);">';
777 dpavlin 125 }
778 dpavlin 145
779 dpavlin 125 $retHTML .=
780     '</td>' .
781 dpavlin 102 '<td align="right">' . $backup->{'host'} . ':' . $backup->{'share'} . '</td>' .
782     '<td align="center">' . $backup->{'backupnum'} . '</td>' .
783     '<td align="center">' . $backup->{'type'} . '</td>' .
784     '<td align="center">' . epoch_to_iso( $backup->{'date'} ) . '</td>' .
785     '<td align="center">' . $backup->{'age'} . '</td>' .
786     '<td align="right">' . $backup->{'size'} . '</td>' .
787 dpavlin 161 '<td align="right">' . $backup->{'inc_size'} .
788 dpavlin 197 '<input type="hidden" id="fss'.$checkbox_key .'" value="'. $backup->{'inc_size'} .'"></td>' .
789     '<input type="hidden" id="prt'.$checkbox_key .'" value="'. $backup->{'parts'} .'"></td>' .
790 dpavlin 125
791 dpavlin 102 "</tr>\n";
792 dpavlin 4 }
793 dpavlin 31
794     $retHTML .= "</table>";
795 dpavlin 102 $retHTML .= "</form>";
796 dpavlin 4
797 dpavlin 31 return $retHTML;
798     }
799 dpavlin 4
800 dpavlin 86 sub displayGrid($) {
801     my ($param) = @_;
802 dpavlin 83
803     my $offset = $param->{'offset'};
804     my $hilite = $param->{'search_filename'};
805    
806 dpavlin 17 my $retHTML = "";
807    
808 dpavlin 55 my $start_t = time();
809    
810 dpavlin 86 my ($results, $files);
811 dpavlin 88 if ($param->{'use_hest'} && length($hilite) > 0) {
812 dpavlin 87 ($results, $files) = getFilesHyperEstraier($param);
813 dpavlin 86 } else {
814 dpavlin 87 ($results, $files) = getFiles($param);
815 dpavlin 86 }
816 dpavlin 31
817 dpavlin 55 my $dur_t = time() - $start_t;
818     my $dur = sprintf("%0.4fs", $dur_t);
819    
820 dpavlin 31 my ($from, $to) = (($offset * $on_page) + 1, ($offset * $on_page) + $on_page);
821    
822 dpavlin 59 if ($results <= 0) {
823     $retHTML .= qq{
824     <p style="color: red;">No results found...</p>
825     };
826     return $retHTML;
827     } else {
828     # DEBUG
829     #use Data::Dumper;
830     #$retHTML .= '<pre>' . Dumper($files) . '</pre>';
831     }
832    
833    
834 dpavlin 17 $retHTML .= qq{
835 dpavlin 79 <div>
836     Found <b>$results files</b> showing <b>$from - $to</b> (took $dur)
837     </div>
838     <table style="fview" width="100%" border="0" cellpadding="2" cellspacing="0">
839     <tr class="fviewheader">
840 dpavlin 87 <td></td>
841 dpavlin 79 <td align="center">Share</td>
842     <td align="center">Type and Name</td>
843     <td align="center">#</td>
844     <td align="center">Size</td>
845     <td align="center">Date</td>
846     <td align="center">Media</td>
847 dpavlin 17 </tr>
848     };
849 dpavlin 31
850 dpavlin 17 my $file;
851 dpavlin 4
852 dpavlin 17 sub hilite_html($$) {
853     my ($html, $search) = @_;
854     $html =~ s#($search)#<b>$1</b>#gis;
855     return $html;
856 dpavlin 4 }
857 dpavlin 9
858 dpavlin 26 sub restore_link($$$$$$) {
859     my $type = shift;
860     my $action = 'RestoreFile';
861     $action = 'browse' if (lc($type) eq 'dir');
862     return sprintf(qq{<a href="?action=%s&host=%s&num=%d&share=%s&dir=%s">%s</a>}, $action, @_);
863     }
864    
865 dpavlin 87 my $i = $offset * $on_page;
866    
867 dpavlin 31 foreach $file (@{ $files }) {
868 dpavlin 87 $i++;
869    
870 dpavlin 24 my $typeStr = BackupPC::Attrib::fileType2Text(undef, $file->{'type'});
871 dpavlin 79 $retHTML .= qq{<tr class="fviewborder">};
872 dpavlin 9
873 dpavlin 88 $retHTML .= qq{<td class="fviewborder">$i</td>};
874 dpavlin 87
875 dpavlin 79 $retHTML .=
876 dpavlin 86 qq{<td class="fviewborder" align="right">} . $file->{'hname'} . ':' . $file->{'sname'} . qq{</td>} .
877     qq{<td class="fviewborder"><img src="$Conf{CgiImageDirURL}/icon-$typeStr.gif" alt="$typeStr" align="middle">&nbsp;} . hilite_html( $file->{'filepath'}, $hilite ) . qq{</td>} .
878     qq{<td class="fviewborder" align="center">} . restore_link( $typeStr, ${EscURI( $file->{'hname'} )}, $file->{'backupnum'}, ${EscURI( $file->{'sname'})}, ${EscURI( $file->{'filepath'} )}, $file->{'backupnum'} ) . qq{</td>} .
879 dpavlin 79 qq{<td class="fviewborder" align="right">} . $file->{'size'} . qq{</td>} .
880     qq{<td class="fviewborder">} . epoch_to_iso( $file->{'date'} ) . qq{</td>} .
881 dpavlin 87 qq{<td class="fviewborder">} . '?' . qq{</td>};
882 dpavlin 9
883 dpavlin 17 $retHTML .= "</tr>";
884     }
885     $retHTML .= "</table>";
886    
887 dpavlin 31 # all variables which has to be transfered
888     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/) {
889     $retHTML .= qq{<INPUT TYPE="hidden" NAME="$n" VALUE="$In{$n}">\n};
890     }
891 dpavlin 17
892 dpavlin 31 my $del = '';
893     my $max_page = int( $results / $on_page );
894     my $page = 0;
895    
896 dpavlin 85 sub page_link($$$) {
897     my ($param,$page,$display) = @_;
898 dpavlin 31
899 dpavlin 85 $param->{'offset'} = $page;
900    
901     my $html = '<a href = "' . $MyURL;
902     my $del = '?';
903     foreach my $k (keys %{ $param }) {
904     if ($param->{$k}) {
905     $html .= $del . $k . '=' . ${EscURI( $param->{$k} )};
906     $del = '&';
907     }
908     }
909     $html .= '">' . $display . '</a>';
910     }
911    
912 dpavlin 31 $retHTML .= '<div style="text-align: center;">';
913    
914     if ($offset > 0) {
915 dpavlin 85 $retHTML .= page_link($param, $offset - 1, '&lt;&lt;') . ' ';
916 dpavlin 31 }
917    
918     while ($page <= $max_page) {
919     if ($page == $offset) {
920     $retHTML .= $del . '<b>' . ($page + 1) . '</b>';
921     } else {
922 dpavlin 85 $retHTML .= $del . page_link($param, $page, $page + 1);
923 dpavlin 17 }
924 dpavlin 31
925     if ($page < $offset - $pager_pages && $page != 0) {
926     $retHTML .= " ... ";
927     $page = $offset - $pager_pages;
928     $del = '';
929     } elsif ($page > $offset + $pager_pages && $page != $max_page) {
930     $retHTML .= " ... ";
931     $page = $max_page;
932     $del = '';
933     } else {
934     $del = ' | ';
935     $page++;
936     }
937 dpavlin 17 }
938    
939 dpavlin 31 if ($offset < $max_page) {
940 dpavlin 85 $retHTML .= ' ' . page_link($param, $offset + 1, '&gt;&gt;');
941 dpavlin 31 }
942    
943     $retHTML .= "</div>";
944    
945 dpavlin 17 return $retHTML;
946     }
947 dpavlin 4
948     1;

  ViewVC Help
Powered by ViewVC 1.1.26