--- trunk/bin/BackupPC_incPartsUpdate 2005/12/12 13:41:08 253 +++ trunk/bin/BackupPC_incPartsUpdate 2005/12/12 16:07:27 254 @@ -32,7 +32,7 @@ die "can't find $tarIncCreate: $!\n" unless (-x $tarIncCreate); my $bin; -foreach my $c (qw/gzip/) { +foreach my $c (qw/gzip md5sum/) { $bin->{$c} = which($c) || die "$0 needs $c, install it\n"; } @@ -75,29 +75,50 @@ sub tar_check($$$$) { my ($host,$share,$num,$filename) = @_; - return 1; # FIXME - if ($debug) { print STDERR " {{ CHECK: ${host}:${share}#${num} and $filename"; } else { print " check"; } - if (-d $filename) { - print STDERR ", joining"; - tar_join($filename); - } + my @tar_parts; - print STDERR ", opening" if ($debug); - open(my $fh, "gzip -cd $filename |") or die "can't open $filename: $!"; - binmode($fh); - my $tar = Archive::Tar::Streamed->new($fh); + if (-d "$tar_dir/$filename") { + print STDERR " multi-part" if ($opt{d}); + opendir(my $dir, "$tar_dir/$filename") || die "can't readdir $tar_dir/$filename: $!"; + @tar_parts = map { my $p = $_; $p =~ s#^#${filename}/#; $p } grep { !/^\./ && !/md5/ && -f "$tar_dir/$filename/$_" } readdir($dir); + closedir($dir); + } else { + push @tar_parts, "${filename}.tar.gz"; + } - print STDERR ", tar" if ($debug); my @tar_files; - while(my $entry = $tar->next) { - push @tar_files, $entry->name; + + print " [parts: ",join(", ", @tar_parts),"]" if ($opt{d}); + + print " reading"; + + foreach my $tarfilename (@tar_parts) { + + print STDERR " $tarfilename" if ($debug); + + my $path = "$tar_dir/$tarfilename"; + my $md5 = $path; + $md5 =~ s/\.tar\.gz$/.md5/ || die "can't create md5 filename from $md5"; + if (! -e $md5) { + print ", creating md5"; + system( $bin->{md5sum} . " $path > $md5") == 0 or die "can't create md5 $path: $!"; + } + + open(my $fh, "gzip -cd $tar_dir/$tarfilename |") or die "can't open $tar_dir/$tarfilename: $!"; + binmode($fh); + my $tar = Archive::Tar::Streamed->new($fh); + + while(my $entry = $tar->next) { + push @tar_files, $entry->name; + } } + @tar_files = sort @tar_files; print STDERR " ",($#tar_files + 1), " files" if ($debug); @@ -177,7 +198,7 @@ print "# size: $size backup.size: ", $row->{inc_size},"\n" if ($opt{d}); - if ( $row->{'inc_size'} != -1 && $size != -1 && $row->{'inc_size'} == $size && ( $check && tar_check($row->{'host'}, $row->{'share'}, $row->{'num'}, "$tar_dir/$tar_file") || 1) ) { + if ( $row->{'inc_size'} != -1 && $size != -1 && $row->{'inc_size'} == $size && ( $check && tar_check($row->{'host'}, $row->{'share'}, $row->{'num'}, $tar_file) || 1) ) { next; } @@ -187,7 +208,7 @@ my $t = time(); # re-create archive? - my $cmd = qq{ $tarIncCreate -h "$row->{'host'}" -s "$row->{'share'}" -n $row->{'num'} }; + my $cmd = qq{ $tarIncCreate -h "$row->{'host'}" -s "$row->{'share'}" -n $row->{'num'} -f }; print STDERR "## $cmd\n" if ($debug); if (system($cmd) != 0) {