]> git.sur5r.net Git - bacula/bacula/blobdiff - gui/bweb/cgi/bfileview.pl
ebl typo
[bacula/bacula] / gui / bweb / cgi / bfileview.pl
index ff4086e9a1ff89fec40301711c0bfeb00de65e50..7196ea7ac781d9bf3e1eae595c57b96566a5e92f 100755 (executable)
 
 =cut
 
-# TODO:
-#  Si c'est un fichier selectionne, afficher ses attributs
-#  ajouter le base_fic et base_url dans les options bweb
-#
-
 use strict;
+use POSIX qw/strftime/;
 use Bweb;
 use CCircle ;
 use Digest::MD5 qw(md5_hex);
 use File::Basename qw/basename dirname/;
 
-my $conf = new Bweb::Config(config_file => '/etc/bweb/config');
+my $conf = new Bweb::Config(config_file => $Bweb::config_file);
 $conf->load();
 my $bweb = new Bweb(info => $conf);
 $bweb->connect_db();
 
-my $arg = $bweb->get_form('where', 'jobid');
-my $where = $arg->{where};
+my $arg = $bweb->get_form('where', 'jobid', 'pathid', 'filenameid');
+my $where = $arg->{where} || '/';
 my $jobid = $arg->{jobid};
+my $pathid = $arg->{pathid};
+my $fnid = $arg->{filenameid};
 my $jobid_url = "jobid=$jobid";
 my $opt_level = 2 ;
 my $max_file = 20;
 my $batch = CGI::param("mode") || '';
 
-my $md5_rep = md5_hex("$where:$jobid") ;
+my $md5_rep = md5_hex("$where:$jobid:$pathid:$fnid") ;
 my $base_url = '/bweb/fv' ;
 my $base_fich = $conf->{fv_write_path};
 
-die "Can't get where" unless ($where and $jobid);
-
-if ($batch eq 'batch') {
+if ($jobid and $batch eq 'batch') {
     my $root = fv_get_root_pathid($where);
     if ($root) {
        fv_compute_size($jobid, $root);
@@ -80,25 +76,74 @@ print CGI::header('text/html');
 $bweb->display_begin();
 $bweb->display_job_zoom($jobid);
 
+unless ($jobid) {
+    $bweb->error("Can't get where or jobid");
+    $bweb->display_end();
+    exit 0;
+}
+
+unless ($base_fich and -w $base_fich) {
+    $bweb->error("fv_write_path ($base_fich) is not writable." . 
+                " See Bweb configuration.");
+    $bweb->display_end();
+    exit 0;
+}
+
 if (-f "$base_fich/$md5_rep.png" and -f "$base_fich/$md5_rep.tpl")
 {
     $bweb->display({}, "$base_fich/$md5_rep.tpl");
     $bweb->display_end();
     exit 0;
 }
-my $attribs = fv_get_file_attribute($jobid, $where);
-if ($attribs->{found}) {
-    $bweb->display($attribs, 'fv_file_attribs.tpl');
+
+my $r = $bweb->dbh_selectrow_hashref("SELECT PurgedFiles AS ok FROM Job WHERE JobId = $jobid");
+if (!$r || $r->{ok}) {
+    $bweb->error("File information for job $jobid has been pruned from catalog");
     $bweb->display_end();
-    exit 0;
+    exit 0;    
+} 
+
+$r = $bweb->dbh_selectrow_hashref("SELECT JobId AS ok FROM brestore_knownjobid WHERE JobId = $jobid");
+if (!$r || !$r->{ok}) {                # TODO: compute information
+    $bweb->error("Path information for job $jobid has not been updated in the catalog");
+    $bweb->display_end();
+    exit 0;    
+} 
+
+# if it's a file, display it
+if ($fnid and $pathid)
+{
+    my $attribs = fv_get_file_attribute_from_id($jobid, $pathid, $fnid);
+    if ($attribs->{found}) {
+       $bweb->display($attribs, 'fv_file_attribs.tpl');
+       $bweb->display_end();
+       exit 0;
+    }
+
+} else {
+
+    my $attribs = fv_get_file_attribute($jobid, $where);
+    if ($attribs->{found}) {
+       $bweb->display($attribs, 'fv_file_attribs.tpl');
+       $bweb->display_end();
+       exit 0;
+    }
 }
 
-if ($where !~ m!/$!) {
-    $where = $where . "/" ;
+my $root;
+
+if ($pathid) {
+    $root = $pathid;
+    $where = fv_get_root_path($pathid);
+
+} else {
+    if ($where !~ m!/$!) {
+       $where = $where . "/" ;
+    }
+    
+    $root = fv_get_root_pathid($where);
 }
 
-my $root = fv_get_root_pathid($where);
 if (!$root) {
     $bweb->error("Can't find $where in catalog");
     $bweb->display_end();
@@ -110,7 +155,7 @@ my $total = fv_compute_size($jobid, $root);
 my $url_action = "bfileview.pl?opt_level=$opt_level" ;
 my $top = new CCircle(
                      display_other => 1,
-                     base_url => "$url_action;$jobid_url;where=$where",
+                     base_url => "$url_action;pathid=$root;$jobid_url;here=$where",
                      ) ;
 
 fv_display_rep($top, $total, $root, $opt_level) ;
@@ -156,30 +201,37 @@ sub fv_display_rep
        my $size = fv_compute_size($jobid, $dir->[0]);
        $sum += $size;
 
-       my $chld = $ccircle->add_part($size * 100 / $max, 
+       my $per = $size * 100 / $max;
+       # can't use pathname when using utf or accent
+       # a bit ugly
+       $ccircle->{base_url} =~ s/pathid=\d+;/pathid=$dir->[0];/;
+
+       my $chld = $ccircle->add_part($per, 
                                      basename($dir->[1]) . '/',
                                      basename($dir->[1]) 
-                                      . "\n" 
+                                      . sprintf(' %.0f%% ', $per)
                                       . Bweb::human_size($size)
                                      ) ;
-       
-       if ($chld and $level > 0) {
+
+       if ($chld && $level > 0) {
            fv_display_rep($chld, $size, $dir->[0], $level - 1) ;
        }
     }
 
-    # 0: name, 1: size
+    # 0: filenameid, 1: filename, 2: size
     my $files = fv_get_big_files($jobid, $rep, 3*100/$max, $max_file/($level+1));
     foreach my $f (@{$files}) {
-       $ccircle->add_part($f->[1] * 100 / $max, 
-                          $f->[0],
-                          $f->[0] . "\n" . Bweb::human_size($f->[1]));
-       $sum += $f->[1];
+       $ccircle->{base_url} =~ s/pathid=\d+;(filenameid=\d+)?/pathid=$rep;filenameid=$f->[0];/;
+
+       $ccircle->add_part($f->[2] * 100 / $max, 
+                          $f->[1],
+                          $f->[1] . "\n" . Bweb::human_size($f->[2]));
+       $sum += $f->[2];
     }
 
     if ($sum < $max) {
        $ccircle->add_part(($max - $sum) * 100 / $max, 
-                          "other files < 3",
+                          "other files < 3%",
                           "other\n" . Bweb::human_size($max - $sum));
     }
 
@@ -212,11 +264,7 @@ sub fv_list_dirs
 
     my $ret = $bweb->dbh_selectall_arrayref("
       SELECT P.PathId,
-             (
-              SELECT Path FROM Path WHERE PathId = P.PathId
-              UNION 
-              SELECT Path FROM brestore_missing_path WHERE PathId = P.PathId
-             ) AS Path
+             ( SELECT Path FROM Path WHERE PathId = P.PathId) AS Path
         FROM (
           SELECT PathId
             FROM brestore_pathvisibility 
@@ -233,14 +281,25 @@ sub fv_get_file_attribute
 {
     my ($jobid, $full_name) = @_;
     
-    my $filename = $bweb->dbh_quote(basename($full_name));
-    my $path     = $bweb->dbh_quote(dirname($full_name) . "/");
+    # default to /
+    my $path = "'/'";
+    my $filename = "''";
+    
+    if ($full_name ne '/') {
+       $filename = $bweb->dbh_quote(basename($full_name));
+       $path     = $bweb->dbh_quote(dirname($full_name) . "/");
+    }
 
     my $attr = $bweb->dbh_selectrow_hashref("
- SELECT 1 AS found,
-        base64_decode_lstat(8, lstat) AS size
-   FROM File INNER JOIN Filename USING (FilenameId)
-             INNER JOIN Path     USING (PathId)
+ SELECT 1    AS found,
+        MD5  AS md5,
+        base64_decode_lstat(8,  LStat) AS size,
+        base64_decode_lstat(11, LStat) AS atime,
+        base64_decode_lstat(12, LStat) AS mtime,
+        base64_decode_lstat(13, LStat) AS ctime
+
+   FROM File JOIN Filename USING (FilenameId)
+             JOIN Path     USING (PathId)
   WHERE Name  = $filename
    AND  Path  = $path
    AND  JobId = $jobid
@@ -248,6 +307,37 @@ sub fv_get_file_attribute
 
     $attr->{filename} = $full_name;
     $attr->{size} = Bweb::human_size($attr->{size});
+    foreach my $d (qw/atime ctime mtime/) {
+       $attr->{$d} = strftime('%F %H:%M', localtime($attr->{$d}));
+    }
+    return $attr;
+}
+
+
+sub fv_get_file_attribute_from_id
+{
+    my ($jobid, $pathid, $filenameid) = @_;
+    
+    my $attr = $bweb->dbh_selectrow_hashref("
+ SELECT 1    AS found,
+        MD5  AS md5,
+        base64_decode_lstat(8,  LStat) AS size,
+        base64_decode_lstat(11, LStat) AS atime,
+        base64_decode_lstat(12, LStat) AS mtime,
+        base64_decode_lstat(13, LStat) AS ctime,
+        Path.Path ||  Filename.Name AS filename
+
+   FROM File INNER JOIN Filename USING (FilenameId)
+             INNER JOIN Path     USING (PathId)
+  WHERE FilenameId  = $filenameid
+   AND  PathId  = $pathid
+   AND  JobId = $jobid
+");
+
+    $attr->{size} = Bweb::human_size($attr->{size});
+    foreach my $d (qw/atime ctime mtime/) {
+       $attr->{$d} = strftime('%F %H:%M', localtime($attr->{$d}));
+    }
     return $attr;
 }
 
@@ -270,7 +360,7 @@ sub fv_get_files_size
     my ($jobid, $rep) = @_;
 
     my $ret = $bweb->dbh_selectrow_hashref("
- SELECT sum(base64_decode_lstat(8,lstat)) AS size
+ SELECT sum(base64_decode_lstat(8,LStat)) AS size
    FROM File
   WHERE PathId  = $rep
     AND JobId = $jobid
@@ -284,9 +374,9 @@ sub fv_get_big_files
     my ($jobid, $rep, $min, $limit) = @_;
 
     my $ret = $bweb->dbh_selectall_arrayref("
-   SELECT Name, size
+   SELECT FilenameId AS filenameid, Name AS name, size
    FROM (
-         SELECT FilenameId,base64_decode_lstat(8,lstat) AS size
+         SELECT FilenameId, base64_decode_lstat(8,LStat) AS size
            FROM File
           WHERE PathId  = $rep
             AND JobId = $jobid
@@ -316,14 +406,18 @@ sub fv_get_root_pathid
 {
     my ($path) = @_;
     $path = $bweb->dbh_quote($path);
-    my $ret = $bweb->dbh_selectrow_hashref("
-SELECT PathId FROM Path WHERE Path = $path
-   UNION 
-SELECT PathId FROM brestore_missing_path WHERE PATH = $path
-");
+    my $ret = $bweb->dbh_selectrow_hashref("SELECT PathId FROM Path WHERE Path = $path");
     return $ret->{pathid};
 }
 
+sub fv_get_root_path
+{
+    my ($pathid) = @_;
+    my $ret = $bweb->dbh_selectrow_hashref("SELECT Path FROM Path WHERE PathId = $pathid");
+    return $ret->{path};
+}
+
+
 __END__
 
 CREATE OR REPLACE FUNCTION base64_decode_lstat(int4, varchar) RETURNS int8 AS $$
@@ -343,4 +437,8 @@ RETURN val;
 END;
 $$ language 'plpgsql';
 
-ALTER TABLE brestore_pathvisibility ADD Size int8;
+ALTER TABLE brestore_pathvisibility ADD Size  int8;
+
+
+
+ALTER TABLE brestore_pathvisibility ADD Files int4;