Merge branch 'master' into squeeze
[debian/amanda] / server-src / amcleanupdisk.pl
diff --git a/server-src/amcleanupdisk.pl b/server-src/amcleanupdisk.pl
new file mode 100644 (file)
index 0000000..768e7a8
--- /dev/null
@@ -0,0 +1,131 @@
+#!@PERL@
+# Copyright (c) 2008, 2010 Zmanda, Inc.  All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 as published
+# by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# Contact information: Zmanda Inc., 465 S. Mathilda Ave., Suite 300
+# Sunnyvale, CA 94086, USA, or: http://www.zmanda.com
+
+use lib '@amperldir@';
+use strict;
+use warnings;
+
+use Getopt::Long;
+use Amanda::Config qw( :init :getconf config_dir_relative );
+use Amanda::Util qw( :constants );
+use Amanda::Paths;
+use Amanda::Constants;
+use Amanda::Process;
+use Amanda::Logfile;
+use Amanda::Holding;
+use Amanda::Debug qw( debug );
+my $kill_enable=0;
+my $process_alive=0;
+my $verbose=0;
+my $clean_holding=0;
+
+sub usage() {
+    print "Usage: amcleanupdisk [-v] [-r] conf\n";
+    exit 1;
+}
+
+Amanda::Util::setup_application("amcleanupdisk", "server", $CONTEXT_CMDLINE);
+
+my $config_overrides = new_config_overrides($#ARGV+1);
+
+debug("Arguments: " . join(' ', @ARGV));
+Getopt::Long::Configure(qw(bundling));
+GetOptions(
+    'version' => \&Amanda::Util::version_opt,
+    'v' => \$verbose,
+    'r' => \$clean_holding,
+    'help|usage' => \&usage,
+    'o=s' => sub { add_config_override_opt($config_overrides, $_[1]); },
+) or usage();
+
+my $config_name = shift @ARGV or usage;
+
+set_config_overrides($config_overrides);
+config_init($CONFIG_INIT_EXPLICIT_NAME, $config_name);
+my ($cfgerr_level, @cfgerr_errors) = config_errors();
+if ($cfgerr_level >= $CFGERR_WARNINGS) {
+    config_print_errors();
+    if ($cfgerr_level >= $CFGERR_ERRORS) {
+       die("errors processing config file");
+    }
+}
+
+Amanda::Util::finish_setup($RUNNING_AS_DUMPUSER);
+
+my $amcleanupdisk="$amlibexecdir/amcleanupdisk";
+
+if ( ! -e "$CONFIG_DIR/$config_name" ) {
+    die "Configuration directory '$CONFIG_DIR/$config_name' doesn't exist\n";
+}
+if ( ! -d "$CONFIG_DIR/$config_name" ) {
+    die "Configuration directory '$CONFIG_DIR/$config_name' is not a directory\n";
+}
+
+my $stdout;
+open($stdout, ">&STDOUT") if $verbose;;
+my @hfiles = Amanda::Holding::all_files($stdout);
+close $stdout if $verbose;
+@hfiles = Amanda::Holding::merge_all_files(@hfiles);
+while (@hfiles) {
+    my $hfile = pop @hfiles;
+    if ($hfile->{'header'}->{'type'} == $Amanda::Header::F_DUMPFILE) {
+       if ($hfile->{'filename'} =~ /\.tmp$/) {
+           print "Rename tmp holding file: $hfile->{'filename'}\n" if $verbose;
+           Amanda::Holding::rename_tmp($hfile->{'filename'}, 0);
+       } else {
+           # normal holding file
+       }
+    } elsif ($hfile->{'header'}->{'type'} == $Amanda::Header::F_CONT_DUMPFILE) {
+       # orphan cont_dumpfile
+       if ($clean_holding) {
+           print "Remove orphan chunk file: $hfile->{'filename'}\n" if $verbose;
+           unlink $hfile->{'filename'};
+       } else {
+           print "orphan chunk file: $hfile->{'filename'}\n" if $verbose;
+       }
+    } elsif ($hfile->{'header'}->{'type'} == $Amanda::Header::F_EMPTY) {
+       # empty file
+       if ($clean_holding) {
+           print "Remove empty file: $hfile->{'filename'}\n" if $verbose;
+           unlink $hfile->{'filename'};
+       } else {
+           print "empty holding file: $hfile->{'filename'}\n" if $verbose;
+       }
+    } elsif ($hfile->{'header'}->{'type'} == $Amanda::Header::F_WEIRD) {
+       # weird file
+       if ($clean_holding) {
+           print "Remove non amanda file: $hfile->{'filename'}\n" if $verbose;
+           unlink $hfile->{'filename'};
+       } else {
+           print "non amanda holding file: $hfile->{'filename'}\n" if $verbose;
+       }
+    } else {
+       # any other file
+       if ($clean_holding) {
+           print "Remove file: $hfile->{'filename'}\n" if $verbose;
+           unlink $hfile->{'filename'};
+       } else {
+           print "unknown holding file: $hfile->{'filename'}\n" if $verbose;
+       }
+    }
+}
+
+Amanda::Holding::dir_unlink();
+
+Amanda::Util::finish_application();