Imported Upstream version 3.3.1
[debian/amanda] / server-src / amrmtape.pl
index 392228f30a1f22c96f29f55edf973e23e9bf0076..7c052a52216f16b1752d13d223157450d2779305 100644 (file)
@@ -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,
@@ -239,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 ) {
@@ -306,26 +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) = @_;
+                       $chg->quit();
+                       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->();