]> git.sur5r.net Git - bacula/bacula/blob - gui/bweb/cgi/btime.pl
ebl Can modify client list group for a specific client
[bacula/bacula] / gui / bweb / cgi / btime.pl
1 #!/usr/bin/perl -w
2
3 =head1 LICENSE
4
5    Bweb - A Bacula web interface
6    Bacula® - The Network Backup Solution
7
8    Copyright (C) 2000-2006 Free Software Foundation Europe e.V.
9
10    The main author of Bweb is Eric Bollengier.
11    The main author of Bacula is Kern Sibbald, with contributions from
12    many others, a complete list can be found in the file AUTHORS.
13
14    This program is Free Software; you can redistribute it and/or
15    modify it under the terms of version two of the GNU General Public
16    License as published by the Free Software Foundation plus additions
17    that are listed in the file LICENSE.
18
19    This program is distributed in the hope that it will be useful, but
20    WITHOUT ANY WARRANTY; without even the implied warranty of
21    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22    General Public License for more details.
23
24    You should have received a copy of the GNU General Public License
25    along with this program; if not, write to the Free Software
26    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
27    02110-1301, USA.
28
29    Bacula® is a registered trademark of John Walker.
30    The licensor of Bacula is the Free Software Foundation Europe
31    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zurich,
32    Switzerland, email:ftf@fsfeurope.org.
33
34 =cut
35
36 use strict;
37 use GTime;
38 use Getopt::Long ;
39 use Bweb;
40 use Time::ParseDate qw/parsedate/;
41 use POSIX qw/strftime/;
42 use CGI;
43
44 my $conf = new Bweb::Config(config_file => $Bweb::config_file);
45 $conf->load();
46
47 my $bweb = new Bweb(info => $conf);
48 $bweb->can_do('r_view_stat');
49
50 my $arg = $bweb->get_form(qw/qiso_begin qiso_end qusage qpools qpoolusage qnojob
51                              jclient_groups db_client_groups qclient_groups/);
52 my ($filter1, undef) = $bweb->get_param('pool');
53
54 if (!$arg->{qiso_begin}) {
55    $arg->{qiso_begin} = strftime('\'%F %H:%M:00\'', localtime(time - 60*60*12));
56    $arg->{qiso_end} = strftime('\'%F %H:%M:00\'', localtime(time));
57 }
58 use Digest::MD5 qw(md5_hex);
59 my $md5_rep = md5_hex("$arg->{qiso_begin}:$arg->{qiso_end}:$arg->{qusage}:" . 
60                       "$arg->{jclient_groups}:$arg->{qpoolusage};$arg->{qnojob}") ;
61
62 print CGI::header('text/html');
63 $bweb->display_begin();
64
65 if ($arg->{qiso_begin} && -f "$conf->{fv_write_path}/$md5_rep.png") {
66     $arg->{result} = "/bweb/fv/$md5_rep.png";
67     $bweb->display($arg, 'btime.tpl');
68     
69     $bweb->display_end();
70     exit 0;
71 }
72
73 my $top = new GTime(
74                     debug => $conf->{debug},
75                     xmarge => 200,
76                     type => {
77                         spool =>  1,
78                         despool =>  2,
79                         commit => 4,
80                         waiting => 3,
81                         init => 5,
82                     }) ;
83 my $sec = $bweb->{sql}->{STARTTIME_SEC};
84 $sec =~ s/Job.StartTime/Log.Time/;
85 my $reg = $bweb->{sql}->{MATCH};
86
87
88 my %regs = (
89             end_job => ': Bacula',
90             start_job => ': Start Backup',
91             data_despool_time => ': Despooling elapsed time',
92             attr_despool_time => ': Sending spooled attrs',
93             get_drive => ': Using Device',
94             start_spool => ': Spooling',
95             end_spool => ': User specified spool',
96             end_spool2 => ': Committing spooled data to',
97             );
98
99
100 my %regs_fr = (
101             end_job => ': Bacula',
102             start_job => ': D.marrage du ',
103             data_despool_time => ': Temps du tran',
104             attr_despool_time => ': Transfert des attributs',
105             get_drive => ': Using Device',
106             start_spool => ': Spooling',
107             end_spool => ': Taille du spool',
108             end_spool2 => ': Transfert des donn',
109             );
110
111 my $filter = join(" OR ", 
112                   map { "Log.LogText $bweb->{sql}->{MATCH} '$_'" } values %regs);
113
114 my $query = "
115 SELECT " . $bweb->dbh_strcat('Job.Name', "'_'", 'Job.Level') . ",
116        $sec,
117        substring(Log.LogText from 8 for 70),
118        Job.JobId,
119        Pool.Name
120
121 FROM  Log INNER JOIN Job USING (JobId) JOIN Pool USING (PoolId)
122 " . ($arg->{jclient_groups}?
123 "     JOIN Client USING (ClientId) 
124       JOIN client_group_member ON (Client.ClientId = client_group_member.clientid) 
125       JOIN client_group USING (client_group_id)
126       WHERE client_group_name IN ($arg->{jclient_groups})
127         AND
128 ":'WHERE') .
129 "
130       Job.StartTime > $arg->{qiso_begin}
131   AND Job.StartTime < $arg->{qiso_end}
132   AND ( $filter )
133   AND Job.Type = 'B'
134   $filter1
135  ORDER BY Job.JobId,Log.LogId,Log.Time  ";
136
137
138 print STDERR $query if ($conf->{debug});
139 my $all = $bweb->dbh_selectall_arrayref($query);
140
141 my $lastid = 0;
142 my $lastspool = 0;
143 my $last_name;
144 my $data = [];
145 my $write = {};
146 my $pool = {};
147 my $drive = "";
148 my $end;
149 my $begin;
150 foreach my $elt (@$all)
151 {
152     if ($lastid && $lastid ne $elt->[3]) {
153         if (!$arg->{qnojob}) {
154             $top->add_job(label => $last_name,
155                           data => $data);
156         }
157         $data = [];
158         $lastspool=0;
159     }
160
161     if ($elt->[2] =~ /$regs{end_job}/) {
162         push @$data, {
163             type  => "commit",
164             begin => $begin,
165             end   => $elt->[1],
166         };
167
168 #    } elsif ($elt->[2] =~ /$regs{attr_despool_time}/) {
169 #
170 #       push @$data, {
171 #           l => $elt->[2],
172 #           type  => "waiting",
173 #           begin => $begin,
174 #           end   => $elt->[1],
175 #       };
176 #
177     } elsif ($elt->[2] =~ /$regs{get_drive} "([\w\d]+)"/) {
178         $drive = $1;
179
180     } elsif ($elt->[2] =~ /$regs{data_despool_time}.+? = (\d+):(\d+):(\d+)/) {
181         # on connait le temps de despool
182         my $t = $1*60*60+ $2*60 + $3;
183
184         if ($t > 10) {          # en dessous de 10s on affiche pas
185             push @$data, {      # temps d'attente du drive
186 #               l => $elt->[2],
187                 type  => "waiting",
188                 begin => $begin,
189                 end   => parsedate($elt->[1]) - $t,
190             };
191
192             push @$data, {
193 #               l => $elt->[2],
194                 type  => "despool",
195                 begin => parsedate($elt->[1]) - $t,
196                 end   => $elt->[1],
197             };
198
199             push @{$write->{$drive}}, { # display only write time
200                 type  => "despool",
201                 begin => parsedate($elt->[1]) - $t,
202                 end   => $elt->[1],
203             };
204
205             push @{$pool->{"$drive: $elt->[4]"}}, {
206                 type  => "despool",
207                 begin => parsedate($elt->[1]) - $t,
208                 end   => $elt->[1],
209             };
210         } else {
211             push @$data, {
212 #               t => $t,
213 #               l => $elt->[2],
214                 type  => "waiting",
215                 begin => $begin,
216                 end   => $elt->[1],
217             };
218         }
219         
220     } elsif ($elt->[2] =~ /$regs{start_spool}/) {
221
222         if (!$lastspool) {
223             push @$data, {
224                 type  => "init",
225                 begin => $begin,
226                 end   => $elt->[1],
227             };  
228         }
229
230         $lastspool = 1;
231
232     } elsif ($elt->[2] =~ /($regs{end_spool}|$regs{end_spool2})/) {
233         push @$data, {
234 #           l => $elt->[2],
235             type  => "spool",
236             begin => $begin,
237             end   => $elt->[1],
238         };
239
240     } elsif ($elt->[2] =~ /$regs{start_job}/) {
241         1;
242     } else {
243         next;
244     }
245
246     $end = $begin;
247     $begin = $elt->[1];
248     $last_name = $elt->[0];
249     $lastid = $elt->[3];
250 }
251
252 if (!$arg->{qnojob} && $last_name) {
253     $top->add_job(label => $last_name,
254                   data => $data);
255 }
256 if ($arg->{qpoolusage}) {
257     foreach my $d (sort keys %$pool) {
258         $top->add_job(label => $d,
259                       data => $pool->{$d});
260     }
261 }
262
263 if ($arg->{qusage}) {
264     foreach my $d (sort keys %$write) {
265         $top->add_job(label => "drive $d",
266                       data => $write->{$d});
267     }
268 }
269
270 #print STDERR Data::Dumper::Dumper($top);
271
272 $top->finalize();
273
274 open(FP, ">$conf->{fv_write_path}/$md5_rep.png");
275 binmode FP;
276 # Convert the image to PNG and print it on standard output
277 print FP $GTime::gd->png;
278 close(FP);
279
280 $arg->{result} = "/bweb/fv/$md5_rep.png";
281 $bweb->display( $arg, 'btime.tpl');
282 $bweb->display_end();