#!@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 () { 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"