]> git.sur5r.net Git - bacula/bacula/blob - gui/bweb/cgi/bweb.pl
ebl Add role checks for media
[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 
332                                     limit age offset qclients qfilesets
333                                     jobtype qpools db_pools
334                                     db_client_groups qclient_groups/); # drop this to hide 
335
336     $bweb->display($fields, "display_form_job.tpl");
337
338     print "</td><td valign='top'>";
339     $bweb->display_job(age => $arg->{age},  # last 7 days
340                        offset => $arg->{offset},
341                        limit => $arg->{limit});
342     print "</td></tr></table></div>";
343 } elsif ($action eq 'job_group') {
344     $bweb->can_do('r_view_job');
345     print "<div><table border='0'><tr><td valign='top'>\n";
346     my $fields = $bweb->get_form(qw/limit level age filter 
347                                     db_client_groups qclient_groups/); # drop this to hide 
348
349     $fields->{hide_status} = 1;
350     $fields->{hide_type} = 1;
351     $fields->{action} = 'job_group';
352
353     $bweb->display($fields, "display_form_job.tpl");
354
355     print "</td><td valign='top'>";
356     $bweb->display_job_group(age => $arg->{age},  # last 7 days
357                              limit => $arg->{limit});
358     print "</td></tr></table></div>";
359 } elsif ($action eq 'client_stats') {
360
361     foreach my $client (CGI::param('client')) {
362         if ($client =~ m/$client_re/) {
363             $bweb->display_client_stats(clientname => $1,
364                                         age => $arg->{age});
365         }
366     }
367
368 } elsif ($action eq 'group_stats') {
369     $bweb->display_group_stats(age => $arg->{age});
370
371 } elsif ($action eq 'running') {
372     $bweb->display_running_jobs(1);
373
374 } elsif ($action eq 'dsp_cur_job') {
375     $bweb->display_running_job();
376
377 } elsif ($action eq 'update_from_pool') {
378     $bweb->can_do('r_media_mgnt');
379     my $elt = $bweb->get_form(qw/media pool/);
380     unless ($elt->{media} || $elt->{pool}) {
381         $bweb->error("Can't get media or pool param");
382     } else {
383         my $b = new Bconsole(pref => $conf) ;
384
385         $bweb->display({
386  content => $b->send_cmd("update volume=$elt->{media} fromPool=$elt->{pool}"),
387  title => "Update pool",
388  name => "update volume=$elt->{media} fromPool=$elt->{pool}",
389         }, "command.tpl");      
390     }
391     
392     $bweb->update_media();
393
394 } elsif ($action eq 'client_status') {
395     $bweb->can_do('r_client_status');
396     my $b;
397     foreach my $client (CGI::param('client')) {
398         if ($client =~ m/$client_re/) {
399             $client = $1;
400             $b = new Bconsole(pref => $conf) 
401                 unless ($b) ;
402
403             $bweb->display({
404                 content => $b->send_cmd("st client=$client"),
405                 title => "Client status",
406                 name => $client,
407             }, "command.tpl");
408             
409         } else {
410             $bweb->error("Can't get client selection");
411         }
412     }
413
414 } elsif ($action eq 'cancel_job') {
415     $bweb->cancel_job();
416
417 } elsif  ($action eq 'media_zoom') {
418     $bweb->display_media_zoom();
419
420 } elsif  ($action eq 'job_zoom') {
421     if ($arg->{jobid}) {
422         $bweb->display_job_zoom($arg->{jobid});
423         $bweb->get_job_log();
424     } 
425 } elsif ($action eq 'job_log') {
426     $bweb->get_job_log();
427
428 } elsif ($action eq 'prune') {
429     $bweb->prune();
430
431 } elsif ($action eq 'purge') {
432     $bweb->purge();
433
434 } elsif ($action eq 'run_job') {
435     $bweb->run_job();
436
437 } elsif ($action eq 'run_job_mod') {
438     $bweb->run_job_mod();
439
440 } elsif ($action eq 'run_job_now') {
441     $bweb->run_job_now();
442
443 } elsif ($action eq 'label_barcodes') {
444     $bweb->label_barcodes();
445
446 } elsif ($action eq 'delete') {
447     $bweb->delete();
448
449 } elsif ($action eq 'fileset_view') {
450     $bweb->fileset_view();
451
452 } else {
453     $bweb->error("Sorry, this action doesn't exist");
454 }
455
456 $bweb->display_end();
457
458 $bweb->dbh_disconnect();
459
460 __END__
461
462 TODO :
463
464  o Affichage des job en cours, termines
465  o Affichage du detail d'un job (status client)
466  o Acces aux log d'une sauvegarde
467  o Cancel d'un job
468  o Lancement d'un job
469
470  o Affichage des medias (pool, cf bacweb)
471  o Affichage de la liste des cartouches
472  o Affichage d'un autochangeur
473  o Mise a jour des slots
474  o Label barcodes
475  o Affichage des medias qui ont besoin d'etre change
476
477  o Affichage des stats sur les dernieres sauvegardes (cf bacula-web)
478  o Affichage des stats sur un type de job
479  o Affichage des infos de query.sql
480
481  - Affichage des du TapeAlert sur le site
482  - Recuperation des erreurs SCSI de /var/log/kern.log
483
484  o update d'un volume
485  o update d'un pool
486
487  o Configuration des autochanger a la main dans un hash dumper