--- /dev/null
+#!@PERL@
+#
+
+# Run perl.
+eval '(exit $?0)' && eval 'exec @PERL@ -S $0 ${1+"$@"}'
+ & eval 'exec @PERL@ -S $0 $argv:q'
+ if 0;
+
+$debug=1;
+push(@INC, "@DUMPER_DIR@");
+
+use File::Copy;
+use IPC::Open3;
+use Sys::Hostname;
+
+
+open(DEBUG,">>@AMANDA_DBGDIR@/gnutar.$$.debug") if ($debug==1);
+
+$prefix='@prefix@';
+$exec_prefix="@exec_prefix@";
+$libexecdir="@libexecdir@";
+$USE_VERSION_SUFFIXES='@USE_VERSION_SUFFIXES@';
+$suf = '';
+if ( $USE_VERSION_SUFFIXES =~ /^yes$/i ) {
+ $suf='-@VERSION@';
+}
+
+$host = hostname;
+$host =~ s/\..*$//;
+$runtar="${libexecdir}/runtar${suf}";
+$gnulist = '@GNUTAR_LISTED_INCREMENTAL_DIR@';
+$gnutar = $runtar;
+
+
+
+$level_incrementals = 9;
+
+@index_generation = ("direct","parse","output","image");
+@parse_estimate = ("direct","parse");
+@parse_backup = ("direct","parse");
+@backup_type = ("full","level","diff");
+
+
+#$user_support = "";
+#$group_support = "";
+
+#$user_selfcheck = "";
+#$group_selfcheck = "";
+
+#$user_estimate = "";
+#$group_estimate = "";
+
+#$user_estimate_parse = "";
+#$group_estimate_parse = "";
+
+$user_backup = "root";
+#$group_backup = "";
+
+#$user_backup_parse = "";
+#$group_backup_parse = "";
+
+#$user_index_from_output = "";
+#$group_index_from_output = "";
+
+#$user_index_from_image = "";
+#$group_index_from_image = "";
+
+#$user_restore = "";
+#$group_restore = "";
+
+#$user_print_command = "";
+#$group_print_command = "";
+
+$user_default = "amanda";
+$group_default = "amanda";
+
+
+sub command_selfcheck {
+print DEBUG "STDOUT: OK selfcheck\n" if ($debug == 1);
+ print "OK selfcheck\n";
+}
+
+sub command_estimate_full {
+ my($disk) = @_;
+ command_estimate_level(0, $disk);
+}
+
+sub command_estimate_level {
+ my($level, $disk) = @_;
+ my($listdir) = "$host$disk";
+ $listdir =~ s/\//_/g;
+ if($level == 0) {
+ open(GNULIST, ">${gnulist}/${listdir}_${level}.new") || die();
+ close(GNULIST) || die();
+ }
+ else {
+ my($prev_level) = $level - 1;
+ copy("${gnulist}/${listdir}_${prev_level}", "${gnulist}/${listdir}_${level}.new");
+ }
+ if($option_estimate_direct == 1) {
+ command_estimate_opt_direct($disk, $level, $listdir);
+ }
+ else {
+ command_estimate_opt_parse($disk, $level, $listdir);
+ }
+}
+
+#sub command_estimate_diff {
+#}
+
+sub command_estimate_opt_direct {
+ my($disk, $level, $listdir) = @_;
+ my($size) = -1;
+print DEBUG "$gnutar --create --directory $disk --listed-incremental ${gnulist}/${listdir}_${level}.new --sparse --one-file-system --ignore-failed-read --totals --file /dev/null .\n" if ($debug == 1);
+ open3(\*WTRFH, '>&STDOUT', \*ESTIMATE, "$gnutar --create --directory $disk --listed-incremental ${gnulist}/${listdir}_${level}.new --sparse --one-file-system --ignore-failed-read --totals --file /dev/null .") || die();
+
+ $size = parse_estimate(ESTIMATE);
+ close(ESTIMATE);
+ output_size($size);
+ unlink "${gnulist}/${listdir}_${level}.new";
+ exit 0;
+}
+
+sub command_estimate_opt_parse {
+ my($disk, $level, $listdir) = @_;
+
+ open3(\*WTRFH, '>&STDOUT',\*ESTIMATE,"$gnutar --create --directory $disk --listed-incremental ${gnulist}/${listdir}_${level}.new --sparse --one-file-system --ignore-failed-read --totals --file /dev/null .");
+
+ while (<ESTIMATE>) {
+print DEBUG "READ: $_" if ($debug == 1);
+print DEBUG "STDOUT: $_" if ($debug == 1);
+ print $_;
+ }
+ close(ESTIMATE);
+ close(WTRFH);
+
+ unlink "${gnulist}/${listdir}_${level}.new";
+}
+
+sub command_estimate_parse {
+ my($size) = parse_estimate(STDIN);
+ output_size($size);
+ exit 0;
+}
+
+sub parse_estimate {
+ my($fh) = @_;
+ my($size) = -1;
+ while(<$fh>) {
+print DEBUG "READ: $_" if ($debug == 1);
+ if ($_ =~ /^Total bytes written: (\d*)$/) {
+ $size = $1;
+ last;
+ }
+ }
+ return $size;
+}
+
+sub output_size {
+ my($size) = @_;
+ if($size == -1) {
+print DEBUG "STDOUT: -1 -1\n" if ($debug == 1);
+ print "-1 -1\n";
+ exit 2;
+ }
+ else {
+ my($ksize) = $size / 1024;
+print DEBUG "STDOUT: $ksize 1024\n" if ($debug == 1);
+ print "$ksize 1024\n";
+ }
+}
+
+sub command_backup_full {
+ my($disk) = @_;
+ command_backup_level(0, $disk);
+}
+
+sub command_backup_level {
+ my($level, $disk) = @_;
+ my($listdir) = "$host$disk";
+ my($verbose) = "";
+ $listdir =~ s/\//_/g;
+
+ if($level == 0) {
+ open(GNULIST, ">${gnulist}/${listdir}_${level}.new") || die();
+ close(GNULIST) || die();
+ }
+ else {
+ my($prev_level) = $level - 1;
+ copy("${gnulist}/${listdir}_${prev_level}",
+ "${gnulist}/${listdir}_${level}.new");
+ }
+
+ if($option_index_direct == 1 || $option_index_parse == 1) {
+ $verbose = "--verbose";
+ }
+ my($cmd) = "$gnutar --create $verbose --directory $disk --listed-incremental ${gnulist}/${listdir}_${level}.new --sparse --one-file-system --ignore-failed-read --totals --file - .";
+
+ if($option_backup_parse == 1 && $option_index_direct == 0 &&
+ $option_index_parse == 0) {
+ system($cmd);
+ }
+ else {
+ open3(\*WTRFH, '>&STDOUT', \*INDEX, $cmd) || die();
+
+ if($option_index_direct == 1 || $option_index_parse == 1) {
+ open(INDEXOUT, '>&=3') || die();
+ parse_backup(INDEX, STDERR, INDEXOUT);
+ close(INDEXOUT);
+ }
+ else {
+ parse_backup(INDEX, STDERR, undef);
+ }
+ close(INDEX);
+ close(WTRFH);
+ }
+
+ if(!defined($option_no_record)) {
+ rename "${gnulist}/${listdir}_${level}.new",
+ "${gnulist}/${listdir}_${level}";
+ }
+ else {
+ unlink "${gnulist}/${listdir}_${level}.new";
+ }
+ exit 0;
+}
+
+#sub command_backup_diff {
+#}
+
+sub command_backup_parse {
+ $option_backup_direct = 1;
+ $option_backup_parse = 0;
+ parse_backup(STDIN, STDOUT, undef);
+ exit 0;
+}
+
+sub parse_backup {
+ my($fhin, $fhout, $indexout) = @_;
+ my($size) = -1;
+ while(<$fhin>) {
+print DEBUG "READ: $_" if ($debug == 1);
+ if ( /^\.\//) {
+ if(defined($indexout)) {
+ if($option_index_direct == 1) {
+ s/^\.//;
+print DEBUG "INDEXOUT: $_" if ($debug == 1);
+ print $indexout $_;
+ }
+ elsif($option_index_parse == 1) {
+print DEBUG "INDEXOUT: $_" if ($debug == 1);
+ print $indexout $_;
+ }
+ }
+ }
+ else {
+ if (/^Total bytes written: (\d*)$/) {
+ $size = $1;
+ if(defined($fhout) && $option_backup_parse == 1) {
+print DEBUG "FHOUT: $_" if ($debug == 1);
+ print $fhout $_;
+ }
+ }
+ elsif(defined($fhout)) {
+ if($option_backup_direct == 1) {
+print DEBUG "FHOUT: $_" if ($debug == 1);
+ print $fhout $_;
+ }
+ elsif($option_backup_parse == 1) {
+print DEBUG "FHOUT: $_" if ($debug == 1);
+ print $fhout $_;
+ }
+ }
+ }
+ }
+ if(defined($fhout) && $option_backup_direct == 1) {
+ if ($size == -1) {
+print DEBUG "FHOUT: $command -1 -1\n" if ($debug == 1);
+ print $fhout "$command -1 -1\n";
+ }
+ else {
+ my($ksize) = $size/1024;
+print DEBUG "FHOUT: $ksize 1024\n" if ($debug == 1);
+ print $fhout "$ksize 1024\n";
+ }
+ }
+}
+
+sub command_index_from_output {
+ index_from_output(STDIN, STDOUT);
+ exit 0;
+}
+
+sub index_from_output {
+ my($fhin, $fhout) = @_;
+ my($size) = -1;
+ while(<$fhin>) {
+print DEBUG "READ: $_" if ($debug == 1);
+ next if /^Total bytes written:/;
+ next if !/^\.\//;
+ s/^\.//;
+print DEBUG "FHOUT: $_" if ($debug == 1);
+ print $fhout $_;
+ }
+}
+
+sub command_index_from_image {
+ open(INDEX, "$gnutar --list --file - |") || die();
+ index_from_output(INDEX, STDOUT);
+}
+
+#sub command_restore {
+#}
+
+sub command_print_command {
+}
+
+require "generic-dumper"