Imported Upstream version 2.5.0
[debian/amanda] / dumper-src / gnutar.pl.in
diff --git a/dumper-src/gnutar.pl.in b/dumper-src/gnutar.pl.in
new file mode 100644 (file)
index 0000000..b5c7e6a
--- /dev/null
@@ -0,0 +1,318 @@
+#!@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"