]> git.sur5r.net Git - bacula/bacula/blob - gui/bweb/cgi/bweb.pl
ebl fix replace bug
[bacula/bacula] / gui / bweb / cgi / bweb.pl
1 #!/usr/bin/perl -w
2 use strict ;
3
4 =head1 LICENSE
5
6    Bweb - A Bacula web interface
7    Bacula® - The Network Backup Solution
8
9    Copyright (C) 2000-2006 Free Software Foundation Europe e.V.
10
11    The main author of Bweb is Eric Bollengier.
12    The main author of Bacula is Kern Sibbald, with contributions from
13    many others, a complete list can be found in the file AUTHORS.
14
15    This program is Free Software; you can redistribute it and/or
16    modify it under the terms of version two of the GNU General Public
17    License as published by the Free Software Foundation plus additions
18    that are listed in the file LICENSE.
19
20    This program is distributed in the hope that it will be useful, but
21    WITHOUT ANY WARRANTY; without even the implied warranty of
22    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23    General Public License for more details.
24
25    You should have received a copy of the GNU General Public License
26    along with this program; if not, write to the Free Software
27    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
28    02110-1301, USA.
29
30    Bacula® is a registered trademark of John Walker.
31    The licensor of Bacula is the Free Software Foundation Europe
32    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zurich,
33    Switzerland, email:ftf@fsfeurope.org.
34
35 =head1 VERSION
36
37     $Id$
38
39 =cut
40
41 use Data::Dumper;
42 use Bweb;
43 use CGI;
44
45 my $client_re = qr/^([\w\d\.-]+)$/;
46
47 my $action = CGI::param('action') || 'begin';
48
49 if ($action eq 'restore') {
50     print CGI::header('text/brestore'); # specialy to run brestore.pl
51
52 } else {
53     print CGI::header('text/html');
54 }
55
56 # loading config file
57 my $conf = new Bweb::Config(config_file => $Bweb::config_file);
58 $conf->load();
59
60 my $bweb = new Bweb(info => $conf);
61
62 # just send data with text/brestore content
63 if ($action eq 'restore') {
64     $bweb->restore();
65     exit 0;
66 }
67
68 my $arg = $bweb->get_form('jobid', 'limit', 'offset', 'age');
69
70 $bweb->display_begin();
71
72 # if no configuration, we send edit_conf
73 if ($action ne 'apply_conf' and !$bweb->{info}->{dbi}) {
74     $action = 'edit_conf';
75 }
76
77 if ($action eq 'begin') {               # main display
78     print "<div style='left=0;'><table border='0'><tr><td valign='top' width='100%'>\n";
79     $bweb->display_general(age => $arg->{age});
80     $bweb->display_running_jobs(0);
81     print "</td><td valign='top'>";
82     $bweb->display({}, "stats.tpl");
83     print "</td></tr></table></div>";
84     $bweb->display_job(limit => 10); 
85
86 } elsif ($action eq 'view_conf') {
87     $bweb->can_do('r_configure');
88     $conf->view()
89
90 } elsif ($action eq 'edit_conf') {
91     $bweb->can_do('r_configure');
92     $conf->edit();
93
94 } elsif ($action eq 'apply_conf') {
95     $bweb->can_do('r_configure');
96     $conf->modify();
97
98 } elsif ($action eq 'user_del') {
99     $bweb->users_del();
100
101 } elsif ($action eq 'user_add') {
102     $bweb->users_add();
103
104 } elsif ($action eq 'user_edit') {
105     $bweb->display_user();
106
107 } elsif ($action eq 'user_save') {
108     $bweb->users_add();
109
110 } elsif ($action eq 'users') {
111     $bweb->display_users();
112
113 } elsif ($action eq 'client') { 
114     $bweb->display_clients();
115
116 } elsif ($action eq 'pool') {
117     $bweb->display_pool();
118
119 } elsif ($action eq 'location_edit') {
120     $bweb->location_edit();
121
122 } elsif ($action eq 'location_save') {
123     $bweb->location_save();
124
125 } elsif ($action eq 'location_add') {
126     $bweb->location_add();
127
128 } elsif ($action eq 'location_del') {
129     $bweb->location_del();
130
131 } elsif ($action eq 'media') {
132     $bweb->can_do('r_view_media');
133
134     print "<div><table border='0'><tr><td valign='top'>\n";
135     my $fields = $bweb->get_form(qw/db_locations db_pools expired
136                                     qlocations qpools volstatus qre_media
137                                     limit  qmediatypes db_mediatypes/);
138     $bweb->display($fields, "display_form_media.tpl");
139
140     print "</td><td valign='top'>";
141     $bweb->display_media(offset => $arg->{offset},
142                          limit => $arg->{limit});
143     print "</td></tr></table></div>";
144
145 } elsif ($action eq 'allmedia') {
146     $bweb->display_allmedia();
147
148 } elsif ($action eq 'eject') {
149     $bweb->can_do('r_autochanger_mgnt');
150
151     my $arg = $bweb->get_form("ach");
152     my $a = $bweb->ach_get($arg->{ach});
153     
154     if ($a) {
155         $a->status();
156         foreach my $slot (CGI::param('slot')) {
157             print $a->{error} unless $a->send_to_io($slot);
158         }
159
160         foreach my $media (CGI::param('media')) {
161             my $slot = $a->get_media_slot($media);
162             print $a->{error} unless $a->send_to_io($slot);
163         }
164
165         $a->display_content();
166     }
167 } elsif ($action eq 'add_media') {
168     $bweb->add_media();
169
170 } elsif ($action eq 'eject_media') {
171     $bweb->eject_media();
172
173 } elsif ($action eq 'clear_io') {
174     $bweb->can_do('r_autochanger_mgnt');
175
176     my $arg = $bweb->get_form('ach');
177
178     my $a = $bweb->ach_get($arg->{ach});
179     if (defined $a) {
180         $a->status();
181         $a->clear_io();
182         $a->display_content();
183     }
184
185 } elsif ($action eq 'ach_edit') {
186     $bweb->ach_edit();
187
188 } elsif ($action eq 'ach_del') {
189     $bweb->ach_del();
190
191 } elsif ($action eq 'ach_view') {
192     $bweb->can_do('r_autochanger_mgnt');
193
194     # TODO : get autochanger name and create it
195     $bweb->connect_db();
196     my $arg = $bweb->get_form('ach');
197
198     my $a = $bweb->ach_get($arg->{ach});
199     if ($a) {
200         $a->status();
201         $a->display_content();
202     }
203
204 } elsif ($action eq 'ach_add') {
205     $bweb->ach_add();
206
207 } elsif ($action eq 'ach_load') {
208     $bweb->can_do('r_autochanger_mgnt');
209
210     my $arg = $bweb->get_form('ach', 'drive', 'slot');
211     
212     my $a = $bweb->ach_get($arg->{ach});
213
214     if (defined $a and defined $arg->{drive} and defined $arg->{slot})
215     {
216         my $b = new Bconsole(pref => $conf, timeout => 300, log_stdout => 1) ;
217         # TODO : use template here
218         print "<pre>\n";
219         $b->send_cmd("mount slot=$arg->{slot} drive=$arg->{drive} storage=\"" . $a->get_drive_name($arg->{drive}) . '"');
220         print "</pre>\n";
221     } else {
222         $bweb->error("Can't get drive, slot or ach");
223     }
224     
225 } elsif ($action eq 'ach_unload') {
226     $bweb->can_do('r_autochanger_mgnt');
227
228     my $arg = $bweb->get_form('drive', 'slot', 'ach');
229
230     my $a = $bweb->ach_get($arg->{ach});
231
232     if (defined $a and defined $arg->{drive} and defined $arg->{slot})
233     {
234         my $b = new Bconsole(pref => $conf, timeout => 300, log_stdout => 1) ;
235         # TODO : use template here
236         print "<pre>\n";
237         $b->send_cmd("umount drive=$arg->{drive} storage=\"" . $a->get_drive_name($arg->{drive}) . '"');
238         print "</pre>\n";
239
240     } else {
241         $bweb->error("Can't get drive, slot or ach");
242     }   
243 } elsif ($action eq 'intern_media') {
244     $bweb->help_intern();
245
246 } elsif ($action eq 'compute_intern_media') {
247     $bweb->help_intern_compute();
248
249 } elsif ($action eq 'extern_media') {
250     $bweb->help_extern();
251
252 } elsif ($action eq 'compute_extern_media') {
253     $bweb->help_extern_compute();
254
255 } elsif ($action eq 'extern') {
256     $bweb->can_do('r_media_mgnt');
257     $bweb->can_do('r_autochanger_mgnt');
258
259     print "<div style='float: left;'>";
260     my @achs = $bweb->eject_media();
261     for my $ach (@achs) {
262         CGI::param('ach', $ach);
263         $bweb->update_slots();
264     }
265     print "</div><div style='float: left;margin-left: 20px;'>";
266     $bweb->move_media('no');    # enabled = no
267     print "</div>";
268
269 } elsif ($action eq 'move_email') {
270     $bweb->move_email();
271
272 } elsif ($action eq 'change_location') {
273     $bweb->location_change();
274
275 } elsif ($action eq 'location') {
276     $bweb->location_display();
277
278 } elsif ($action eq 'about') {
279     $bweb->display($bweb, 'about.tpl');
280
281 } elsif ($action eq 'intern') {
282     $bweb->move_media('yes'); # TODO : remove that
283
284 } elsif ($action eq 'move_media') {
285     my $a = $bweb->get_form('enabled');
286     $bweb->move_media($a->{enabled}); 
287
288 } elsif ($action eq 'save_location') {
289     $bweb->save_location();
290
291 } elsif ($action eq 'update_location') {
292     $bweb->update_location();
293
294 } elsif ($action eq 'update_media') {
295     $bweb->update_media();
296
297 } elsif ($action eq 'do_update_media') {
298     $bweb->do_update_media();
299
300 } elsif ($action eq 'update_slots') {
301     $bweb->update_slots();
302
303 } elsif ($action eq 'graph') {
304     $bweb->display_graph();
305
306 } elsif ($action eq 'next_job') {
307     $bweb->director_show_sched();
308
309 } elsif ($action eq 'enable_job') {
310     $bweb->enable_disable_job(1);
311
312 } elsif ($action eq 'disable_job') {
313     $bweb->enable_disable_job(0);
314
315 } elsif ($action eq 'groups') {
316     $bweb->display_groups();
317
318 } elsif ($action eq 'groups_edit') {
319     $bweb->groups_edit();
320
321 } elsif ($action eq 'groups_save') {
322     $bweb->groups_save();
323
324 } elsif ($action eq 'groups_del') {
325     $bweb->groups_del();
326
327 } elsif ($action eq 'job') {
328     $bweb->can_do('r_view_job');
329     print "<div><table border='0'><tr><td valign='top'>\n";
330     my $fields = $bweb->get_form(qw/status level filter db_clients
331                                     db_filesets since
332                                     limit age offset qclients qfilesets
333                                     jobtype qpools db_pools
334                                     db_client_groups qclient_groups/); # drop this to hide 
335     if (!CGI::param('since')) {
336         $fields->{hide_since}=1 ;
337         delete $fields->{since};
338     }
339     $bweb->display($fields, "display_form_job.tpl");
340
341     print "</td><td valign='top'>";
342     $bweb->display_job(age => $fields->{age},  # last 7 days
343                        since => $fields->{since},
344                        offset => $fields->{offset},
345                        limit => $fields->{limit});
346     print "</td></tr></table></div>";
347 } elsif ($action eq 'job_group') {
348     $bweb->can_do('r_view_job');
349     print "<div><table border='0'><tr><td valign='top'>\n";
350     my $fields = $bweb->get_form(qw/limit level age filter 
351                                     db_client_groups qclient_groups/); # drop this to hide 
352
353     $fields->{hide_status} = 1;
354     $fields->{hide_type} = 1;
355     $fields->{hide_since}=1;
356     $fields->{action} = 'job_group';
357
358     $bweb->display($fields, "display_form_job.tpl");
359
360     print "</td><td valign='top'>";
361     $bweb->display_job_group(age => $arg->{age},  # last 7 days
362                              limit => $arg->{limit});
363     print "</td></tr></table></div>";
364 } elsif ($action eq 'client_stats') {
365
366     foreach my $client (CGI::param('client')) {
367         if ($client =~ m/$client_re/) {
368             $bweb->display_client_stats(clientname => $1,
369                                         age => $arg->{age});
370         }
371     }
372
373 } elsif ($action eq 'group_stats') {
374     $bweb->display_group_stats(age => $arg->{age});
375
376 } elsif ($action eq 'running') {
377     $bweb->display_running_jobs(1);
378
379 } elsif ($action eq 'dsp_cur_job') {
380     $bweb->display_running_job();
381
382 } elsif ($action eq 'update_from_pool') {
383     $bweb->can_do('r_media_mgnt');
384     my $elt = $bweb->get_form(qw/media pool/);
385     unless ($elt->{media} || $elt->{pool}) {
386         $bweb->error("Can't get media or pool param");
387     } else {
388         my $b = new Bconsole(pref => $conf) ;
389
390         $bweb->display({
391  content => $b->send_cmd("update volume=$elt->{media} fromPool=$elt->{pool}"),
392  title => "Update pool",
393  name => "update volume=$elt->{media} fromPool=$elt->{pool}",
394         }, "command.tpl");      
395     }
396     
397     $bweb->update_media();
398
399 } elsif ($action eq 'client_status') {
400     $bweb->can_do('r_client_status');
401     my $b;
402     foreach my $client (CGI::param('client')) {
403         if ($client =~ m/$client_re/) {
404             $client = $1;
405             $b = new Bconsole(pref => $conf) 
406                 unless ($b) ;
407
408             $bweb->display({
409                 content => $b->send_cmd("st client=$client"),
410                 title => "Client status",
411                 name => $client,
412             }, "command.tpl");
413             
414         } else {
415             $bweb->error("Can't get client selection");
416         }
417     }
418
419 } elsif ($action eq 'cancel_job') {
420     $bweb->cancel_job();
421
422 } elsif  ($action eq 'media_zoom') {
423     $bweb->display_media_zoom();
424
425 } elsif  ($action eq 'job_zoom') {
426     if ($arg->{jobid}) {
427         $bweb->display_job_zoom($arg->{jobid});
428         $bweb->get_job_log();
429     } 
430 } elsif ($action eq 'job_log') {
431     $bweb->get_job_log();
432
433 } elsif ($action eq 'prune') {
434     $bweb->prune();
435
436 } elsif ($action eq 'purge') {
437     $bweb->purge();
438
439 } elsif ($action eq 'run_job') {
440     $bweb->run_job();
441
442 } elsif ($action eq 'run_job_mod') {
443     $bweb->run_job_mod();
444
445 } elsif ($action eq 'run_job_now') {
446     $bweb->run_job_now();
447
448 } elsif ($action eq 'label_barcodes') {
449     $bweb->label_barcodes();
450
451 } elsif ($action eq 'delete') {
452     $bweb->delete();
453
454 } elsif ($action eq 'fileset_view') {
455     $bweb->fileset_view();
456
457 } elsif ($action eq 'next_job2') {
458     $bweb->display_next_job();
459
460 } elsif ($action eq 'overview') {
461     $bweb->can_do('r_view_job');
462     print "<div><table border='0'><tr><td valign='top'>\n";
463     my $fields = $bweb->get_form(qw/level filter age jobtype since type
464                                     db_client_groups qclient_groups/); # drop this to hide 
465     $fields->{hide_status}=1;
466     $fields->{view_time_slice}=1;
467     $fields->{action}='overview';
468     $bweb->display($fields, "display_form_job.tpl");
469
470     print "</td><td valign='top'>";
471     $bweb->display_overview();
472     print "</td></tr></table></div>";
473
474 } elsif ($action eq 'overview_zoom') {
475     $bweb->can_do('r_view_job');
476     print "<div><table border='0'><tr><td valign='top'>\n";
477     my $fields = $bweb->get_form(qw/level filter age jobtype since type
478                                  db_client_groups qclient_groups/); # drop this to hide 
479     $fields->{hide_status}=1;
480     $fields->{view_time_slice}=1;
481     $fields->{action}='overview_zoom';
482     $bweb->display($fields, "display_form_job.tpl");
483     print "</td><td valign='top'>";
484     $bweb->display_overview_zoom();
485     print "</td></tr></table></div>";
486
487 } else {
488     $bweb->error("Sorry, this action doesn't exist");
489 }
490
491 $bweb->display_end();
492
493 $bweb->dbh_disconnect();
494
495 __END__
496
497 TODO :
498
499  o Affichage des job en cours, termines
500  o Affichage du detail d'un job (status client)
501  o Acces aux log d'une sauvegarde
502  o Cancel d'un job
503  o Lancement d'un job
504
505  o Affichage des medias (pool, cf bacweb)
506  o Affichage de la liste des cartouches
507  o Affichage d'un autochangeur
508  o Mise a jour des slots
509  o Label barcodes
510  o Affichage des medias qui ont besoin d'etre change
511
512  o Affichage des stats sur les dernieres sauvegardes (cf bacula-web)
513  o Affichage des stats sur un type de job
514  o Affichage des infos de query.sql
515
516  - Affichage des du TapeAlert sur le site
517  - Recuperation des erreurs SCSI de /var/log/kern.log
518
519  o update d'un volume
520  o update d'un pool
521
522  o Configuration des autochanger a la main dans un hash dumper