]> git.sur5r.net Git - bacula/bacula/blobdiff - gui/bweb/lib/Bconsole.pm
ebl Add role checks for media
[bacula/bacula] / gui / bweb / lib / Bconsole.pm
index 9bac7558b60a1d5fa075cb2f469f47ff205a9f53..45ec5d4183c0ce8c5952a92985d0ad2643c7aea0 100644 (file)
@@ -2,22 +2,34 @@ use strict;
 
 =head1 LICENSE
 
-    Copyright (C) 2006 Eric Bollengier
-        All rights reserved.
+   Bweb - A Bacula web interface
+   Bacula® - The Network Backup Solution
 
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    any later version.
+   Copyright (C) 2000-2006 Free Software Foundation Europe e.V.
 
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
+   The main author of Bweb is Eric Bollengier.
+   The main author of Bacula is Kern Sibbald, with contributions from
+   many others, a complete list can be found in the file AUTHORS.
 
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+   This program is Free Software; you can redistribute it and/or
+   modify it under the terms of version two of the GNU General Public
+   License as published by the Free Software Foundation plus additions
+   that are listed in the file LICENSE.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA.
+
+   Bacula® is a registered trademark of John Walker.
+   The licensor of Bacula is the Free Software Foundation Europe
+   (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zurich,
+   Switzerland, email:ftf@fsfeurope.org.
 
 =head1 VERSION
 
@@ -42,7 +54,7 @@ sub new
        pref => $arg{pref},     # Pref object
        bconsole => undef,      # Expect object
        log_stdout => $arg{log_stdout} || 0,
-       timeout => $arg{debug} || 10,
+       timeout => $arg{timeout} || 20,
        debug   => $arg{debug} || 0,
     };
 
@@ -65,8 +77,7 @@ sub run
        return 0;
     }
 
-    print "=> $cmd yes\n";
-
+    print STDERR "===> $cmd yes\n";
     $self->{bconsole}->clear_accum();
     $self->send("$cmd yes\n");
     $self->expect_it('-re',qr/^[*]/);
@@ -78,6 +89,12 @@ sub run
     }
 }
 
+# for brestore.pl::BwebConsole
+sub prepare
+{
+    # do nothing
+}
+
 sub send
 {
     my ($self, $what) = @_;
@@ -88,12 +105,32 @@ sub expect_it
 {
     my ($self, @what) = @_;
     unless ($self->{bconsole}->expect($self->{timeout}, @what)) {
-       $self->{error} = $!;
-       return 0;
+       return $self->error($self->{bconsole}->error());
     }
     return 1;
 }
 
+sub log_stdout
+{
+    my ($self, $how) = @_;
+
+    if ($self->{bconsole}) {
+       $self->{bconsole}->log_stdout($how);
+    }
+
+    $self->{log_stdout} = $how;
+}
+
+sub error
+{
+    my ($self, $error) = @_;
+    $self->{error} = $error;
+    if ($error) {
+       print STDERR "E: bconsole (", $self->{pref}->{bconsole}, ") $! $error\n";
+    }
+    return 0;
+}
+
 sub connect
 {
     my ($self) = @_;
@@ -105,8 +142,7 @@ sub connect
     unless ($self->{bconsole}) {
        my @cmd = split(/\s+/, $self->{pref}->{bconsole}) ;
        unless (@cmd) {
-           $self->{error} = "bconsole string not found";
-           return 0;
+           return $self->error("bconsole string not found");
        }
        $self->{bconsole} = new Expect;
        $self->{bconsole}->raw_pty(0);
@@ -119,13 +155,16 @@ sub connect
        { 
            my $sav = $SIG{__DIE__};
            $SIG{__DIE__} = sub {  _exit 1 ;};
+            my $old = $ENV{COLUMNS};
+            $ENV{COLUMNS} = 300;
            $ret = $self->{bconsole}->spawn(@cmd) ;
+           delete $ENV{COLUMNS};
+           $ENV{COLUMNS} = $old if ($old) ;
            $SIG{__DIE__} = $sav;
        }
 
        unless ($ret) {
-           $self->{error} = $!;
-           return 0;
+           return $self->error($self->{bconsole}->error());
        }
        
        # TODO : we must verify that expect return the good value
@@ -178,24 +217,6 @@ sub send_cmd_yes
     return $self->before();
 }
 
-sub send_cmd_with_drive
-{
-    my ($self, $cmd, $drive) = @_;
-    $drive = $drive || '0';
-
-    unless ($self->connect()) {
-       return '';
-    }
-    $self->send("$cmd\n");
-    $self->expect_it('-re', '\[0\]\s*:');
-
-    $self->send("$drive\n");
-    $self->expect_it('-re', '[0-9]');
-    $self->{bconsole}->clear_accum();
-    $self->expect_it('-re',qr/^[*]/);
-    return $self->before();
-}
-
 sub label_barcodes
 {
     my ($self, %arg) = @_;
@@ -211,16 +232,14 @@ sub label_barcodes
     $arg{drive} = $arg{drive} || '0' ;
     $arg{pool} = $arg{pool} || 'Scratch';
 
-    my $cmd = "label barcodes pool=\"$arg{pool}\" storage=\"$arg{storage}\"";
+    my $cmd = "label barcodes drive=$arg{drive} pool=\"$arg{pool}\" storage=\"$arg{storage}\"";
 
     if ($arg{slots}) {
        $cmd .= " slots=$arg{slots}";
     }
 
     $self->send("$cmd\n");
-    $self->expect_it('-re', '\[0\]\s*:');
-    $self->send("$arg{drive}\n");
-    $self->expect_it('-re', '[?].+\)\s*:');
+    $self->expect_it('-re', '[?].+\).*:');
     my $res = $self->before();
     $self->send("yes\n");
     $self->expect_it("yes");
@@ -273,8 +292,27 @@ sub director_get_sched
 sub update_slots
 {
     my ($self, $storage, $drive) = @_;
+    $drive = $drive || 0;
+
+    return $self->send_cmd("update slots storage=$storage drive=$drive");
+}
+
+sub get_fileset
+{
+    my ($self, $fs) = @_;
+
+    my $out = $self->send_cmd("show fileset=\"$fs\"");
     
-    return $self->send_cmd_with_drive("update slots storage=$storage", $drive);
+    my $ret = {};
+
+    foreach my $l (split(/\r\n/, $out)) { 
+        #              I /usr/local
+       if ($l =~ /^\s+([I|E])\s+(.+)$/) { # include
+           push @{$ret->{$1}}, { file => $2 };
+       }
+    }
+
+    return $ret;
 }
 
 sub list_job
@@ -301,6 +339,12 @@ sub list_client
     return split(/\r\n/, $self->send_cmd(".clients"));
 }
 
+sub list_pool
+{
+    my ($self) = @_;
+    return split(/\r\n/, $self->send_cmd(".pools"));
+}
+
 use Time::ParseDate qw/parsedate/;
 use POSIX qw/strftime/;
 use Data::Dumper;
@@ -316,7 +360,7 @@ sub _get_volume
            $sel .= " volume=$1";
 
        } else {
-           $self->{error} = "Sorry media is bad";
+           $self->error("Sorry media is bad");
            return '';
        }
     }
@@ -326,9 +370,9 @@ sub _get_volume
 
 sub purge_volume
 {
-    my ($self, @volume) = @_;
+    my ($self, $volume) = @_;
 
-    my $sel = $self->_get_volume(@volume);
+    my $sel = $self->_get_volume($volume);
     my $ret;
     if ($sel) {
        $ret = $self->send_cmd("purge $sel");
@@ -340,12 +384,12 @@ sub purge_volume
 
 sub prune_volume
 {
-    my ($self, @volume) = @_;
+    my ($self, $volume) = @_;
 
-    my $sel = $self->_get_volume(@volume);
+    my $sel = $self->_get_volume($volume);
     my $ret;
     if ($sel) {
-       $ret = $self->send_cmd_yes("prune $sel");
+       $ret = $self->send_cmd("prune $sel yes");
     } else {
        $ret = $self->{error};
     }
@@ -364,8 +408,7 @@ sub purge_job
            $sel .= " jobid=$1";
 
        } else {
-           $self->{error} = "Sorry jobid is bad";
-           return 0;
+           return $self->error("Sorry jobid is bad");
        }
     }
 
@@ -392,17 +435,17 @@ package main;
 print "test sans conio\n";
 
 my $c = new Bconsole(pref => {
-    bconsole => '/usr/local/bacula/sbin/bconsole -c /usr/local/bacula/etc/bconsole.conf',
+    bconsole => '/tmp/bacula/sbin/bconsole -n -c /tmp/bacula/etc/bconsole.conf',
 },
-                    debug => 1);
+                    debug => 0);
 
 print "fileset : ", join(',', $c->list_fileset()), "\n";
 print "job : ",     join(',', $c->list_job()), "\n";
 print "storage : ", join(',', $c->list_storage()), "\n";
 #print "prune : " . $c->prune_volume('000001'), "\n";
-#print "update : " . $c->send_cmd_with_drive('update slots storage=SDLT-1-2'), "\n";
-print "label : ", join(',', $c->label_barcodes(storage => 'SDLT-1-2',
-                                              slots => 6,
-                                              drive => 0)), "\n";
+#print "update : " . $c->send_cmd('update slots storage=SDLT-1-2, drive=0'), "\n";
+#print "label : ", join(',', $c->label_barcodes(storage => 'SDLT-1-2',
+#                                             slots => 6,
+#                                             drive => 0)), "\n";