|
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;
|