use HTML::Template;
our $template_dir='/usr/share/bweb/tpl';
-
=head1 FUNCTION
new - creation a of new Bweb object
our %k_re = ( dbi => qr/^(dbi:(Pg|mysql):(?:\w+=[\w\d\.-]+;?)+)$/i,
user => qr/^([\w\d\.-]+)$/i,
password => qr/^(.*)$/i,
+ fv_write_path => qr!^([/\w\d\.-]*)$!,
template_dir => qr!^([/\w\d\.-]+)$!,
debug => qr/^(on)?$/,
email_media => qr/^([\w\d\.-]+@[\d\w\.-]+)$/,
bconsole => qr!^(.+)?$!,
syslog_file => qr!^(.+)?$!,
log_dir => qr!^(.+)?$!,
+ stat_job_table => qr!^(\w*)$!,
);
=head1 FUNCTION
unless (open(FP, $self->{config_file}))
{
- return $self->error("$self->{config_file} : $!");
+ return $self->error("can't load config_file $self->{config_file} : $!");
}
my $f=''; my $tmpbuffer;
while(read FP,$tmpbuffer,4096)
sub transfer
{
my ($self, $src, $dst) = @_ ;
- print "<pre>$self->{precmd} $self->{mtxcmd} -f $self->{device} transfer $src $dst</pre>\n";
+ if ($self->{debug}) {
+ print "<pre>$self->{precmd} $self->{mtxcmd} -f $self->{device} transfer $src $dst</pre>\n";
+ }
my $out = `$self->{precmd} $self->{mtxcmd} -f $self->{device} transfer $src $dst 2>&1`;
if ($? == 0) {
my $content = $self->get_slot($src);
- print "$content ($src) => $dst<br/>";
$self->{slot}->[$src] = 'empty';
$self->set_slot($dst, $content);
return 1;
if ($self->slot_is_full($slot))
{
my $free = $self->slot_get_first_free() ;
- print "want to move $slot to $free\n";
+ print "move $slot to $free :\n";
if ($free) {
- $self->transfer($slot, $free) || print "$self->{error}\n";
+ if ($self->transfer($slot, $free)) {
+ print "<img src='/bweb/T.png' alt='ok'><br/>\n";
+ } else {
+ print "<img src='/bweb/E.png' alt='ok' title='$self->{error}'><br/>\n";
+ }
} else {
- $self->{error} = "E : Can't find free slot";
+ $self->{error} = "<img src='/bweb/E.png' alt='ok' title='E : Can t find free slot'><br/>\n";
}
}
}
} else { # empty or no label
push @{ $param }, {realslot => $slot,
- volstatus => 'Unknow',
+ volstatus => 'Unknown',
volumename => $self->{slot}->[$slot]} ;
}
} else { # empty
use DBI;
use POSIX qw/strftime/;
+our $config_file='/etc/bacula/bweb.conf';
+
our $cur_id=0;
=head1 VARIABLE
$self->{info}->{user},
$self->{info}->{password});
- print "Can't connect to your database, see error log\n"
+ $self->error("Can't connect to your database:\n$DBI::errstr\n")
unless ($self->{dbh});
$self->{dbh}->{FetchHashKeyName} = 'NAME_lc';
if ($elt{volstatus}) {
my $status = CGI::param('volstatus') || '';
- if ($status =~ /^(\w)$/) {
+ if ($status =~ /^(\w+)$/) {
$ret{status} = $1;
$limit .= "AND Media.VolStatus = '$1' ";
}
'level',
'filesets',
'jobtype',
+ 'pools',
'jobid',
'status');
Job.Name AS jobname,
Level AS level,
StartTime AS starttime,
+ EndTime AS endtime,
Pool.Name AS poolname,
JobFiles AS jobfiles,
JobBytes AS jobbytes,
}
my $newloc = CGI::param('newlocation');
- my $user = CGI::param('user') || 'unknow';
+ my $user = CGI::param('user') || 'unknown';
my $comm = CGI::param('comment') || '';
$comm = $self->dbh_quote("$user: $comm");
$self->display({ email => $self->{info}->{email_media},
url => $url,
newlocation => $newloc,
- # [ { volumename => 'vol1' }, { volumename => 'vol2' },..]
+ # [ { volumename => 'vol1' }, { volumename => 'vol2'\81 },..]
medias => [ values %$medias ],
},
"change_location.tpl");
"running_job.tpl") ;
}
+# return the autochanger list to update
sub eject_media
{
my ($self) = @_;
+ my %ret;
my $arg = $self->get_form('jmedias');
unless ($arg->{jmedias}) {
foreach my $vol (values %$all) {
my $a = $self->ach_get($vol->{location});
next unless ($a) ;
+ $ret{$vol->{location}} = 1;
unless ($a->{have_status}) {
$a->status();
print "eject $vol->{volumename} from $vol->{storage} : ";
if ($a->send_to_io($vol->{slot})) {
- print "ok</br>";
+ print "<img src='/bweb/T.png' alt='ok'><br/>";
} else {
- print "err</br>";
+ print "<img src='/bweb/E.png' alt='err'><br/>";
}
}
+ return keys %ret;
}
sub move_email
return undef;
}
- $a->{bweb} = $self;
+ $a->{bweb} = $self;
+ $a->{debug} = $self->{debug};
return $a;
}
$update .= " pool=$arg->{pool} " ;
}
- $arg->{volretention} ||= 0 ;
- if ($arg->{volretention}) {
+ if (defined $arg->{volretention}) {
$update .= " volretention=\"$arg->{volretention}\" " ;
}
- $arg->{voluseduration} ||= 0 ;
- if ($arg->{voluseduration}) {
+ if (defined $arg->{voluseduration}) {
$update .= " voluse=\"$arg->{voluseduration}\" " ;
}
- $arg->{maxvoljobs} ||= 0;
- if ($arg->{maxvoljobs}) {
+ if (defined $arg->{maxvoljobs}) {
$update .= " maxvoljobs=$arg->{maxvoljobs} " ;
}
- $arg->{maxvolfiles} ||= 0;
- if ($arg->{maxvolfiles}) {
+ if (defined $arg->{maxvolfiles}) {
$update .= " maxvolfiles=$arg->{maxvolfiles} " ;
}
- $arg->{maxvolbytes} ||= 0;
- if ($arg->{maxvolbytes}) {
+ if (defined $arg->{maxvolbytes}) {
$update .= " maxvolbytes=$arg->{maxvolbytes} " ;
}
return $self->error("Can't find autochanger name");
}
+ my $a = $self->ach_get($arg->{ach});
+ unless ($a) {
+ return $self->error("Can't find autochanger name in configuration");
+ }
+
+ my $storage = $a->get_drive_name($arg->{drive});
+ unless ($storage) {
+ return $self->error("Can't get your drive name");
+ }
+
my $slots = '';
my $t = 300 ;
if ($arg->{slots}) {
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>" ;
- $b->label_barcodes(storage => $arg->{ach},
+ $b->label_barcodes(storage => $storage,
drive => $arg->{drive},
pool => 'Scratch',
slots => $slots) ;
$b->close();
print "</pre>";
+
+ $self->dbh_do("
+ UPDATE Media
+ SET LocationId = (SELECT LocationId
+ FROM Location
+ WHERE Location = '$arg->{ach}'),
+
+ RecyclePoolId = PoolId
+
+ WHERE Media.PoolId = (SELECT PoolId
+ FROM Pool
+ WHERE Name = 'Scratch')
+ AND (LocationId = 0 OR LocationId IS NULL)
+");
+
}
sub purge