]> git.sur5r.net Git - bacula/bacula/commitdiff
ebl Add volume/pool usage
authorEric Bollengier <eric@eb.homelinux.org>
Thu, 17 Aug 2006 17:42:43 +0000 (17:42 +0000)
committerEric Bollengier <eric@eb.homelinux.org>
Thu, 17 Aug 2006 17:42:43 +0000 (17:42 +0000)
git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@3296 91ce42f0-d328-0410-95d8-f526ca767f89

gui/bweb/html/bweb.css
gui/bweb/html/bweb.js
gui/bweb/lib/Bweb.pm
gui/bweb/tpl/display_media.tpl
gui/bweb/tpl/display_media_zoom.tpl
gui/bweb/tpl/display_pool.tpl

index 72abfc7d0c0484a0805b44415e152492a2108b71..3864a62b8138e94a58ad036febc3931f828aa91a 100644 (file)
@@ -11,7 +11,10 @@ button.formulaire { border: 0px; font-size: 9;  background-color: transparent; }
 td.joberr { background-color: red; font-color: white;}
 
 
-.pSlice, .pSliceFull, .pSliceError, .pSliceAppend, .pSlicePurged, .pSliceRecycle, pSliceArchive, pSliceUsed, pSliceRead_Only, pSliceDisabled {
+.pSlice, .pSliceFull, .pSliceError, .pSliceAppend, .pSlicePurged, .pSliceRecycle, 
+.pSliceArchive, .pSliceUsed, .pSliceRead_Only, .pSliceDisabled,
+.pSliceOk,.pSliceWarn,.pSliceCrit,.pSliceEmpty
+ {
   width: 2px;
   height: 9px;
   margin-right: 1px;
@@ -20,7 +23,8 @@ td.joberr { background-color: red; font-color: white;}
   background-color: #E6E6E6;   
 }
 
-.pSliceFull, pSliceRead_Only,pSliceArchive, pSliceUsed, pSliceDisabled {
+.pSliceFull, .pSliceRead_Only,.pSliceArchive, .pSliceUsed, .pSliceDisabled,
+.pSliceCrit {
  border: solid 1px #BD0C10;
  background-color: #FF3029;
 }
@@ -30,12 +34,12 @@ td.joberr { background-color: red; font-color: white;}
  background-color: #020202;
 }
 
-.pSliceAppend {
+.pSliceAppend, .pSliceWarn {
  border: solid 1px #CD6500;
  background-color: #FFCE00;
 }
 
-.pSlicePurged, .pSliceRecycle {
+.pSlicePurged, .pSliceRecycle, .pSliceOk {
  border: solid 1px #009900;
  background-color: #00FF00;
 }
index e92340ccf97f5b1af5888c04c2c2c17934ec08ed..80edc562c9fb8cdb9381ea81a9ba68a97e6534e7 100644 (file)
@@ -74,11 +74,18 @@ function percent_get_img(type)
    return img;
 }
 
-function percent_display(parent, hash_values)
+var percent_display_nb_slice = 20;
+var percent_usage_nb_slice = 5;
+
+function percent_display(hash_values, parent)
 {
-   var nb_elt=20;
+   var nb_elt=percent_display_nb_slice;
    var tips= "";
 
+   if (!parent) {
+      parent = document.createElement('DIV');
+   }
+
    if (typeof parent != "object") {
       parent = document.getElementById(parent);
    } 
@@ -122,4 +129,53 @@ function percent_display(parent, hash_values)
 
   parent.title = tips;
 
+  return parent;
+}
+
+function percent_usage(value, parent)
+{
+   var nb_elt=percent_usage_nb_slice;
+   var type;
+  
+   if (!parent) {
+      parent = document.createElement('DIV');
+   }   
+
+   if (typeof parent != "object") {
+      parent = document.getElementById(parent);
+   } 
+
+   if (!parent) {
+       alert("E : display_percent(): Can't find parent " + parent);
+       return;
+   }
+
+   if (value <= 0) {
+      type = "Empty";
+      value = 0;      
+   } else if (value <= 40) {
+      type = "Ok";
+   } else if (value <= 75) {
+      type = "Warn";
+   } else if (value <= 85) {
+      type = "Crit";
+   } else {
+      type = "Crit";
+   }
+
+   var nb = parseInt(value*nb_elt/100, 10);
+   parent.title = parseInt(value*100,10)/100 + "% used (approximate)";
+
+   for(var i=0; i<nb; i++) {
+      var img= percent_get_img(type);
+      parent.appendChild(img);
+   }
+
+   for(nb;nb < nb_elt;nb++) {
+      var img= percent_get_img("Empty");
+      parent.appendChild(img);       
+   } 
+
+   return parent;
 }
+
index f9a95905e64374627ecb917173819de7afa05e0d..f7974b2745bcb7158b0a18a542b96dc5fa3c490b 100644 (file)
@@ -1615,16 +1615,16 @@ sub display_general
     my ($limit, $label) = $self->get_limit(%arg);
 
     my $query = "
-SELECT 
-    (SELECT count(Pool.PoolId)   FROM Pool)   AS nb_pool, 
-    (SELECT count(Media.MediaId) FROM Media)  AS nb_media, 
+SELECT
+    (SELECT count(Pool.PoolId)   FROM Pool)   AS nb_pool,
+    (SELECT count(Media.MediaId) FROM Media)  AS nb_media,
     (SELECT count(Job.JobId)     FROM Job)    AS nb_job,
     (SELECT sum(VolBytes)        FROM Media)  AS nb_bytes,
-    (SELECT count(Job.JobId)     
+    (SELECT count(Job.JobId)
       FROM Job
       WHERE Job.JobStatus IN ('E','e','f','A')
       $limit
-    )                                        AS nb_err,
+    )                                         AS nb_err,
     (SELECT count(Client.ClientId) FROM Client) AS nb_client
 ";
 
@@ -1895,19 +1895,28 @@ sub display_media
     }
 
     my $query="
-SELECT Media.VolumeName AS volumename, 
-       Media.VolBytes   AS volbytes,
-       Media.VolStatus  AS volstatus,
-       Media.MediaType  AS mediatype,
-       Media.InChanger  AS online,
+SELECT Media.VolumeName  AS volumename, 
+       Media.VolBytes    AS volbytes,
+       Media.VolStatus   AS volstatus,
+       Media.MediaType   AS mediatype,
+       Media.InChanger   AS online,
        Media.LastWritten AS lastwritten,
        Location.Location AS location,
+       (volbytes*100/COALESCE(media_avg_size.size,-1))  AS volusage,
        Pool.Name         AS poolname,
        $self->{sql}->{FROM_UNIXTIME}(
           $self->{sql}->{UNIX_TIMESTAMP}(Media.LastWritten) 
         + $self->{sql}->{TO_SEC}(Media.VolRetention)
        ) AS expire
-FROM Pool, Media LEFT JOIN Location ON (Media.LocationId = Location.LocationId)
+FROM      Pool, Media 
+LEFT JOIN Location ON (Media.LocationId = Location.LocationId)
+LEFT JOIN (SELECT avg(Media.VolBytes) AS size,
+                  Media.MediaType     AS MediaType
+           FROM Media 
+          WHERE Media.VolStatus = 'Full' 
+          GROUP BY Media.MediaType
+           ) AS media_avg_size ON (Media.MediaType = media_avg_size.MediaType)
+
 WHERE Media.PoolId=Pool.PoolId
 $where
 ";
@@ -1963,6 +1972,8 @@ SELECT InChanger     AS online,
        Media.Recycle AS recycle,
        Media.VolRetention AS volretention,
        Media.LastWritten  AS lastwritten,
+       Media.VolReadTime/100000  AS volreadtime,
+       Media.VolWriteTime/100000  AS volwritetime,
        $self->{sql}->{FROM_UNIXTIME}(
           $self->{sql}->{UNIX_TIMESTAMP}(Media.LastWritten) 
         + $self->{sql}->{TO_SEC}(Media.VolRetention)
@@ -1979,6 +1990,8 @@ SELECT InChanger     AS online,
        $media->{nb_bytes} = human_size($media->{nb_bytes}) ;
        $media->{voluseduration} = human_sec($media->{voluseduration});
        $media->{volretention} = human_sec($media->{volretention});
+       $media->{volreadtime}  = human_sec($media->{volreadtime});
+       $media->{volwritetime}  = human_sec($media->{volwritetime});
        my $mq = $self->dbh_quote($media->{volumename});
 
        $query = "
@@ -2128,6 +2141,25 @@ sub update_location
                   "update_location.tpl");
 }
 
+sub get_media_max_size
+{
+    my ($self, $type) = @_;
+    my $query = 
+"SELECT avg(VolBytes) AS size
+  FROM Media 
+ WHERE Media.VolStatus = 'Full' 
+   AND Media.MediaType = '$type'
+";
+    
+    my $res = $self->selectrow_hashref($query);
+
+    if ($res) {
+       return $res->{size};
+    } else {
+       return 0;
+    }
+}
+
 sub do_update_media
 {
     my ($self) = @_ ;
@@ -2354,34 +2386,56 @@ sub display_pool
 # TODO : afficher les tailles et les dates
 
     my $query = "
-SELECT Pool.Name     AS name, 
-       Pool.Recycle  AS recycle,
-       Pool.VolRetention AS volretention,
+SELECT sum(subq.volmax)   AS volmax,
+       sum(subq.volnum)   AS volnum,
+       sum(subq.voltotal) AS voltotal,
+       Pool.Name          AS name,
+       Pool.Recycle       AS recycle,
+       Pool.VolRetention  AS volretention,
        Pool.VolUseDuration AS voluseduration,
-       Pool.MaxVolJobs AS maxvoljobs,
-       Pool.MaxVolFiles AS maxvolfiles,
-       Pool.MaxVolBytes AS maxvolbytes,
-       Pool.PoolId      AS poolid,
-      (SELECT count(Media.MediaId) 
-         FROM Media 
-        WHERE Media.PoolId = Pool.PoolId
-      ) AS volnum
- FROM Pool
-";     
+       Pool.MaxVolJobs    AS maxvoljobs,
+       Pool.MaxVolFiles   AS maxvolfiles,
+       Pool.MaxVolBytes   AS maxvolbytes,
+       subq.PoolId        AS PoolId
+FROM
+  (
+    SELECT COALESCE(media_avg_size.volavg,0) * count(Media.MediaId) AS volmax,
+           count(Media.MediaId)  AS volnum,
+           sum(Media.VolBytes)   AS voltotal,
+           Media.PoolId          AS PoolId,
+           Media.MediaType       AS MediaType
+    FROM Media
+    LEFT JOIN (SELECT avg(Media.VolBytes) AS volavg,
+                      Media.MediaType     AS MediaType
+               FROM Media 
+              WHERE Media.VolStatus = 'Full' 
+              GROUP BY Media.MediaType
+               ) AS media_avg_size ON (Media.MediaType = media_avg_size.MediaType)
+    GROUP BY Media.MediaType, Media.PoolId
+  ) AS subq 
+INNER JOIN Pool ON (Pool.PoolId = subq.PoolId) 
+GROUP BY subq.PoolId
+";
 
     my $all = $self->dbh_selectall_hashref($query, 'name') ;
+
     foreach my $p (values %$all) {
        $p->{maxvolbytes}    = human_size($p->{maxvolbytes}) ;
        $p->{volretention}   = human_sec($p->{volretention}) ;
        $p->{voluseduration} = human_sec($p->{voluseduration}) ;
 
+       if ($p->{volmax}) {
+           $p->{poolusage} = sprintf('%.2f', $p->{voltotal} * 100/ $p->{volmax}) ;
+       } else {
+           $p->{poolusage} = 0;
+       }
+
        $query = "
-  SELECT VolStatus AS volstatus, count(MediaId) AS nb 
+  SELECT VolStatus AS volstatus, count(MediaId) AS nb
     FROM Media 
    WHERE PoolId=$p->{poolid} 
 GROUP BY VolStatus
 ";
-
        my $content = $self->dbh_selectall_hashref($query, 'volstatus');
        foreach my $t (values %$content) {
            $p->{"nb_" . $t->{volstatus}} = $t->{nb} ;
index c99db5febd73bad4709698cc8d19eb926a7a443d..16aca4ff9a8dd8579658a208aeedba02afa1c847 100644 (file)
@@ -34,15 +34,18 @@ Location : <TMPL_VAR location>
 
 <script language="JavaScript">
 
-var header = new Array("Volume Name","Online","Vol Bytes","Vol Status",
+var header = new Array("Volume Name","Online","Vol Bytes", "Vol Usage", "Vol Status",
                       "Pool", "Media Type",
                       "Last Written", "When expire ?", "Select");
 
 var data = new Array();
 var img;
 var chkbox;
+var d;
 
 <TMPL_LOOP Medias>
+d = percent_usage(<TMPL_VAR volusage>);
+
 img = document.createElement('IMG');
 img.src = '/bweb/inflag<TMPL_VAR online>.png';
 
@@ -55,6 +58,7 @@ data.push( new Array(
 "<TMPL_VAR volumename>",
 img,
 "<TMPL_VAR volbytes>",
+d,
 "<TMPL_VAR volstatus>",
 "<TMPL_VAR poolname>",
 "<TMPL_VAR mediatype>",
index bba0fa1a021f7691e43e4c7a199a1786f6b876d2..0179ff2a3b50e15bd88714b5da837eec9d936c8a 100644 (file)
@@ -3,7 +3,9 @@
   <h1 class='newstitle'> Media : <TMPL_VAR volumename></h1>
  </div>
  <div class='bodydiv'>
-    <b> Media Infos </b><br/>
+    <b> Media Infos</b><br/>
+    <table id='id_info_<TMPL_VAR volumename>'></table>
+    <b> Media Stats</b><br/>
     <table id='id_media_<TMPL_VAR volumename>'></table>
     <b> Job List </b></br>
     <table id='id_jobs_<TMPL_VAR volumename>'></table>
@@ -25,9 +27,8 @@
 
 <script language="JavaScript">
 
-var header = new Array("Pool","Online","Location","Vol Status",
-                       "Vol Bytes", "Vol Mounts", "Expire",
-                      "Errors", "Retention", "Max use duration", "Max jobs");
+var header = new Array("Pool","Online","Location","Vol Status", "Vol Bytes", "Expire",
+                      "Retention","Max use duration", "Max jobs" );
 
 var data = new Array();
 var img;
@@ -41,9 +42,7 @@ img,
 "<TMPL_VAR location>",
 "<TMPL_VAR volstatus>",
 "<TMPL_VAR nb_bytes>",
-"<TMPL_VAR nb_mounts>",
 "<TMPL_VAR expire>",
-"<TMPL_VAR nb_errors>",
 "<TMPL_VAR volretention>",
 "<TMPL_VAR voluseduration>",
 "<TMPL_VAR maxvoljobs>"
@@ -52,7 +51,7 @@ img,
 
 nrsTable.setup(
 {
- table_name:     "id_media_<TMPL_VAR volumename>",
+ table_name:     "id_info_<TMPL_VAR volumename>",
  table_header: header,
  up_icon: up_icon,
  down_icon: down_icon,
@@ -63,10 +62,40 @@ nrsTable.setup(
  table_data: data,
  header_color: header_color,
  padding: 3,
- disable_sorting: new Array(0,1,2,3,4,5)
+ disable_sorting: new Array(1)
 }
 );
 
+var header = new Array( "Vol Mounts", "Read time", "Write time", "Read Bytes", "Write Bytes", "Errors");
+
+var data = new Array();
+data.push( new Array(
+"<TMPL_VAR nb_mounts>",
+"<TMPL_VAR volreadtime>",
+"<TMPL_VAR volwritetime>",
+"N/A","N/A",
+"<TMPL_VAR nb_errors>"
+ )
+);
+
+nrsTable.setup(
+{
+ table_name:     "id_media_<TMPL_VAR volumename>",
+ table_header: header,
+ up_icon: up_icon,
+ down_icon: down_icon,
+ prev_icon: prev_icon,
+ next_icon: next_icon,
+ rew_icon:  rew_icon,
+ fwd_icon:  fwd_icon,
+ table_data: data,
+ header_color: header_color,
+// disable_sorting: new Array()
+ padding: 3
+}
+);
+
+
 var header = new Array("JobId","Name","Start Time","Type",
                       "Level", "Files", "Bytes", "Status");
 
index 3240d86e5774e82ff151a88bcafc0595de9036e0..60850285918c03899530e01d6b4b7b4fb0445d34 100644 (file)
 
 var header = new Array("Name","Recycle","Retention","Use Duration",
                       "Max job per volume","Max file per volume", 
-                       "Max volume size","Nb volumes", "Usage", "Select");
+                       "Max volume size","Nb volumes", "Vol Status", "Usage", "Select");
 
 var data = new Array();
 var chkbox;
 var img;
-var d;
+var img2;
 
 <TMPL_LOOP Pools>
-d = document.createElement('DIV');
 
-img = percent_display(d, [
+img = percent_display([
 <TMPL_IF nb_recycle>{ name: "Recycle", nb: <TMPL_VAR nb_recycle> },</TMPL_IF>
 <TMPL_IF nb_purged> { name: "Purged", nb: <TMPL_VAR nb_purged> },</TMPL_IF>
 <TMPL_IF nb_append> { name: "Append", nb: <TMPL_VAR nb_append> },</TMPL_IF>
@@ -46,6 +45,8 @@ chkbox.type  = 'radio';
 chkbox.value = '<TMPL_VAR Name>';
 chkbox.name  = 'pool';
 
+img2 = percent_usage(<TMPL_VAR poolusage>);
+
 data.push( new Array(
 "<TMPL_VAR Name>",
 "<TMPL_VAR Recycle>",
@@ -55,7 +56,8 @@ data.push( new Array(
 "<TMPL_VAR MaxVolFiles>",
 "<TMPL_VAR MaxVolBytes>",
 "<TMPL_VAR VolNum>",
-d,
+img,
+img2,
 chkbox
  )
 );