- if (defined $header->{decrypt_cmd} &&
- length($header->{decrypt_cmd}) > 0) {
- if ($header->{dle_str} =~ /<encrypt>CUSTOM/) {
- # Can't decrypt client encrypted image
- my $cmd;
- $cmd->{pgm} = "cat";
- push @result, $cmd;
- return @result;
- }
- my $cmd;
- $cmd->{pgm} = $header->{decrypt_cmd};
- $cmd->{pgm} =~ s/ *\|$//g;
- push @result, $cmd;
- }
- if (defined $header->{uncompress_cmd} &&
- length($header->{uncompress_cmd}) > 0) {
- #If the image is not compressed, the decryption is here
- if ((!defined $header->{decrypt_cmd} ||
- length($header->{decrypt_cmd}) == 0 ) and
- $header->{dle_str} =~ /<encrypt>CUSTOM/) {
- # Can't decrypt client encrypted image
- my $cmd;
- $cmd->{pgm} = "cat";
- push @result, $cmd;
- return @result;
- }
- my $cmd;
- $cmd->{pgm} = $header->{uncompress_cmd};
- $cmd->{pgm} =~ s/ *\|$//g;
- push @result, $cmd;
- }
+sub main {
+ my ($finished_cb) = @_;
+
+ my $tapelist;
+ my $chg;
+ my $interactivity;
+ my $scan;
+ my $clerk;
+ my $plan;
+ my $timestamp;
+ my $all_success = 1;
+ my @xfer_errs;
+ my %all_filter;
+ my $check_done;
+
+ my $steps = define_steps
+ cb_ref => \$finished_cb,
+ finalize => sub { $scan->quit() if defined $scan;
+ $chg->quit() if defined $chg };
+
+ step start => sub {
+ # set up the tapelist
+ my $tapelist_file = config_dir_relative(getconf($CNF_TAPELIST));
+ $tapelist = Amanda::Tapelist->new($tapelist_file);
+
+ # get the timestamp
+ $timestamp = $opt_timestamp;
+ $timestamp = Amanda::DB::Catalog::get_latest_write_timestamp()
+ unless defined $opt_timestamp;
+
+ # make an interactivity plugin
+ $interactivity = Amanda::Interactivity::amcheckdump->new();
+
+ # make a changer
+ $chg = Amanda::Changer->new(undef, tapelist => $tapelist);
+ return $steps->{'quit'}->($chg)
+ if $chg->isa("Amanda::Changer::Error");
+
+ # make a scan
+ $scan = Amanda::Recovery::Scan->new(
+ chg => $chg,
+ interactivity => $interactivity);
+ return $steps->{'quit'}->($scan)
+ if $scan->isa("Amanda::Changer::Error");
+
+ # make a clerk
+ $clerk = Amanda::Recovery::Clerk->new(
+ feedback => main::Feedback->new($chg),
+ scan => $scan);
+
+ # make a plan
+ my $spec = Amanda::Cmdline::dumpspec_t->new(undef, undef, undef, undef, $timestamp);
+ Amanda::Recovery::Planner::make_plan(
+ dumpspecs => [ $spec ],
+ changer => $chg,
+ plan_cb => $steps->{'plan_cb'});
+ };