/[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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 9 by dpavlin, Thu Jun 23 12:36:22 2005 UTC revision 197 by dpavlin, Thu Oct 13 18:33:00 2005 UTC
# Line 4  package BackupPC::SearchLib; Line 4  package BackupPC::SearchLib;
4  use strict;  use strict;
5  use BackupPC::CGI::Lib qw(:all);  use BackupPC::CGI::Lib qw(:all);
6  use BackupPC::Attrib qw(:all);  use BackupPC::Attrib qw(:all);
 use Data::Dumper;  
7  use DBI;  use DBI;
8    use DateTime;
9    use vars qw(%In $MyURL);
10    use Time::HiRes qw/time/;
11    use XML::Writer;
12    use IO::File;
13    
14    my $on_page = 100;
15    my $pager_pages = 10;
16    
17    my $dsn = $Conf{SearchDSN};
18    my $db_user = $Conf{SearchUser} || '';
19    
20    my $hest_index_path = $Conf{HyperEstraierIndex};
21    
22    my $dbh;
23    
24    sub get_dbh {
25            $dbh ||= DBI->connect($dsn, $db_user, "", { RaiseError => 1, AutoCommit => 1 } );
26            return $dbh;
27    }
28    
29  sub getUnits() {  sub getUnits() {
30      my @ret = ();          my @ret;
31      my $tmp;  
32      my $dbh = DBI->connect( "dbi:SQLite:dbname=${TopDir}/$Conf{SearchDB}",          my $dbh = get_dbh();
33          "", "", { RaiseError => 1, AutoCommit => 1 } );          my $sth = $dbh->prepare(qq{
34      my $st =                  SELECT
35        $dbh->prepare(                          shares.id       as id,
36          " SELECT shares.ID AS ID, shares.share AS name FROM shares;");                          hosts.name || ':' || shares.name as share
37      $st->execute();                  FROM shares
38      push (@ret, { 'ID' => '', 'name' => '-'});                  JOIN hosts on hostid = hosts.id
39      while ( $tmp = $st->fetchrow_hashref() ) {                  ORDER BY share
40          push( @ret, { 'ID' => $tmp->{'ID'}, 'name' => $tmp->{'name'} } );          } );
41      }          $sth->execute();
42      $dbh->disconnect();          push @ret, { 'id' => '', 'share' => '-'};       # dummy any
43      return @ret;  
44            while ( my $row = $sth->fetchrow_hashref() ) {
45                    push @ret, $row;
46            }
47            return @ret;
48    }
49    
50    sub epoch_to_iso {
51            my $t = shift || return;
52            my $iso = BackupPC::Lib::timeStamp(undef, $t);
53            $iso =~ s/\s/ /g;
54            return $iso;
55    }
56    
57    sub dates_from_form($) {
58            my $param = shift || return;
59    
60            sub mk_epoch_date($$) {
61                    my ($name,$suffix) = @_;
62    
63                    my $yyyy = $param->{ $name . '_year_' . $suffix} || return undef;
64                    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    
69                    $yyyy =~ s/\D//g;
70                    $mm =~ s/\D//g;
71                    $dd =~ s/\D//g;
72    
73                    my $h = my $m = my $s = 0;
74                    if ($suffix eq 'to') {
75                            $h = 23;
76                            $m = 59;
77                            $s = 59;
78                    }
79    
80                    my $dt = new DateTime(
81                            year => $yyyy,
82                            month => $mm,
83                            day => $dd,
84                            hour => $h,
85                            minute => $m,
86                            second => $s,
87                    );
88                    print STDERR "mk_epoch_date($name,$suffix) [$yyyy-$mm-$dd] = " . $dt->ymd . " " . $dt->hms . "\n";
89                    return $dt->epoch || 'NULL';
90            }
91    
92            my @ret = (
93                    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    
99            return @ret;
100    
101  }  }
102    
103    
104  sub getWhere($) {  sub getWhere($) {
105      my ($param)    = @_;          my $param = shift || return;
106      my $retSQL     = "";  
107      my @conditions = ();          my ($backup_from, $backup_to, $files_from, $files_to) = dates_from_form($param);
108      my $cond;  
109            my @conditions;
110                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      if ( defined( $param->{'search_backup_day_from'} ) && $param->{'search_backup_day_from'} ne "") {          push @conditions, qq{ files.date <= $files_to } if ($files_to);
114          push( @conditions,  
115              ' strftime("%d", datetime(backups.date, "unixepoch","localtime")) >= "'          print STDERR "backup: $backup_from - $backup_to files: $files_from - $files_to cond:" . join(" and ",@conditions);
116                . $param->{'search_backup_day_from'} ."\"");  
117      }          push( @conditions, ' files.shareid = ' . $param->{'search_share'} ) if ($param->{'search_share'});
118      if ( defined( $param->{'search_backup_day_to'} ) && $param->{'search_backup_day_to'} ne "") {          push (@conditions, " upper(files.path) LIKE upper('%".$param->{'search_filename'}."%')") if ($param->{'search_filename'});
119          push( @conditions,  
120              ' strftime("%d", datetime(backups.date, "unixepoch","localtime")) <= "'          return join(" and ", @conditions);
121                . $param->{'search_backup_day_from'}  ."\"");  }
122      }  
123      if ( defined( $param->{'search_backup_month_from'} ) && $param->{'search_backup_month_from'} ne "") {  
124          push( @conditions,  sub getFiles($) {
125              ' strftime("%m", datetime(backups.date, "unixepoch","localtime")) >= "'          my ($param) = @_;
126                . $param->{'search_backup_month_from'}  ."\"");  
127      }          my $offset = $param->{'offset'} || 0;
128      if ( defined( $param->{'search_backup_month_to'} ) && $param->{'search_backup_month_to'} ne "") {          $offset *= $on_page;
129          push( @conditions,  
130              ' strftime("%m", datetime(backups.date, "unixepoch","localtime")) <= "'          my $dbh = get_dbh();
131                . $param->{'search_backup_month_to'}  ."\"");  
132      }          my $sql_cols = qq{
133      if ( defined( $param->{'search_backup_year_from'} ) && $param->{'search_backup_year_from'} ne "") {                  files.id                        AS fid,
134          push( @conditions,                  hosts.name                      AS hname,
135              ' strftime("%Y", datetime(backups.date, "unixepoch","localtime")) >= "'                  shares.name                     AS sname,
136                . $param->{'search_backup_year_from'}  ."\"");                  files.backupnum                 AS backupnum,
137      }                  files.path                      AS filepath,
138      if ( defined( $param->{'search_backup_year_to'} ) && $param->{'search_backup_year_to'} ne "") {                  files.date                      AS date,
139          push( @conditions,                  files.type                      AS type,
140              ' strftime("%Y", datetime(backups.date, "unixepoch","localtime")) <= "'                  files.size                      AS size
               . $param->{'search_backup_year_to'}  ."\"");  
     }  
   
     if ( defined( $param->{'search_day_from'} )   && $param->{'search_day_from'} ne "" ) {  
         push( @conditions,  
             ' strftime("%d", datetime(files.date, "unixepoch","localtime")) >= "'  
               . $param->{'search_day_from'}  ."\"");  
     }  
     if ( defined( $param->{'search_month_from'} ) && $param->{'search_month_from'} ne "") {  
         push( @conditions,  
             ' strftime("%m", datetime(files.date, "unixepoch","localtime")) >= "'  
               . $param->{'search_month_from'}  ."\"");  
     }  
     if ( defined( $param->{'search_year_from'} ) && $param->{'search_year_from'} ne "") {  
         push( @conditions,  
             ' strftime("%Y", datetime(files.date, "unixepoch","localtime")) >= "'  
               . $param->{'search_year_from'}  ."\"");  
     }  
     if ( defined( $param->{'search_day_to'} )   && $param->{'search_day_to'} ne "" ) {  
         push( @conditions,  
             ' strftime("%d", datetime(files.date, "unixepoch","localtime")) <= "'  
               . $param->{'search_day_to'}  ."\"");  
     }  
     if ( defined( $param->{'search_month_to'} ) && $param->{'search_month_to'} ne "" ) {  
         push( @conditions,  
             ' strftime("%m", datetime(files.date, "unixepoch","localtime")) <= "'  
               . $param->{'search_month_to'} ."\"" );  
     }  
     if ( defined( $param->{'search_year_to'} )&& $param->{'search_year_to'} ne "" )  {  
         push( @conditions,  
             ' strftime("%Y", datetime(files.date, "unixepoch","localtime")) <= "'  
               . $param->{'search_year_to'} ."\"");  
     }  
   
     if ( defined( $param->{'search_host'} ) && $param->{'search_host'} ne "") {  
       push( @conditions, ' backups.hostID = ' . $param->{'search_host'} );  
     }  
   
     if ( defined ($param->{'search_filename'}) && $param->{'search_filename'} ne "") {  
         push (@conditions, " files.name LIKE '".$param->{'search_filename'}."%'");  
         }  
       
     $retSQL = "";  
     foreach $cond(@conditions)  
       {  
           if ($retSQL ne "")  
             {  
                 $retSQL .= " AND ";  
             }  
           $retSQL .= $cond;  
       }        
   
       
     return $retSQL;  
 }  
   
 sub getFiles($$)  
   {  
       my ($where, $offset) = @_;  
         
         
       my $dbh = DBI->connect( "dbi:SQLite:dbname=${TopDir}/$Conf{SearchDB}",  
         "", "", { RaiseError => 1, AutoCommit => 1 } );  
       my $sql =            
         q{    
               SELECT files.id                       AS fid,  
                      hosts.name                     AS hname,  
                      shares.name                    AS sname,  
                      shares.share                   AS sharename,  
                      backups.num                    AS backupNum,  
                      files.name                     AS filename,  
                      files.path                     AS filepath,  
                      shares.share||files.fullpath AS networkPath,  
                      date(files.date, 'unixepoch', 'localtime') AS date,  
                      files.type                     AS filetype,  
                      files.size                     AS size,  
                      dvds.name                      AS dvd  
                   FROM  
                      files  
                         INNER JOIN shares  ON files.shareID=shares.ID  
                         INNER JOIN hosts   ON hosts.ID = shares.hostID  
                         INNER JOIN backups ON backups.hostID = hosts.ID  
                         LEFT  JOIN dvds    ON dvds.ID = files.dvdid  
               
           };  
   
       if (defined($where) && $where ne "")  
         {  
             $sql .= " WHERE ". $where;        
         }  
   
       $sql .=  
         q{            
             ORDER BY files.id  
               LIMIT 100  
               OFFSET ? * 100 + 1  
141          };          };
142          
143                  my $sql_from = qq{
144                          FROM files
145        my $st = $dbh->prepare(                          INNER JOIN shares       ON files.shareID=shares.ID
146            $sql                          INNER JOIN hosts        ON hosts.ID = shares.hostID
147            );                              INNER JOIN backups      ON backups.num = files.backupnum and backups.hostID = hosts.ID AND backups.shareID = files.shareID
148        if (!defined($offset) && $offset ne "")          };
149        {  
150          $st->bind_param(1, $offset);          my $sql_where;
151        }          my $where = getWhere($param);
152        else          $sql_where = " WHERE ". $where if ($where);
153        {  
154          $st->bind_param(1,0);          my $sql_order = qq{
155        }                  ORDER BY files.date
156        $st->execute;                  LIMIT $on_page
157                          OFFSET ?
158        my @ret = ();          };
159        my $tmp;  
160                  my $sql_count = qq{ select count(files.id) $sql_from $sql_where };
161        while ($tmp = $st->fetchrow_hashref())          my $sql_results = qq{ select $sql_cols $sql_from $sql_where $sql_order };
162          {  
163              push(@ret, {          my $sth = $dbh->prepare($sql_count);
164                             'hname'       => $tmp->{'hname'},          $sth->execute();
165                             'sname'       => $tmp->{'sname'},          my ($results) = $sth->fetchrow_array();
166                             'sharename'   => $tmp->{'sharename'},  
167                             'backupno'    => $tmp->{'backupNum'},          $sth = $dbh->prepare($sql_results);
168                             'fname'       => $tmp->{'filename'},          $sth->execute( $offset );
169                             'fpath'       => $tmp->{'filepath'},  
170                             'networkpath' => $tmp->{'networkPath'},          if ($sth->rows != $results) {
171                             'date'        => $tmp->{'date'},                  my $bug = "$0 BUG: [[ $sql_count ]] = $results while [[ $sql_results ]] = " . $sth->rows;
172                             'type'        => $tmp->{'filetype'},                  $bug =~ s/\s+/ /gs;
173                             'size'        => $tmp->{'size'},                  print STDERR "$bug\n";
                            'id'          => $tmp->{'fid'},  
                            'dvd'         => $tmp->{'dvd'}  
                        }  
             );  
                                   
174          }          }
175    
176            my @ret;
177                
178        $st->finish();          while (my $row = $sth->fetchrow_hashref()) {
179        $dbh->disconnect();                  push @ret, $row;
       return @ret;  
   }  
   
 sub getBackupsNotBurned()  
   {  
       my $dbh = DBI->connect( "dbi:SQLite:dbname=${TopDir}/$Conf{SearchDB}",  
         "", "", { RaiseError => 1, AutoCommit => 1 } );        
       my $sql = q{  
           SELECT  
             hosts.ID         AS hostID,  
             hosts.name       AS host,  
             backups.num      AS backupno,  
             backups.type     AS type,  
             backups.date     AS date  
           FROM backups, shares, files, hosts  
           WHERE  
             backups.num    = files.backupNum  AND  
             shares.ID      = files.shareID    AND            
             backups.hostID = shares.hostID    AND  
             hosts.ID       = backups.hostID   AND  
             files.dvdid    IS NULL  
           GROUP BY  
             backups.hostID, backups.num  
       };  
       my $st = $dbh -> prepare( $sql );  
       my @ret = ();  
       $st -> execute();  
   
       while ( my $tmp = $st -> fetchrow_hashref() )  
         {            
             push(@ret, {  
                          'host'     => $tmp->{'host'},  
                          'hostid'   => $tmp->{'hostID'},  
                          'backupno' => $tmp->{'backupno'},  
                          'type'     => $tmp->{'type'},  
                          'date'     => $tmp->{'date'}  
                        }  
             );  
180          }          }
181              
182        return @ret;                $sth->finish();
183    }          return ($results, \@ret);
184    }
185    
186    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    sub getFilesHyperEstraier($) {
204            my ($param) = @_;
205    
206            my $offset = $param->{'offset'} || 0;
207            $offset *= $on_page;
208    
209  sub displayBackupsGrid()          die "no index_path?" unless ($hest_index_path);
210    {  
211        my $retHTML = "";          use HyperEstraier;
212        my $addForm = 1;  
213            my ($index_path, $index_node_url) = getHyperEstraier_url($hest_index_path);
214    
215            # open the database
216            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    
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            if (length($q) > 0) {
234                    # exact match
235                    $cond->add_attr("filepath ISTRINC $q");
236    
237                    $q =~ s/(.)/$1 /g;
238                    # set the search phrase to the search condition object
239                    $cond->set_phrase($q);
240            }
241    
242            my ($backup_from, $backup_to, $files_from, $files_to) = dates_from_form($param);
243    
244            $cond->add_attr("backup_date NUMGE $backup_from") if ($backup_from);
245            $cond->add_attr("backup_date NUMLE $backup_to") if ($backup_to);
246    
247            $cond->add_attr("date NUMGE $files_from") if ($files_from);
248            $cond->add_attr("date NUMLE $files_to") if ($files_to);
249    
250            $cond->add_attr("shareid NUMEQ $shareid") if ($shareid);
251    
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            my ($result, $hits);
259    
260            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            # for each document in result
271            for my $i ($offset .. ($offset + $on_page - 1)) {
272                    last if ($i >= $hits);
273    
274                    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    
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    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    
304            $ret =~ s/__+/_/g;
305    
306            return $ret;
307            
308    }
309    
310    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    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                                              backups.num=?
347                            };
348            my $sth = $dbh->prepare($sql);
349            $sth->execute($hostID, $backupNum);
350    
351            my $row = $sth->fetchrow_hashref();
352    
353            return get_tgz_size_by_name(
354                    getGzipName($row->{'host'}, $row->{share}, $row->{'backupnum'})
355            );
356    }
357    
358    sub getBackupsNotBurned() {
359    
360            my $dbh = get_dbh();
361    
362            my $sql = q{
363                    SELECT
364                            backups.hostID AS hostID,
365                            hosts.name AS host,
366                            shares.name AS share,
367                            backups.num AS backupnum,
368                            backups.type AS type,
369                            backups.date AS date,
370                            backups.size AS size,
371                            backups.id AS id,
372                            backups.inc_size AS inc_size,
373                            backups.parts AS parts
374                    FROM backups
375                    INNER JOIN shares       ON backups.shareID=shares.ID
376                    INNER JOIN hosts        ON backups.hostID = hosts.ID
377                    LEFT OUTER JOIN archive_backup ON archive_backup.backup_id = backups.id
378                    WHERE backups.inc_size > 0 AND backups.inc_deleted is false AND archive_backup.backup_id IS NULL
379                    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                            backups.size,
389                            backups.inc_size,
390                            backups.parts
391                    ORDER BY backups.date
392            };
393            my $sth = $dbh->prepare( $sql );
394            my @ret;
395            $sth->execute();
396    
397            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    
401                    # do some cluster calculation (approximate) and convert to kB
402                    $row->{'inc_size'} = int(($row->{'inc_size'} + 1023 ) / ( 2 * 1024 ) * 2);
403                    push @ret, $row;
404            }
405                
406        if ($addForm)          return @ret;      
407          {  }
408    
409              $retHTML .= <<EOF3;  sub displayBackupsGrid() {
410  <script language="javascript" type="text/javascript">  
411            my $retHTML .= q{
412                    <form id="forma" method="POST" action="}.$MyURL.q{?action=burn">
413            };
414    
415            $retHTML .= <<'EOF3';
416    <style type="text/css">
417  <!--  <!--
418    DIV#fixedBox {
419            position: absolute;
420            top: 50em;
421            left: -24%;
422            padding: 0.5em;
423            width: 20%;
424            background-color: #E0F0E0;
425            border: 1px solid #00C000;
426    }
427    
428    DIV#fixedBox, DIV#fixedBox INPUT, DIV#fixedBox TEXTAREA {
429            font-size: 10pt;
430    }
431    
432    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            width: 100%;
447    }
448    
449    DIV#fixedBox #submitBurner {
450            display: block;
451            width: 100%;
452            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            height: 100%;
463            font-size: 100%;
464    }
465    
466    * HTML DIV#fixedBox {
467            position: absolute;
468    }
469    
470      function checkAll(location)  #mContainer, #gradient, #mask, #progressIndicator {
471      {          display: block;
472        for (var i=0;i<document.forma.elements.length;i++)          width: 100%;
473        {          font-size: 10pt;
474          var e = document.forma.elements[i];          font-weight: bold;
475          if ((e.checked || !e.checked) && e.name != \'all\') {          text-align: center;
476              if (eval("document.forma."+location+".checked")) {          vertical-align: middle;
477                  e.checked = true;          padding: 1px;
478              } else {  }
479                  e.checked = false;  
480              }  #gradient, #mask, #progressIndicator {
481          }          left: 0;
482        }          border-width: 1px;
483      }          border-style: solid;
484  //-->          border-color: #000000;
485  </script>                color: #404040;
486            margin: 0.4em;
487            position: absolute;
488            margin-left: -1px;
489            margin-top: -1px;
490            margin-bottom: -1px;
491            overflow: hidden;
492    }
493    
494    #mContainer {
495            display: block;
496            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            background-color: #FFFFFF;
510    }
511    
512    #progressIndicator {
513            z-index: 3;
514            background-color: transparent;
515    }
516    
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    -->
526    </style>
527    <script type="text/javascript">
528    <!--
529    
530    var debug_div = null;
531  EOF3  EOF3
532                $retHTML .= q{<form name="forma" method="POST" action="}."$MyURL"."?action=burn\"";  
533                $retHTML.= q{<input type="hidden" value="burn" name="action">};          # take maximum archive size from configuration
534                $retHTML .= q{<input type="hidden" value="results" name="search_results">};          $retHTML .= 'var media_size = '. $Conf{MaxArchiveSize} .';';
535          }  
536        $retHTML .= "<table style=\"fview\">";          $retHTML .= <<'EOF3';
537        $retHTML .= "<tr> ";  
538        if ($addForm)  function debug(msg) {
539          {          return; // Disable debugging
540              $retHTML .= "<td class=\"tableheader\"><input type=\"checkbox\" name=\"allFiles\" onClick=\"checkAll('allFiles');\"></td>";  
541          }          if (! debug_div) debug_div = document.getElementById('debug');
542        $retHTML .=  "<td class=\"tableheader\">Host</td> <td class=\"tableheader\">Backup no</td> <td class=\"tableheader\">Type</td> <td class=\"tableheader\">date</td></tr>";  
543        my @backups = getBackupsNotBurned();          // this will create debug div if it doesn't exist.
544        my $backup;          if (! debug_div) {
545                    debug_div = document.createElement('div');
546        if ($addForm)                  if (document.body) document.body.appendChild(debug_div);
547          {                  else debug_div = null;
548              $retHTML .= "<tr>";          }
549              $retHTML .= "<td colspan=7 style=\"tableheader\">";          if (debug_div) {
550              $retHTML .= "<input type=\"submit\" value=\"Burn selected backups on medium\" name=\"submitBurner\">";                  debug_div.appendChild(document.createTextNode(msg));
551              $retHTML .= "</td>";                  debug_div.appendChild(document.createElement("br"));
552              $retHTML .= "</tr>";          }
553                }
554          }  
555        foreach $backup(@backups)  
556          {  var element_id_cache = Array();
557              my $ftype = "";  
558                function element_id(name,element) {
559              $retHTML .= "<tr>";          if (! element_id_cache[name]) {
560              if ($addForm)                  element_id_cache[name] = self.document.getElementById(name);
561                {          }
562                    $retHTML .= "<td class=\"fview\"> <input type=\"checkbox\" name=\"fcb"          return element_id_cache[name];
563                      .$backup->{'hostid'}."_".$backup->{'backupno'}  }
564                    ."\" value=\"".$backup->{'hostid'}."_".$backup->{'backupno'}."\"> </td>";  
565                }      function checkAll(location) {
566                        var f = element_id('forma') || null;
567              $retHTML .= "<td class=\"fviewborder\">" . $backup->{'host'} . "</td>";          if (!f) return false;
568              $retHTML .= "<td class=\"fviewborder\">" . $backup->{'backupno'} . "</td>";  
569              $retHTML .= "<td class=\"fviewborder\">" . $backup->{'type'} . "</td>";          var len = f.elements.length;
570              $retHTML .= "<td class=\"fviewborder\">" . $backup->{'date'} . "<td>";          var check_all = element_id('allFiles');
571              $retHTML .= "</tr>";          var suma = check_all.checked ? (parseInt(f.elements['totalsize'].value) || 0) : 0;
572          }  
573        $retHTML .= "</table>";          for (var i = 0; i < len; i++) {
574        if ($addForm)                  var e = f.elements[i];
575         {                  if (e.name != 'all' && e.name.substr(0, 3) == 'fcb') {
576             $retHTML .= "</form>";                          if (check_all.checked) {
577         }                                  if (e.checked) continue;
578                                          var el = element_id("fss" + e.name.substr(3));
579        return $retHTML;                                  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  sub displayGrid($$$)                                  } else {
585    {                                          break;
586        my ($where, $addForm, $offset) = @_;                                  }
587        my $retHTML = "";                          } else {
588                                          e.checked = false;
589        if ($addForm)                          }
590          {                  }
591                $retHTML .= q{<form name="forma" method="POST" action="}."$MyURL"."?action=search\"";          }
592                $retHTML.= q{<input type="hidden" value="search" name="action">};          update_sum(suma);
593                $retHTML .= q{<input type="hidden" value="results" name="search_results">};  }
594          }  
595        $retHTML .= "<table style=\"fview\">";  function update_sum(suma, suma_disp) {
596        $retHTML .= "<tr> ";          if (! suma_disp) suma_disp = suma;
597        $retHTML .=  "<td class=\"tableheader\">Host</td> <td class=\"tableheader\">Name</td> <td class=\"tableheader\">Type</td> <td class=\"tableheader\">backup no.</td> <td class=\"tableheader\">size</td> <td class=\"tableheader\">date</td>  <td class=\"tableheader\">Media</td></tr>";          element_id('forma').elements['totalsize'].value = suma_disp;
598        my @files = getFiles($where, $offset);          pbar_set(suma, media_size);
599        my $file;          debug('total size: ' + suma);
600    }
601        foreach $file(@files)  
602          {  function sumiraj(e) {
603              my $ftype = "";          var suma = parseInt(element_id('forma').elements['totalsize'].value) || 0;
604                        var len = element_id('forma').elements.length;
605              if ($file->{'type'} == BPC_FTYPE_DIR)          if (e) {
606                {                  var size = parseInt( element_id("fss" + e.name.substr(3)).value);
607                    $ftype = "dir";                  if (e.checked) {
608                }                          suma += size;
609              else                  } else {
610                {                          suma -= size;
611                    $ftype = "file";                  }
612                }  
613              $retHTML .= "<tr>";                  var parts = parseInt( element_id("prt" + e.name.substr(3)).value);
614              $retHTML .= "<td class=\"fviewborder\">" . $file->{'hname'} ."</td>";                  if (suma > media_size && suma == size && parts > 1) {
615              $retHTML .= "<td class=\"fviewborder\">" . $file->{'fname'} . "</td>";                          element_id("parts").innerHTML = "This will take "+parts+" mediums!";
616              $retHTML .= "<td class=\"fviewborder\">" . $ftype . "</td>";                          element_id("parts").style.display = 'block';
617              $retHTML .= "<td class=\"fviewborder\">" . $file->{'backupno'} . "</td>";                          update_sum(media_size, suma);
618              $retHTML .= "<td class=\"fviewborder\">" . $file->{'size'} . "</td>";                          suma = media_size;
619              $retHTML .= "<td class=\"fviewborder\">" . $file->{'date'} . "</td>";                          return suma;
620              $retHTML .= "<td class=\"fviewborder\">" . $file->{'dvd'} . "</td>";                  } else {
621              $retHTML .= "</tr>";                          element_id("parts").style.display = 'none';
622          }                  }
623        $retHTML .= "</table>";  
624                    if (suma < 0) suma = 0;
625                  } else {
626                    suma = 0;
627        $retHTML .= "<INPUT TYPE=\"hidden\" VALUE=\"\" NAME=\"offset\">";                  for (var i = 0; i < len; i++) {
628        for (my $ii = 1; $ii <= $#files; $ii++)                          var e = element_id('forma').elements[i];
629        {                          if (e.name != 'all' && e.checked && e.name.substr(0,3) == 'fcb') {
630            $retHTML .= "<a href = \"#\" onclick=\"document.forma.offset.value=$ii;document.forma.submit();\">$ii</a>";                                  var el = element_id("fss" + e.name.substr(3));
631            if ($ii < $#files)                                  if (el && el.value) suma += parseInt(el.value) || 0;
632              {                          }
633                  $retHTML .= " | ";                  }
634              }          }
635        }          update_sum(suma);
636            return suma;
637    }
638         if ($addForm)  
639         {  /* progress bar */
640             $retHTML .= "</form>";  
641         }  var _pbar_width = null;
642    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            element_id("mask").style.display = "block";
649            element_id("progressIndicator").style.zIndex  = 10;
650            element_id("progressIndicator").innerHTML = "0";
651    }
652    
653    function dec2hex(d) {
654            var hch = '0123456789ABCDEF';
655            var a = d % 16;
656            var q = (d - a) / 16;
657            return hch.charAt(q) + hch.charAt(a);
658    }
659    
660    function pbar_set(amount, max) {
661            debug('pbar_set('+amount+', '+max+')');
662    
663            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    
670            var pcnt = Math.floor(amount * 100 / max);
671            var p90 = 100 - _pbar_warn;
672            var pcol = pcnt - p90;
673            if (Math.round(pcnt) <= 100) {
674                    if (pcol < 0) pcol = 0;
675                    var e = element_id("submitBurner");
676                    debug('enable_button');
677                    e.disabled = false;
678                    var a = e.getAttributeNode('disabled') || null;
679                    if (a) e.removeAttributeNode(a);
680            } else {
681                    debug('disable button');
682                    pcol = _pbar_warn;
683                    var e = element_id("submitBurner");
684                    if (!e.disabled) e.disabled = true;
685            }
686            var col_g = Math.floor((_pbar_warn - pcol) * 255 / _pbar_warn);
687            var col = '#FF' + dec2hex(col_g) + '00';
688    
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            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    }
702    
703    if (!self.body) self.body = new Object();
704    self.onload = self.document.onload = self.body.onload = function() {
705            //pbar_reset();
706            sumiraj();
707    };
708    
709    // -->
710    </script>
711    <div id="fixedBox">
712    
713    Size: <input type="text" name="totalsize" size="7" readonly="readonly" style="text-align:right;" value="0" /> kB
714    
715    <div id="mContainer">
716            <div id="gradient">&nbsp;</div>
717            <div id="mask">&nbsp;</div>
718            <div id="progressIndicator">0%</div>
719    </div>
720    <br/>
721    
722    <div id="parts">&nbsp;</div>
723    
724    Note:
725    <textarea name="note" cols="10" rows="5" id="note"></textarea>
726    
727    <input type="submit" id="submitBurner" value="Burn selected" name="submitBurner" />
728    
729    </div>
730    <!--
731    <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    -->
735    EOF3
736            $retHTML .= q{
737                            <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                                    <input type="checkbox" name="allFiles" id="allFiles" onClick="checkAll('allFiles');">
743                            </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                            <td align="center">gzip size/kB</td>
751                            </tr>
752    
753            };
754    
755            my @color = (' bgcolor="#e0e0e0"', '');
756    
757            my $i = 0;
758            my $host = '';
759    
760            foreach my $backup ( getBackupsNotBurned() ) {
761    
762                    if ($host ne $backup->{'host'}) {
763                            $i++;
764                            $host = $backup->{'host'};
765                    }
766                    my $ftype = "";
767    
768                    my $checkbox_key = $backup->{'hostid'}. '_' .$backup->{'backupnum'} . '_' . $backup->{'id'};
769    
770                    $retHTML .=
771                            '<tr' . $color[$i %2 ] . '>
772                            <td class="fview">';
773    
774                    if (($backup->{'inc_size'} || 0) > 0) {
775                            $retHTML .= '
776                            <input type="checkbox" name="fcb' . $checkbox_key . '" value="' . $checkbox_key . '" onClick="sumiraj(this);">';
777                    }
778    
779                    $retHTML .=
780                            '</td>' .
781                            '<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                            '<td align="right">' . $backup->{'inc_size'} .
788                            '<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    
791                            "</tr>\n";
792            }
793    
794            $retHTML .= "</table>";
795            $retHTML .= "</form>";
796                
797        return $retHTML;          return $retHTML;
798    }  }      
799    
800    sub displayGrid($) {
801            my ($param) = @_;
802    
803            my $offset = $param->{'offset'};
804            my $hilite = $param->{'search_filename'};
805    
806            my $retHTML = "";
807    
808            my $start_t = time();
809    
810            my ($results, $files);
811            if ($param->{'use_hest'} && length($hilite) > 0) {
812                    ($results, $files) = getFilesHyperEstraier($param);
813            } else {
814                    ($results, $files) = getFiles($param);
815            }
816    
817            my $dur_t = time() - $start_t;
818            my $dur = sprintf("%0.4fs", $dur_t);
819    
820            my ($from, $to) = (($offset * $on_page) + 1, ($offset * $on_page) + $on_page);
821    
822            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            $retHTML .= qq{
835            <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                    <td></td>
841                    <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                    </tr>
848            };
849    
850            my $file;
851    
852            sub hilite_html($$) {
853                    my ($html, $search) = @_;
854                    $html =~ s#($search)#<b>$1</b>#gis;
855                    return $html;
856            }
857    
858            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            my $i = $offset * $on_page;
866    
867            foreach $file (@{ $files }) {
868                    $i++;
869    
870                    my $typeStr  = BackupPC::Attrib::fileType2Text(undef, $file->{'type'});
871                    $retHTML .= qq{<tr class="fviewborder">};
872    
873                    $retHTML .= qq{<td class="fviewborder">$i</td>};
874    
875                    $retHTML .=
876                            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                            qq{<td class="fviewborder" align="right">} . $file->{'size'} . qq{</td>} .
880                            qq{<td class="fviewborder">} . epoch_to_iso( $file->{'date'} ) . qq{</td>} .
881                            qq{<td class="fviewborder">} . '?' . qq{</td>};
882    
883                    $retHTML .= "</tr>";
884            }
885            $retHTML .= "</table>";
886    
887            # 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    
892            my $del = '';
893            my $max_page = int( $results / $on_page );
894            my $page = 0;
895    
896            sub page_link($$$) {
897                    my ($param,$page,$display) = @_;
898    
899                    $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            $retHTML .= '<div style="text-align: center;">';
913    
914            if ($offset > 0) {
915                    $retHTML .= page_link($param, $offset - 1, '&lt;&lt;') . ' ';
916            }
917    
918            while ($page <= $max_page) {
919                    if ($page == $offset) {
920                            $retHTML .= $del . '<b>' . ($page + 1) . '</b>';
921                    } else {
922                            $retHTML .= $del . page_link($param, $page, $page + 1);
923                    }
924    
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            }
938    
939            if ($offset < $max_page) {
940                    $retHTML .= ' ' . page_link($param, $offset + 1, '&gt;&gt;');
941            }
942    
943            $retHTML .= "</div>";
944    
945            return $retHTML;
946    }
947    
948  1;  1;

Legend:
Removed from v.9  
changed lines
  Added in v.197

  ViewVC Help
Powered by ViewVC 1.1.26