#!@PERL@ -T # # Run perl. eval '(exit $?0)' && eval 'exec @PERL@ -S $0 ${1+"$@"}' & eval 'exec @PERL@ -S $0 $argv:q' if 0; delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV', 'PATH'}; $ENV{'PATH'} = "/usr/bin:/usr/sbin:/sbin:/bin"; $debug=1; push(@INC, ".", "@DUMPER_DIR@"); use File::Copy; use IPC::Open3; use Sys::Hostname; open(DEBUG,">>@AMANDA_DBGDIR@/amgtar.$$.debug") if ($debug==1); $prefix='@prefix@'; $prefix = $prefix; $exec_prefix="@exec_prefix@"; $exec_prefix=$exec_prefix; $libexecdir="@libexecdir@"; $libexecdir=$libexecdir; $USE_VERSION_SUFFIXES='@USE_VERSION_SUFFIXES@'; $suf = ''; if ( $USE_VERSION_SUFFIXES =~ /^yes$/i ) { $suf='-@VERSION@'; } $myhost = hostname; $myhost =~ s/\..*$//; $runtar="${libexecdir}/runtar${suf}"; $gnulist = '@GNUTAR_LISTED_INCREMENTAL_DIR@'; $gnutar = '@GNUTAR@'; $max_level = 9; $index_line = 1; $index_xml = 0; $message_line = 1; $message_xml = 0; $record = 1; $include_file = 1; $include_list = 1; $exclude_file = 1; $exclude_list = 1; $collection = 0; #$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_support { my($config, $host, $disk, $device, $level) = @_; print "CONFIG YES\n"; print DEBUG "STDOUT: CONFIG YES\n" if ($debug == 1); print "HOST YES\n"; print DEBUG "STDOUT: HOST YES\n" if ($debug == 1); print "DISK YES\n"; print DEBUG "STDOUT: DISK YES\n" if ($debug == 1); print "MAX-LEVEL 9\n"; print DEBUG "STDOUT: MAX-LEVEL 9\n" if ($debug == 1); print "INDEX-LINE YES\n"; print DEBUG "STDOUT: INDEX-LINE YES\n" if ($debug == 1); print "INDEX-XML NO\n"; print DEBUG "STDOUT: INDEX-XML NO\n" if ($debug == 1); print "MESSAGE-LINE YES\n"; print DEBUG "STDOUT: MESSAGE-LINE YES\n" if ($debug == 1); print "MESSAGE-XML NO\n"; print DEBUG "STDOUT: MESSAGE-XML NO\n" if ($debug == 1); print "RECORD YES\n"; print DEBUG "STDOUT: RECORD YES\n" if ($debug == 1); print "INCLUDE-FILE YES\n"; print "INCLUDE-LIST YES\n"; print "EXCLUDE-FILE YES\n"; print "EXCLUDE-LIST YES\n"; print "COLLECTION NO\n"; } sub command_selfcheck { my($config, $host, $disk, $device, $level) = @_; print DEBUG "STDOUT: OK $disk\n" if ($debug == 1); print DEBUG "STDOUT: OK $device\n" if ($debug == 1); print "OK $disk\n"; print "OK $device\n"; #check binary #check statefile #check amdevice #check property include/exclude } sub command_estimate { my($config, $host, $disk, $device, $level) = @_; 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; if (-f "${gnulist}/${listdir}_${prev_level}") { copy("${gnulist}/${listdir}_${prev_level}", "${gnulist}/${listdir}_${level}.new"); } else { open(GNULIST, ">${gnulist}/${listdir}_${level}.new") || die(); close(GNULIST) || die(); #print "ERROR file ${gnulist}/${listdir}_${level}.new doesn't exist\n"; } } command_estimate_opt_direct($config, $host, $disk, $device, $level, $listdir); } sub command_estimate_opt_direct { my($config, $host, $disk, $device, $level, $listdir) = @_; my($size) = -1; my(@cmd) = ($runtar, $config, $gnutar, "--create", "--directory", $device, "--listed-incremental", "${gnulist}/${listdir}_${level}.new", "--sparse", "--one-file-system", "--ignore-failed-read", "--totals", "--file", "/dev/null", "."); #my(@cmd) = ($gnutar, "--create", "--directory", $device, "--listed-incremental", "${gnulist}/${listdir}_${level}.new", "--sparse", "--one-file-system", "--ignore-failed-read", "--totals", "--file", "/dev/null", "."); print DEBUG "cmd:" , join(" ", @cmd), "\n" if ($debug == 1); open3(\*WTRFH, '>&STDOUT', \*ESTIMATE, @cmd); $size = parse_estimate(ESTIMATE); close(ESTIMATE); output_size($size); unlink "${gnulist}/${listdir}_${level}.new"; exit 0; } sub parse_estimate { my($fh) = @_; my($size) = -1; while(<$fh>) { print DEBUG "READ 2: $_" if ($debug == 1); if ($_ =~ /^Total bytes written: (\d*)/) { $size = $1; last; } } return $size; } sub output_size { my($size) = @_; if($size == -1) { print DEBUG "STDOUT A: -1 -1\n" if ($debug == 1); print "-1 -1\n"; exit 2; } else { my($ksize) = int $size / (1024); $ksize=32 if ($ksize<32); print DEBUG "STDOUT B: $ksize 1\n" if ($debug == 1); print "$ksize 1\n"; } } sub command_backup { my($config, $host, $disk, $device, $level) = @_; my($listdir) = "$host$disk"; my($verbose) = ""; $listdir =~ s/\//_/g; print DEBUG "config =" . $config . "\n" if ($debug == 1); print DEBUG "host =" . $host . "\n" if ($debug == 1); print DEBUG "disk =" . $disk . "\n" if ($debug == 1); print DEBUG "device =" . $device . "\n" if ($debug == 1); print DEBUG "level =" . $level . "\n" if ($debug == 1); 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(defined($opt_index)) { $verbose = "--verbose"; } my(@cmd) = ($runtar, $config, $gnutar, "--create", $verbose, "--directory", $device, "--listed-incremental", "${gnulist}/${listdir}_${level}.new", "--sparse", "--one-file-system", "--ignore-failed-read", "--totals", "--file", "-", "."); #my(@cmd) = ($gnutar, "--create", $verbose, "--directory", $device, "--listed-incremental", "${gnulist}/${listdir}_${level}.new", "--sparse", "--one-file-system", "--ignore-failed-read", "--totals", "--file", "-", "."); print DEBUG "cmd:" , join(" ", @cmd), "\n" if ($debug == 1); open3(\*WTRFH, '>&STDOUT', \*INDEX, @cmd) || die(); if(defined($opt_index)) { open(INDEXOUT, '>&=3') || die(); parse_backup(INDEX, STDERR, INDEXOUT); close(INDEXOUT); } else { parse_backup(INDEX, STDERR, undef); } close(INDEX); close(WTRFH); if(defined($opt_record)) { rename "${gnulist}/${listdir}_${level}.new", "${gnulist}/${listdir}_${level}"; } else { unlink "${gnulist}/${listdir}_${level}.new"; } exit 0; } sub parse_backup { my($fhin, $fhout, $indexout) = @_; my($size) = -1; while(<$fhin>) { print DEBUG "READ 3: $_" if ($debug == 1); if ( /^\.\//) { if(defined($indexout)) { if(defined($opt_index)) { s/^\.//; print DEBUG "INDEXOUT: $_" if ($debug == 1); print $indexout $_; } } } else { if (/^Total bytes written: (\d*)/) { $size = $1; $ksize = int ($size / 1024); } elsif(defined($fhout)) { next if /: Directory is new$/; print DEBUG "FHOUT 2: $_" if ($debug == 1); print $fhout $_; } } } if(defined($fhout)) { if ($size == -1) { print DEBUG "FHOUT 4: $command -1 -1\n" if ($debug == 1); print $fhout "$command -1 -1\n"; } else { my($ksize) = int ($size/1024); print DEBUG "FHOUT 5: sendbackup: size $ksize\n" if ($debug == 1); print $fhout "sendbackup: size $ksize\n"; print DEBUG "FHOUT 5: sendbackup: end\n" if ($debug == 1); print $fhout "sendbackup: end\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 4: $_" if ($debug == 1); next if /^Total bytes written:/; next if !/^\.\//; s/^\.//; print DEBUG "FHOUT 6: $_" if ($debug == 1); print $fhout $_; } } sub command_index_from_image { my($config, $host, $disk, $device, $level) = @_; open(INDEX, "$gnutar --list --file - |") || die(); index_from_output(INDEX, STDOUT); } sub command_restore { my($config, $host, $disk, $device, $level) = @_; # $ARGV[0] = undef; my(@cmd) = ($gnutar, "--numeric-owner", "-xpGvf", "-"); for($i=1;defined $ARGV[$i]; $i++) { push @cmd, $ARGV[$i]; } print DEBUG "cmd:" , join(" ", @cmd), "\n" if ($debug == 1); exec @cmd; } sub command_print_command { } require "generic-dumper"