use CGI;
my $client_re = qr/^([\w\d\.-]+)$/;
-my $pool_re = $client_re;
my $action = CGI::param('action') || 'begin';
window.setInterval("bweb_refresh()",refresh_time);
}
+function human_size(val)
+{
+ if (!val) {
+ val = 0;
+ }
+ var unit = ['b', 'Kb', 'Mb', 'Gb', 'Tb'];
+ var i=0;
+ var format;
+ while (val /1024 > 1) {
+ i++;
+ val /= 1024;
+ }
+
+ var format = (i>0)?1:0;
+ return val.toFixed(format) + ' ' + unit[i];
+}
+
+function human_sec(val)
+{
+ if (!val) {
+ val = 0;
+ }
+ val /= 60; // sec -> min
+
+ if ((val / 60) <= 1) {
+ return val.toFixed(0) + ' mins';
+ }
+
+ val /= 60; // min -> hour
+
+ if ((val / 24) <= 1) {
+ return val.toFixed(0) + ' hours';
+ }
+
+ val /= 24; // hour -> day
+
+ if ((val / 365) < 2) {
+ return val.toFixed(0) + ' days';
+ }
+
+ val /= 365;
+
+ return val.toFixed(0) + ' years';
+}
+
+
//
// percent_display("row2", [ { nb: 1, name: "Full" },
// { nb: 2, name: "Error" },
}
$all->{$vol}->{realslot} = $slot;
- $all->{$vol}->{volbytes} = Bweb::human_size($all->{$vol}->{volbytes}) ;
-
+
push @{ $param }, $all->{$vol};
} else { # empty or no label
my $all = $self->dbh_selectall_hashref($query, 'name') ;
- foreach (values %$all) {
- $_->{fileretention} = human_sec($_->{fileretention});
- $_->{jobretention} = human_sec($_->{jobretention});
- }
-
my $dsp = { ID => $cur_id++,
clients => [ values %$all] };
my $all = $self->dbh_selectall_hashref($query, 'jobid') ;
- foreach (values %$all) {
- $_->{jobbytes} = human_size($_->{jobbytes}) ;
- }
-
$self->display({ clientname => $arg{clientname},
Filter => $label,
ID => $cur_id++,
get last backup
-SELECT DISTINCT Job.JobId AS jobid,
- Client.Name AS client,
- FileSet.FileSet AS fileset,
- Job.Name AS jobname,
- Level AS level,
- StartTime AS starttime,
- JobFiles AS jobfiles,
- JobBytes AS jobbytes,
- VolumeName AS volumename,
- JobStatus AS jobstatus,
- JobErrors AS joberrors
-
- FROM Client,Job,JobMedia,Media,FileSet
- WHERE Client.ClientId=Job.ClientId
- AND Job.FileSetId=FileSet.FileSetId
- AND JobMedia.JobId=Job.JobId
- AND JobMedia.MediaId=Media.MediaId
- $limit
-
=cut
sub display_job
my $all = $self->dbh_selectall_hashref($query, 'jobid') ;
- foreach (values %$all) {
- $_->{jobbytes} = human_size($_->{jobbytes}) ;
- }
-
$self->display({ Filter => $label,
ID => $cur_id++,
Jobs =>
my $row = $self->dbh_selectrow_hashref($query) ;
- $row->{jobbytes} = human_size($row->{jobbytes}) ;
-
# display all volumes associate with this job
$query="
SELECT Media.VolumeName as volumename
";
my $all = $self->dbh_selectall_hashref($query, 'volumename') ;
- foreach (values %$all) {
- $_->{volbytes} = human_size($_->{volbytes}) ;
- }
$self->display({ ID => $cur_id++,
Pool => $elt{pool},
my $all = $self->dbh_selectall_hashref($query, 'volumename') ;
foreach my $media (values %$all) {
- $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 = "
my $jobs = $self->dbh_selectall_hashref($query, 'jobid') ;
- foreach (values %$jobs) {
- $_->{bytes} = human_size($_->{bytes}) ;
- }
-
$query = "
SELECT LocationLog.Date AS date,
Location.Location AS location,
$self->display({
%$elt,
%$row,
- },
- "update_media.tpl");
+ }, "update_media.tpl");
}
sub save_location
$row->{ID} = $cur_id++;
$row->{label} = $label;
- $row->{nb_bytes} = human_size($row->{nb_bytes}) ;
$self->display($row, "display_client_stats.tpl");
}
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 {
return $self->error("Bad autochanger name");
}
- my $b = $self->get_bconsole();
- print "<pre>" . $b->update_slots($ach) . "</pre>";
+ print "<pre>";
+ my $b = new Bconsole(pref => $self->{info},timeout => 60,log_stdout => 1);
+ $b->update_slots($ach);
+ print "</pre>\n"
}
sub get_job_log
<br/>
<div class='titlediv'>
<h1 class='newstitle'>
-Autochanger : <TMPL_VAR NAME=Name> (<TMPL_VAR NAME=nb_drive> Drives
-<TMPL_IF NAME=nb_io><TMPL_VAR NAME=nb_io> IMPORT/EXPORT</TMPL_IF>)</h1>
+Autochanger : <TMPL_VAR Name> (<TMPL_VAR nb_drive> Drives
+<TMPL_IF nb_io><TMPL_VAR nb_io> IMPORT/EXPORT</TMPL_IF>)</h1>
</div>
<div class='bodydiv'>
<form action='?' method='get'>
- <input type='hidden' name='ach' value='<TMPL_VAR NAME=name>'>
- <TMPL_IF NAME="Update">
+ <input type='hidden' name='ach' value='<TMPL_VAR name>'>
+ <TMPL_IF "Update">
<font color='red'> You must run update slot, Autochanger status is different from bacula slots </font>
<br/>
</TMPL_IF>
<input type="image" name='action' value='label_barcodes'
title='run label barcodes' src='/bweb/label.png'>Label
</label>
-<TMPL_IF NAME=nb_io>
+<TMPL_IF nb_io>
<label>
<input type="image" name='action' value='eject'
title='put selected media on i/o' src='/bweb/extern.png'>
var data = new Array();
var chkbox;
-<TMPL_LOOP NAME=Slots>
+<TMPL_LOOP Slots>
chkbox = document.createElement('INPUT');
chkbox.type = 'checkbox';
chkbox.name = 'slot';
-chkbox.value = '<TMPL_VAR NAME=realslot>';
+chkbox.value = '<TMPL_VAR realslot>';
data.push( new Array(
-"<TMPL_VAR NAME=realslot>",
-"<TMPL_VAR NAME=slot>",
-"<TMPL_VAR NAME=volumename>",
-"<TMPL_VAR NAME=volbytes>",
-"<TMPL_VAR NAME=volstatus>",
-"<TMPL_VAR NAME=mediatype>",
-"<TMPL_VAR NAME=name>",
-"<TMPL_VAR NAME=lastwritten>",
-"<TMPL_VAR NAME=expire>",
+"<TMPL_VAR realslot>",
+"<TMPL_VAR slot>",
+"<TMPL_VAR volumename>",
+human_size(<TMPL_VAR volbytes>),
+"<TMPL_VAR volstatus>",
+"<TMPL_VAR mediatype>",
+"<TMPL_VAR name>",
+"<TMPL_VAR lastwritten>",
+"<TMPL_VAR expire>",
chkbox
)
);
var data = new Array();
var chkbox;
-<TMPL_LOOP NAME=Drives>
+<TMPL_LOOP Drives>
chkbox = document.createElement('INPUT');
chkbox.type = 'checkbox';
chkbox.name = 'drive';
-chkbox.value = '<TMPL_VAR NAME=index>';
+chkbox.value = '<TMPL_VAR index>';
data.push( new Array(
-"<TMPL_VAR NAME=index>",
-"<TMPL_VAR NAME=name>",
-"<TMPL_VAR NAME=load>",
+"<TMPL_VAR index>",
+"<TMPL_VAR name>",
+"<TMPL_VAR load>",
chkbox
)
);
chkbox,
"<TMPL_VAR NAME=Uname>",
"<TMPL_VAR NAME=AutoPrune>",
- "<TMPL_VAR NAME=FileRetention>",
- "<TMPL_VAR NAME=JobRetention>"
+ human_sec(<TMPL_VAR NAME=FileRetention>),
+ human_sec(<TMPL_VAR NAME=JobRetention>)
)
) ;
</TMPL_LOOP>
<br/>
<div class='titlediv'>
- <h1 class='newstitle'> Last jobs for <TMPL_VAR NAME=clientname> (<TMPL_VAR NAME=Filter>)
+ <h1 class='newstitle'> Last jobs for <TMPL_VAR clientname> (<TMPL_VAR Filter>)
</h1>
</div>
<div class='bodydiv'>
- <table id='id<TMPL_VAR NAME=ID>'></table>
+ <table id='id<TMPL_VAR ID>'></table>
-<a href="bgraph.pl?client=<TMPL_VAR NAME=clientname>;action=job_size;status=T">
+<a href="bgraph.pl?client=<TMPL_VAR clientname>;action=job_size;status=T">
<img src="/bweb/chart.png" alt="backup size" title="backup size evolution"/>
</a>
-<a href="bgraph.pl?client=<TMPL_VAR NAME=clientname>;action=job_duration;status=T">
+<a href="bgraph.pl?client=<TMPL_VAR clientname>;action=job_duration;status=T">
<img src="/bweb/chart.png" alt="backup duration" title="backup time evolution"/>
</a>
-<a href="bgraph.pl?client=<TMPL_VAR NAME=clientname>;action=job_rate;status=T">
+<a href="bgraph.pl?client=<TMPL_VAR clientname>;action=job_rate;status=T">
<img src="/bweb/chart.png" alt="backup rate" title="backup rate evolution"/>
</a>
</div>
var data = new Array();
-<TMPL_LOOP NAME=Jobs>
+<TMPL_LOOP Jobs>
data.push( new Array(
-"<TMPL_VAR NAME=JobId>",
-"<TMPL_VAR NAME=JobName>",
-"<TMPL_VAR NAME=FileSet>",
-"<TMPL_VAR NAME=Level>",
-"<TMPL_VAR NAME=StartTime>",
-"<TMPL_VAR NAME=JobFiles>",
-"<TMPL_VAR NAME=JobBytes>",
-"<TMPL_VAR NAME=JobErrors>"
+"<TMPL_VAR JobId>",
+"<TMPL_VAR JobName>",
+"<TMPL_VAR FileSet>",
+"<TMPL_VAR Level>",
+"<TMPL_VAR StartTime>",
+"<TMPL_VAR JobFiles>",
+human_size(<TMPL_VAR JobBytes>),
+"<TMPL_VAR JobErrors>"
)
);
</TMPL_LOOP>
nrsTable.setup(
{
- table_name: "id<TMPL_VAR NAME=ID>",
+ table_name: "id<TMPL_VAR ID>",
table_header: header,
table_data: data,
up_icon: up_icon,
);
// get newest job first
-nrsTables['id<TMPL_VAR NAME=ID>'].fieldSort(0);
+nrsTables['id<TMPL_VAR ID>'].fieldSort(0);
</script>
data.push(
new Array( "<TMPL_VAR NAME=clientname>",
"<TMPL_VAR NAME=nb_jobs>",
- "<TMPL_VAR NAME=nb_bytes>",
+ human_size(<TMPL_VAR NAME=nb_bytes>),
"<TMPL_VAR NAME=nb_files>",
"<TMPL_VAR NAME=nb_err>"
)
"<TMPL_VAR StartTime>",
"<TMPL_VAR Duration>",
"<TMPL_VAR JobFiles>",
-"<TMPL_VAR JobBytes>",
+human_size(<TMPL_VAR JobBytes>),
"<TMPL_VAR joberrors">",
a
)
"<TMPL_VAR StartTime>",
"<TMPL_VAR duration>",
"<TMPL_VAR JobFiles>",
-"<TMPL_VAR JobBytes>",
+human_size(<TMPL_VAR JobBytes>),
"<TMPL_VAR poolname>",
"<TMPL_LOOP volumes><TMPL_VAR VolumeName>\n</TMPL_LOOP>",
img
data.push( new Array(
"<TMPL_VAR volumename>",
img,
-"<TMPL_VAR volbytes>",
+human_size(<TMPL_VAR volbytes>),
d,
"<TMPL_VAR volstatus>",
"<TMPL_VAR poolname>",
img,
"<TMPL_VAR location>",
"<TMPL_VAR volstatus>",
-"<TMPL_VAR nb_bytes>",
+human_size(<TMPL_VAR nb_bytes>),
"<TMPL_VAR expire>",
-"<TMPL_VAR volretention>",
-"<TMPL_VAR voluseduration>",
+human_sec(<TMPL_VAR volretention>),
+human_sec(<TMPL_VAR voluseduration>),
"<TMPL_VAR maxvoljobs>"
)
);
var data = new Array();
data.push( new Array(
"<TMPL_VAR nb_mounts>",
-"<TMPL_VAR volreadtime>",
-"<TMPL_VAR volwritetime>",
+human_sec(<TMPL_VAR volreadtime>),
+human_sec(<TMPL_VAR volwritetime>),
"<TMPL_VAR nb_errors>"
)
);
"<TMPL_VAR type>",
"<TMPL_VAR level>",
"<TMPL_VAR files>",
-"<TMPL_VAR bytes>",
+human_size(<TMPL_VAR bytes>),
a
)
);
data.push( new Array(
"<TMPL_VAR Name>",
"<TMPL_VAR Recycle>",
-"<TMPL_VAR VolRetention>",
-"<TMPL_VAR VolUseDuration>",
+human_sec(<TMPL_VAR VolRetention>),
+human_sec(<TMPL_VAR VolUseDuration>),
"<TMPL_VAR MaxVolJobs>",
"<TMPL_VAR MaxVolFiles>",
-"<TMPL_VAR MaxVolBytes>",
+human_size(<TMPL_VAR MaxVolBytes>),
"<TMPL_VAR VolNum>",
img,
img2,