X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=server-src%2Famrmtape.pl;h=7c052a52216f16b1752d13d223157450d2779305;hb=62abb35ba5c767ed1af62950c319d00afd093e1a;hp=27f6d1eafe27dad07ef716fde799361a16fd8a6e;hpb=b116e9366c7b2ea2c2eb53b0a13df4090e176235;p=debian%2Famanda diff --git a/server-src/amrmtape.pl b/server-src/amrmtape.pl index 27f6d1e..7c052a5 100644 --- a/server-src/amrmtape.pl +++ b/server-src/amrmtape.pl @@ -107,7 +107,10 @@ Amanda::Util::setup_application("amrmtape", "server", $CONTEXT_CMDLINE); my $config_overrides = new_config_overrides( scalar(@ARGV) + 1 ); +debug("Arguments: " . join(' ', @ARGV)); +Getopt::Long::Configure(qw{ bundling }); my $opts_ok = GetOptions( + 'version' => \&Amanda::Util::version_opt, "changer=s" => \$changer_name, "cleanup" => \$cleanup, "dryrun|n" => \$dry_run, @@ -175,13 +178,14 @@ if ($cfgerr_level >= $CFGERR_ERRORS) { die "Errors processing disklist"; } -my $scrub_db = sub { - my $tapelist_file = config_dir_relative(getconf($CNF_TAPELIST)); - my $tapelist = Amanda::Tapelist->new($tapelist_file, !$dry_run); - unless ($tapelist) { - die "Could not read the tapelist"; - } +my $tapelist_file = config_dir_relative(getconf($CNF_TAPELIST)); +my $tapelist = Amanda::Tapelist->new($tapelist_file, !$dry_run); +unless ($tapelist) { + die "Could not read the tapelist"; +} + +my $scrub_db = sub { my $t = $tapelist->lookup_tapelabel($label); if ($keep_label) { $t->{'datestamp'} = 0 if $t; @@ -238,7 +242,7 @@ my $scrub_db = sub { } my $level = $parts[1]; my $cur_label = $parts[7]; - if ($cur_label eq $label) { + if (defined $cur_label and $cur_label eq $label) { $dead_level = $level; vlog "Discarding Host: $host, Disk: $disk, Level: $level\n"; } elsif ( $level > $dead_level ) { @@ -295,7 +299,7 @@ my $erase_volume = make_cb('erase_volume' => sub { open(LOG, ">$log_file"); print LOG "INFO amrmtape amrmtape pid $$\n"; close LOG; - my $chg = Amanda::Changer->new($changer_name); + my $chg = Amanda::Changer->new($changer_name, tapelist => $tapelist); $chg->load( 'label' => $label, 'res_cb' => sub { @@ -305,24 +309,36 @@ my $erase_volume = make_cb('erase_volume' => sub { my $dev = $resv->{'device'}; die "Can not erase $label because the device doesn't support this feature" unless $dev->property_get('full_deletion'); - if (!$dry_run) { - $dev->erase() - or die "Failed to erase volume"; - $dev->finish(); - # label the tape with the same label it had - if ($keep_label) { - $dev->start($ACCESS_WRITE, $label, undef) - or die "Failed to write tape label"; - } - } + my $rel_cb = make_cb('rel_cb' => sub { + $resv->release(finished_cb => sub { + my ($err) = @_; - $resv->release(finished_cb => sub { - my ($err) = @_; - die $err if $err; + $chg->quit(); + die $err if $err; - $scrub_db->(); + $scrub_db->(); + }); }); + + if (!$dry_run) { + $dev->erase() + or die "Failed to erase volume"; + $resv->set_label(finished_cb => sub { + $dev->finish(); + + # label the tape with the same label it had + if ($keep_label) { + $dev->start($ACCESS_WRITE, $label, undef) + or die "Failed to write tape label"; + return $resv->set_label(label => $label, finished_cb => $rel_cb); + } + $rel_cb->(); + }); + } else { + $rel_cb->(); + } + }); } else { $scrub_db->();