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;
background-color: #E6E6E6;
}
-.pSliceFull, pSliceRead_Only,pSliceArchive, pSliceUsed, pSliceDisabled {
+.pSliceFull, .pSliceRead_Only,.pSliceArchive, .pSliceUsed, .pSliceDisabled,
+.pSliceCrit {
border: solid 1px #BD0C10;
background-color: #FF3029;
}
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;
}
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);
}
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;
}
+
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
";
}
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
";
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)
$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 = "
"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) = @_ ;
# 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} ;
<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';
"<TMPL_VAR volumename>",
img,
"<TMPL_VAR volbytes>",
+d,
"<TMPL_VAR volstatus>",
"<TMPL_VAR poolname>",
"<TMPL_VAR mediatype>",
<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>
<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;
"<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>"
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,
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");
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>
chkbox.value = '<TMPL_VAR Name>';
chkbox.name = 'pool';
+img2 = percent_usage(<TMPL_VAR poolusage>);
+
data.push( new Array(
"<TMPL_VAR Name>",
"<TMPL_VAR Recycle>",
"<TMPL_VAR MaxVolFiles>",
"<TMPL_VAR MaxVolBytes>",
"<TMPL_VAR VolNum>",
-d,
+img,
+img2,
chkbox
)
);