$bweb->display_medias();
} elsif ($action eq 'eject') {
- my $a = Bweb::Autochanger::get('S1_L80', $bweb);
+ my $arg = $bweb->get_form("ach");
+ my $a = Bweb::Autochanger::get($arg->{ach}, $bweb);
+
+ if ($a) {
+ $a->status();
+ foreach my $slot (CGI::param('slot')) {
+ print $a->{error} unless $a->send_to_io($slot);
+ }
- $a->status();
- foreach my $slot (CGI::param('slot')) {
- print $a->{error} unless $a->send_to_io($slot);
- }
+ foreach my $media (CGI::param('media')) {
+ my $slot = $a->get_media_slot($media);
+ print $a->{error} unless $a->send_to_io($slot);
+ }
- foreach my $media (CGI::param('media')) {
- my $slot = $a->get_media_slot($media);
- print $a->{error} unless $a->send_to_io($slot);
+ $a->display_content();
}
- $a->display_content();
-
} elsif ($action eq 'eject_media') {
$bweb->eject_media();
} elsif ($action eq 'clear_io') {
- my $a = Bweb::Autochanger::get('S1_L80', $bweb);
- $a->status();
- $a->clear_io();
- $a->display_content();
-
+ my $arg = $bweb->get_form('ach');
+
+ my $a = Bweb::Autochanger::get($arg->{ach}, $bweb);
+ if (defined $a) {
+ $a->status();
+ $a->clear_io();
+ $a->display_content();
+ }
} elsif ($action eq 'ach_view') {
# TODO : get autochanger name and create it
$bweb->connect_db();
- my $a = Bweb::Autochanger::get('S1_L80', $bweb);
- $a->status();
- $a->display_content();
+ my $arg = $bweb->get_form('ach');
+
+ my $a = Bweb::Autochanger::get($arg->{ach}, $bweb);
+ if ($a) {
+ $a->status();
+ $a->display_content();
+ }
+
+} elsif ($action eq 'ach_add') {
+ $bweb->ach_add();
} elsif ($action eq 'ach_load') {
my $arg = $bweb->get_form('ach', 'drive', 'slot');
+
+ my $a = Bweb::Autochanger::get($arg->{ach}, $bweb);
- if (defined $arg->{ach} and defined $arg->{drive} and defined $arg->{slot})
+ if (defined $a and defined $arg->{drive} and defined $arg->{slot})
{
- my $a = Bweb::Autochanger::get('S1_L80', $bweb);
my $b = new Bconsole(pref => $conf, timeout => 300, log_stdout => 1) ;
# TODO : use template here
print "<pre>\n";
} elsif ($action eq 'ach_unload') {
my $arg = $bweb->get_form('drive', 'slot', 'ach');
- if (defined $arg->{ach} and defined $arg->{drive} and defined $arg->{slot})
+ my $a = Bweb::Autochanger::get($arg->{ach}, $bweb);
+
+ if (defined $a and defined $arg->{drive} and defined $arg->{slot})
{
- my $a = Bweb::Autochanger::get('S1_L80', $bweb);
my $b = new Bconsole(pref => $conf, timeout => 300, log_stdout => 1) ;
# TODO : use template here
print "<pre>\n";
}
}
-
-
} elsif ($action eq 'running') {
$bweb->display_running_jobs(1);
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 "label : ", join(',', $c->label_barcodes(storage => 'SDLT-1-2',
+# slots => 6,
+# drive => 0)), "\n";
bconsole => qr!^(.+)?$!,
syslog_file => qr!^(.+)?$!,
log_dir => qr!^(.+)?$!,
+ ach_list => qr!^(.+)?$!,
);
=head1 FUNCTION
=cut
# TODO : get autochanger definition from config/dump file
-my %ach_list ;
+my $ach_list ;
sub get
{
my ($name, $bweb) = @_;
- my $a = new Bweb::Autochanger(debug => $bweb->{debug},
- bweb => $bweb,
- name => 'S1_L80',
- precmd => 'sudo',
- drive_name => ['S1_L80_SDLT0', 'S1_L80_SDLT1'],
- );
+
+ unless ($name) {
+ return $bweb->error("Can't get your autochanger name ach");
+ }
+
+ unless ($ach_list) {
+ unless (get_defined_ach($bweb)) {
+ return undef;
+ }
+ }
+
+ my $a = $ach_list->{$name};
+
+ unless ($a) {
+ $bweb->error("Can't get your autochanger $name from your ach_list");
+ return undef;
+ }
+
+ $a->{bweb} = $bweb;
+
return $a;
}
+sub get_defined_ach
+{
+ my ($bweb) = @_;
+ if (defined $bweb->{info}->{ach_list}) {
+ if (open(FP, "<$bweb->{info}->{ach_list}")) {
+ my $f=''; my $tmpbuffer;
+ while(read FP,$tmpbuffer,4096)
+ {
+ $f .= $tmpbuffer;
+ }
+ close(FP);
+ no strict; # I have no idea of the contents of the file
+ eval '$ach_list = ' . $f ;
+ use strict;
+ } else {
+ return $bweb->error("Can't open $bweb->{info}->{ach_list} $!");
+ }
+ } else {
+ return $bweb->error("Can't find your ach_list file in your configuration");
+ }
+
+ $bweb->debug($ach_list);
+
+ return 1;
+}
+
+sub register
+{
+ my ($ach, $bweb) = @_;
+ my $err;
+
+ if (defined $bweb->{info}->{ach_list})
+ {
+ unless ($ach_list) {
+ get_defined_ach($bweb) ;
+ }
+
+ $ach_list->{$ach->{name}} = $ach;
+
+ if (open(FP, ">$bweb->{info}->{ach_list}")) {
+ print FP Data::Dumper::Dumper($ach_list);
+ close(FP);
+ } else {
+ $err = $!;
+ $err .= "\nCan you put this in $bweb->{info}->{ach_list}\n";
+ $err .= Data::Dumper::Dumper($ach_list);
+ }
+ } else {
+ $err = "ach_list isn't defined";
+ }
+
+ if ($err) {
+ return $bweb->error("Can't find to your ach_list (see bweb configuration) $err");
+ }
+
+ return 1;
+}
+
sub new
{
my ($class, %arg) = @_;
ach => 1,
jobtype=> 1,
);
-
+ my %opt_p = ( # option with path
+ mtxcmd => 1,
+ precmd => 1,
+ device => 1,
+ );
+
foreach my $i (@what) {
if (exists $opt_i{$i}) {# integer param
my $value = CGI::param($i) || $opt_i{$i} ;
} elsif ($i =~ /^q(\w+)s$/) { #[ 'arg1', 'arg2']
$ret{$i} = [ map { { name => $self->dbh_quote($_) } }
CGI::param($1) ];
+ } elsif (exists $opt_p{$i}) {
+ my $value = CGI::param($i) || '';
+ if ($value =~ /^([\w\d\.\/\s:\@\-]+)$/) {
+ $ret{$i} = $1;
+ }
}
}
}
+ if ($what{db_devices}) {
+ my $query = "
+SELECT Device.Name AS name
+FROM Device
+";
+
+ my $devices = $self->dbh_selectall_hashref($query, 'name');
+
+ $ret{db_devices} = [sort {lc($a->{name}) cmp lc($b->{name}) }
+ values %$devices] ;
+
+ }
+
return \%ret;
}
Media.Recycle AS recycle,
Media.VolRetention AS volretention,
Media.LastWritten AS lastwritten,
- Media.VolReadTime/100000 AS volreadtime,
- Media.VolWriteTime/100000 AS volwritetime,
+ Media.VolReadTime/1000000 AS volreadtime,
+ Media.VolWriteTime/1000000 AS volwritetime,
$self->{sql}->{FROM_UNIXTIME}(
$self->{sql}->{UNIX_TIMESTAMP}(Media.LastWritten)
+ $self->{sql}->{TO_SEC}(Media.VolRetention)
unless ($arg->{jmedias}) {
return $self->error("Can't get media selection");
}
+
+ my $a = Bweb::Autochanger::get($arg->{ach}, $self);
+ unless ($a) {
+ return 0;
+ }
my $query = "
SELECT Media.VolumeName AS volumename,
my $all = $self->dbh_selectall_hashref($query, 'volumename');
- my $a = Bweb::Autochanger::get('S1_L80', $self);
-
$a->status();
+
foreach my $vol (values %$all) {
print "eject $vol->{volumename} from $vol->{storage} : ";
if ($a->send_to_io($vol->{slot})) {
# TODO : make this internal to not eject tape ?
use Bconsole;
+sub ach_add
+{
+ my ($self) = @_;
+ my $arg = $self->get_form('ach', 'mtxcmd', 'device', 'precmd');
+
+ my $b = new Bconsole(pref => $self->{info});
+ my @storages = $b->list_storage() ;
+
+ unless ($arg->{ach}) {
+ $arg->{devices} = [ map { { name => $_ } } @storages ];
+ return $self->display($arg, "ach_add.tpl");
+ }
+
+ my @drives ;
+ foreach my $drive (CGI::param('drive'))
+ {
+ unless (grep(/^$drive$/,@storages)) {
+ return $self->error("Can't find $drive in storage list");
+ }
+
+ my $index = CGI::param("index_$drive");
+ unless (defined $index and $index =~ /^(\d+)$/) {
+ return $self->error("Can't get $drive index");
+ }
+
+ $drives[$index] = $drive;
+ }
+
+ unless (@drives) {
+ return $self->error("Can't get drives from Autochanger");
+ }
+
+ my $a = new Bweb::Autochanger(name => $arg->{ach},
+ precmd => $arg->{precmd},
+ drive_name => \@drives,
+ device => $arg->{device},
+ mtxcmd => $arg->{mtxcmd});
+
+ return Bweb::Autochanger::register($a, $self) ;
+}
+
sub delete
{
my ($self) = @_;
}
my $slots = '';
+ my $t = 300 ;
if ($arg->{slots}) {
$slots = join(",", @{ $arg->{slots} });
+ $t += 60*scalar( @{ $arg->{slots} }) ;
}
- my $t = 60*scalar( @{ $arg->{slots} }) + 300 ;
my $b = new Bconsole(pref => $self->{info}, timeout => $t,log_stdout => 1);
print "<h1>This command can take long time, be patient...</h1>";
print "<pre>" ;