use tar file size from gzip -l
authordpavlin <dpavlin@8392b6e1-25fa-0310-8288-cc32f8e212ea>
Wed, 14 Dec 2005 14:57:51 +0000 (14:57 +0000)
committerdpavlin <dpavlin@8392b6e1-25fa-0310-8288-cc32f8e212ea>
Wed, 14 Dec 2005 14:57:51 +0000 (14:57 +0000)
git-svn-id: svn+ssh://llin/home/dpavlin/private/svn/BackupPC/trunk@281 8392b6e1-25fa-0310-8288-cc32f8e212ea

bin/BackupPC_incPartsUpdate

index b7746c2..3971f7e 100755 (executable)
@@ -103,6 +103,30 @@ sub tar_check($$$$) {
        my $t = time();
        print curr_time, " check $host:$share#$num -> $filename";
 
+       # depending on expected returned value this is used like:
+       # my $uncompress_size = get_gzip_size('/full/path/to.gz');
+       # my ($compress_size, $uncompress_size) = get_gzip_size('/path.gz');
+       sub get_gzip_size($) {
+               my $filename = shift;
+               die "file $filename problem: $!" unless (-r $filename);
+               open(my $gzip, $bin->{gzip}." -l $filename |") || die "can't gzip -l $filename: $!";
+               my $line = <$gzip>;
+               chomp($line);
+               $line = <$gzip> if ($line =~ /^\s+compressed/);
+
+               my ($comp, $uncomp) = (0,0);
+
+               if ($line =~ m/^\s+(\d+)\s+(\d+)\s+\d+\.\d+/) {
+                       if (wantarray) {
+                               return [ $1, $2 ];
+                       } else {
+                               return $2;
+                       }
+               } else {
+                       die "can't find size in line: $line";
+               }
+       }
+
        sub check_part {
                my ($host, $share, $num, $part_nr, $tar_size, $size, $md5, $items) = @_;
                my $backup_id = get_backup_id($host, $share, $num);
@@ -165,7 +189,9 @@ sub tar_check($$$$) {
 
                print "\n\t- $tarfilename";
 
-               my $size = (stat( "$tar_dir/$tarfilename" ))[7] || die "can't stat $tar_dir/$tarfilename";
+               my $path = "$tar_dir/$tarfilename";
+
+               my $size = (stat( $path ))[7] || die "can't stat $path: $!";
 
                if ($size > $Conf{MaxArchiveSize}) {
                        print ", part bigger than media $size > $Conf{MaxArchiveSize}\n";
@@ -174,30 +200,31 @@ sub tar_check($$$$) {
 
                print ", $size bytes";
 
-               my $path = "$tar_dir/$tarfilename";
 
-               open(my $fh, "gzip -cd $tar_dir/$tarfilename |") or die "can't open $tar_dir/$tarfilename: $!";
+               open(my $fh, "gzip -cd $path |") or die "can't open $path: $!";
                binmode($fh);
                my $tar = Archive::Tar::Streamed->new($fh);
 
-               my $tar_size = 0;
+               my $tar_size_inarc = 0;
                my $items = 0;
 
                while(my $entry = $tar->next) {
                        push @tar_files, $entry->name;
                        $items++;
-                       $tar_size += $entry->size;
+                       $tar_size_inarc += $entry->size;
 
-                       if ($tar_size > $Conf{MaxArchiveFileSize}) {
-                               print ", part $tarfilename is too big $tar_size > $Conf{MaxArchiveFileSize}\n";
+                       if ($tar_size_inarc > $Conf{MaxArchiveFileSize}) {
+                               print ", part $tarfilename is too big $tar_size_inarc > $Conf{MaxArchiveFileSize}\n";
                                return 0;
                        }
 
                }
 
+               close($fh);
+
                print ", $items items";
 
-               if ($tar_size == 0 && $items == 0) {
+               if ($tar_size_inarc == 0 && $items == 0) {
                        print ", EMPTY tar\n";
 
                        my $backup_id = get_backup_id($host, $share, $num);
@@ -214,9 +241,13 @@ sub tar_check($$$$) {
                        return 1;
                }
 
-               # fix tar_size for tars without any files
-               $tar_size ||= 512 * $items;
+               my $tar_size = get_gzip_size( $path );
 
+               # real tar size is bigger because of padding    
+               if ($tar_size_inarc > $tar_size) {
+                       print ", size of files in tar bigger than whole tar!\n";
+                       return 0;
+               }
 
                #
                # check if md5 exists, and if not, create one