Blame server-src/amrmtape.pl

Packit 23ab03
#!@PERL@
Packit 23ab03
#
Packit 23ab03
# Copyright (c) 2008-2012 Zmanda, Inc.  All Rights Reserved.
Packit 23ab03
# Copyright (c) 2013-2016 Carbonite, Inc.  All Rights Reserved.
Packit 23ab03
#
Packit 23ab03
# This program is free software; you can redistribute it and/or
Packit 23ab03
# modify it under the terms of the GNU General Public License
Packit 23ab03
# as published by the Free Software Foundation; either version 2
Packit 23ab03
# of the License, or (at your option) any later version.
Packit 23ab03
#
Packit 23ab03
# This program is distributed in the hope that it will be useful, but
Packit 23ab03
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
Packit 23ab03
# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
Packit 23ab03
# for more details.
Packit 23ab03
#
Packit 23ab03
# You should have received a copy of the GNU General Public License along
Packit 23ab03
# with this program; if not, write to the Free Software Foundation, Inc.,
Packit 23ab03
# 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
Packit 23ab03
#
Packit 23ab03
# Contact information: Carbonite Inc., 756 N Pastoria Ave
Packit 23ab03
# Sunnyvale, CA 94086, USA, or: http://www.zmanda.com
Packit 23ab03
#
Packit 23ab03
use lib '@amperldir@';
Packit 23ab03
use strict;
Packit 23ab03
use warnings;
Packit 23ab03
Packit 23ab03
use Amanda::Config qw( :init :getconf config_print_errors
Packit 23ab03
  config_dir_relative new_config_overrides add_config_override);
Packit 23ab03
use Amanda::Storage;
Packit 23ab03
use Amanda::Changer;
Packit 23ab03
use Amanda::Device qw( :constants );
Packit 23ab03
use Amanda::Debug qw( :logging );
Packit 23ab03
use Amanda::Disklist;
Packit 23ab03
use Amanda::Paths;
Packit 23ab03
use Amanda::MainLoop;
Packit 23ab03
use Amanda::Tapelist;
Packit 23ab03
use Amanda::Util qw( :constants );
Packit 23ab03
use Amanda::Label;
Packit 23ab03
use File::Copy;
Packit 23ab03
use File::Basename;
Packit 23ab03
use Getopt::Long;
Packit 23ab03
Packit 23ab03
my $amadmin = "$sbindir/amadmin";
Packit 23ab03
my $amtrmidx = "$amlibexecdir/amtrmidx";
Packit 23ab03
my $amtrmlog = "$amlibexecdir/amtrmlog";
Packit 23ab03
Packit 23ab03
my $dry_run;
Packit 23ab03
my $cleanup;
Packit 23ab03
my $erase;
Packit 23ab03
my $keep_label;
Packit 23ab03
my $external_copy;
Packit 23ab03
my $verbose = 1;
Packit 23ab03
my $help;
Packit 23ab03
my $list_retention;
Packit 23ab03
my $list_no_retention;
Packit 23ab03
my $remove_no_retention;
Packit 23ab03
Packit 23ab03
sub usage() {
Packit 23ab03
    print <
Packit 23ab03
$0 [-n] [-v] [-q] [-d] [config-overwrites] <config> [label]*
Packit 23ab03
\t--changer changer-name
Packit 23ab03
\t\tSpecify the name of the changer to use (for --erase).
Packit 23ab03
\t--cleanup
Packit 23ab03
\t\tRemove indexes and logs immediately
Packit 23ab03
\t-n, --dryrun
Packit 23ab03
\t\tDo nothing to original files, leave new ones in database directory.
Packit 23ab03
\t--erase
Packit 23ab03
\t\tErase the media, if possible
Packit 23ab03
\t-h, --help
Packit 23ab03
\t\tDisplay this message.
Packit 23ab03
\t--keep-label
Packit 23ab03
\t\tDo not remove label from the tapelist
Packit 23ab03
\t--external-copy
Packit 23ab03
\t\tErase the volume, keep it in tapelist and log
Packit 23ab03
\t\tAssume an external copy fo the volume was done
Packit 23ab03
\t--list-retention
Packit 23ab03
\t\tList all labels require to satisfy the policy of each storage.
Packit 23ab03
\t--list-no-retention
Packit 23ab03
\t\tList all labels not require to satisfy the policy of each storage.
Packit 23ab03
\t--remove-no-retention
Packit 23ab03
\t\tRemove all labels not require to satisfy the policy of each storage.
Packit 23ab03
\t-q, --quiet
Packit 23ab03
\t\tQuiet, opposite of -v.
Packit 23ab03
\t-v, --verbose
Packit 23ab03
\t\tVerbose, list backups of hosts and disks that are being discarded.
Packit 23ab03
Packit 23ab03
This program allows you to invalidate the contents of an existing
Packit 23ab03
backup tape within the Amanda current tape database.  This is meant as
Packit 23ab03
a recovery mecanism for when a good backup is damaged either by faulty
Packit 23ab03
hardware or user error, i.e. the tape is eaten by the tape drive, or
Packit 23ab03
the tape has been overwritten.
Packit 23ab03
EOF
Packit 23ab03
}
Packit 23ab03
Packit 23ab03
sub vlog(@) {
Packit 23ab03
    foreach my $msg (@_) {
Packit 23ab03
        message($msg);
Packit 23ab03
        print "$0: $msg\n" if $verbose;
Packit 23ab03
    }
Packit 23ab03
}
Packit 23ab03
Packit 23ab03
Amanda::Util::setup_application("amrmtape", "server", $CONTEXT_CMDLINE, "amanda", "amanda");
Packit 23ab03
Packit 23ab03
my $config_overrides = new_config_overrides( scalar(@ARGV) + 1 );
Packit 23ab03
Packit 23ab03
debug("Arguments: " . join(' ', @ARGV));
Packit 23ab03
Getopt::Long::Configure(qw{ bundling });
Packit 23ab03
my $opts_ok = GetOptions(
Packit 23ab03
    'version' => \&Amanda::Util::version_opt,
Packit 23ab03
    "changer=s" => sub { add_config_override_opt( $config_overrides, "-otpchanger=".$_[1] ); },
Packit 23ab03
    "cleanup" => \$cleanup,
Packit 23ab03
    "dryrun|n" => \$dry_run,
Packit 23ab03
    "erase" => \$erase,
Packit 23ab03
    "help|h" => \$help,
Packit 23ab03
    "keep-label" => \$keep_label,
Packit 23ab03
    "external-copy" => \$external_copy,
Packit 23ab03
    "list-retention" => \$list_retention,
Packit 23ab03
    "list-no-retention" => \$list_no_retention,
Packit 23ab03
    "remove-no-retention" => \$remove_no_retention,
Packit 23ab03
    'o=s' => sub { add_config_override_opt( $config_overrides, $_[1] ); },
Packit 23ab03
    "quiet|q" => sub { undef $verbose; },
Packit 23ab03
    "verbose|v" => \$verbose,
Packit 23ab03
);
Packit 23ab03
Packit 23ab03
if (!$opts_ok) {
Packit 23ab03
    usage();
Packit 23ab03
    exit 1;
Packit 23ab03
}
Packit 23ab03
Packit 23ab03
if ($help) {
Packit 23ab03
    usage();
Packit 23ab03
    exit 0;
Packit 23ab03
}
Packit 23ab03
Packit 23ab03
if(scalar(@ARGV) <= 0) {
Packit 23ab03
    print STDERR "Specify a configuration.\n";
Packit 23ab03
    usage();
Packit 23ab03
    exit 1;
Packit 23ab03
}
Packit 23ab03
Packit 23ab03
if ((!$list_retention && !$list_no_retention && !$remove_no_retention) &&
Packit 23ab03
     scalar(@ARGV) == 1) {
Packit 23ab03
    print STDERR "Specify a configuration and label.\n";
Packit 23ab03
    usage();
Packit 23ab03
    exit 1;
Packit 23ab03
}
Packit 23ab03
Packit 23ab03
my ($config_name, @label) = @ARGV;
Packit 23ab03
Packit 23ab03
set_config_overrides($config_overrides);
Packit 23ab03
my $cfg_ok = config_init_with_global( $CONFIG_INIT_EXPLICIT_NAME, $config_name );
Packit 23ab03
Packit 23ab03
my ($cfgerr_level, @cfgerr_errors) = config_errors();
Packit 23ab03
if ($cfgerr_level >= $CFGERR_WARNINGS) {
Packit 23ab03
    config_print_errors();
Packit 23ab03
    if ($cfgerr_level >= $CFGERR_ERRORS) {
Packit 23ab03
        die "Errors processing config file";
Packit 23ab03
    }
Packit 23ab03
}
Packit 23ab03
Packit 23ab03
Amanda::Util::finish_setup($RUNNING_AS_DUMPUSER);
Packit 23ab03
Packit 23ab03
sub user_msg {
Packit 23ab03
    my $msg = shift;
Packit 23ab03
Packit 23ab03
    print STDOUT $msg->message() . "\n";
Packit 23ab03
}
Packit 23ab03
Packit 23ab03
sub main {
Packit 23ab03
    my ($finished_cb) = @_;
Packit 23ab03
Packit 23ab03
    my $steps = define_steps
Packit 23ab03
	cb_ref => \$finished_cb;
Packit 23ab03
Packit 23ab03
    step start => sub {
Packit 23ab03
	# amadmin may later try to load this and will die if it has errors
Packit 23ab03
	# load it now to catch the problem sooner (before we might erase data)
Packit 23ab03
	my $diskfile = config_dir_relative(getconf($CNF_DISKFILE));
Packit 23ab03
	$cfgerr_level = Amanda::Disklist::read_disklist('filename' => $diskfile);
Packit 23ab03
	if ($cfgerr_level >= $CFGERR_ERRORS) {
Packit 23ab03
	    die "Errors processing disklist";
Packit 23ab03
	}
Packit 23ab03
Packit 23ab03
	my $tapelist_file = config_dir_relative(getconf($CNF_TAPELIST));
Packit 23ab03
	my ($tapelist, $message) = Amanda::Tapelist->new($tapelist_file, !$dry_run);
Packit 23ab03
	if (defined $message) {
Packit 23ab03
	    die "Could not read the tapelist: $message";
Packit 23ab03
	}
Packit 23ab03
	unless ($tapelist) {
Packit 23ab03
	    die "Could not read the tapelist";
Packit 23ab03
	}
Packit 23ab03
Packit 23ab03
	if ($list_retention) {
Packit 23ab03
	    my @list = Amanda::Tapelist::list_retention();
Packit 23ab03
	    foreach my $label (@list) {
Packit 23ab03
		print "$label\n";
Packit 23ab03
	    }
Packit 23ab03
	} elsif ($list_no_retention) {
Packit 23ab03
	    my @list = Amanda::Tapelist::list_no_retention();
Packit 23ab03
	    foreach my $label (@list) {
Packit 23ab03
		print "$label\n";
Packit 23ab03
	    }
Packit 23ab03
	} else {
Packit 23ab03
	    my @list;
Packit 23ab03
	    if ($remove_no_retention) {
Packit 23ab03
		@list = Amanda::Tapelist::list_no_retention();
Packit 23ab03
	    } else {
Packit 23ab03
		@list = @label;
Packit 23ab03
	    }
Packit 23ab03
	    my $Label = Amanda::Label->new(tapelist => $tapelist,
Packit 23ab03
					   user_msg => \&user_msg);
Packit 23ab03
Packit 23ab03
	    return $Label->erase(labels        => \@list,
Packit 23ab03
				 cleanup       => $cleanup,
Packit 23ab03
				 dry_run       => $dry_run,
Packit 23ab03
				 erase         => $erase,
Packit 23ab03
				 keep_label    => $keep_label,
Packit 23ab03
				 external_copy => $external_copy,
Packit 23ab03
				 finished_cb   => $steps->{'erase_finished'});
Packit 23ab03
	}
Packit 23ab03
	$finished_cb->();
Packit 23ab03
    };
Packit 23ab03
Packit 23ab03
    step erase_finished => sub {
Packit 23ab03
	my ($err) = @_;
Packit 23ab03
Packit 23ab03
        print STDERR "$err\n" if $err;
Packit 23ab03
Packit 23ab03
        $finished_cb->();
Packit 23ab03
    };
Packit 23ab03
}
Packit 23ab03
Packit 23ab03
main(\&Amanda::MainLoop::quit);
Packit 23ab03
Amanda::MainLoop::run();
Packit 23ab03
Amanda::Util::finish_application();
Packit 23ab03
#exit $exit_status;