bin/imager.save
changeset 80 ffde94c51cd4
parent 78 603b47708d37
child 82 ac36dbb9f773
equal deleted inserted replaced
79:4362b3ac6567 80:ffde94c51cd4
    47                 -verbose   => 2,
    47                 -verbose   => 2,
    48                 exit       => 0,
    48                 exit       => 0,
    49                 -noperldoc => system("perldoc -V >/dev/null 2>&1")
    49                 -noperldoc => system("perldoc -V >/dev/null 2>&1")
    50             );
    50             );
    51         },
    51         },
    52         "c|comment=s"  => \$o{comment},
    52         "c|comment=s"   => \$o{comment},
    53         "z|compress:i" => sub { $o{compress} = $_[1] ? $_[1] : Z_BEST_SPEED },
    53         "z|compress:i"  => sub { $o{compress} = $_[1] ? $_[1] : Z_BEST_SPEED },
    54         "p|pass=s"      => \$o{pass},
    54         "p|pass=s"      => \$o{pass},
    55         "b|blocksize=s" => sub {
    55         "b|blocksize=s" => sub {
    56             given ($_[1]) {
    56             given ($_[1]) {
    57                 when (/(\d+)G/i) { $o{blocksize} = $1 * GiB };
    57                 when (/(\d+)G/i) { $o{blocksize} = $1 * GiB };
    58                 when (/(\d+)M/i) { $o{blocksize} = $1 * MiB };
    58                 when (/(\d+)M/i) { $o{blocksize} = $1 * MiB };
    77         }
    77         }
    78         save($src, $dst);
    78         save($src, $dst);
    79         exit;
    79         exit;
    80     }
    80     }
    81 
    81 
    82     do 1 while wait != -1;
    82     my $rc = 0;
       
    83     while (wait != -1) {
       
    84 	$rc = ($? >> 8) if ($? >> 8) > $rc;
       
    85     }
       
    86     exit $rc;
    83 
    87 
    84 }
    88 }
    85 
    89 
    86 sub save {
    90 sub save {
    87     my ($src, $dst) = @_;
    91     my ($src, $dst) = @_;
    89     my $data = "{DIR}/data";
    93     my $data = "{DIR}/data";
    90     my $info = "{DIR}/data/info";
    94     my $info = "{DIR}/data/info";
    91     my ($size, $name);
    95     my ($size, $name);
    92 
    96 
    93     if ($src =~ /(?<dev>.+?):(?<name>.+)/) {
    97     if ($src =~ /(?<dev>.+?):(?<name>.+)/) {
    94 	$src = $+{dev};
    98         $src  = $+{dev};
    95 	$name = $+{name};
    99         $name = $+{name};
    96     }
   100     }
    97     else { $name = $src };
   101     else { $name = $src }
    98 
   102 
    99     foreach ($idx, $data, $info) {
   103     foreach ($idx, $data, $info) {
   100         s/{DIR}/$dst/g;
   104         s/{DIR}/$dst/g;
   101         s/{HOSTNAME}/hostname/eg;
   105         s/{HOSTNAME}/hostname/eg;
   102         s/{DEVICE}/$name/g;
   106         s/{DEVICE}/$name/g;
   142           length($stats{todo}) => $stats{skipped};
   146           length($stats{todo}) => $stats{skipped};
   143         alarm(5);
   147         alarm(5);
   144     };
   148     };
   145     $SIG{ALRM}->();
   149     $SIG{ALRM}->();
   146 
   150 
   147     for (my $blknr = 0; sysread($in => my $buffer, $o{blocksize}) > 0; ++$blknr) {
   151     for (
   148 	
   152         my $blknr = 0 ;
       
   153         sysread($in => my $buffer, $o{blocksize}) > 0 ;
       
   154         ++$blknr
       
   155       )
       
   156     {
       
   157 
   149         my ($file, $ext, $cs);
   158         my ($file, $ext, $cs);
   150         $file = $cs = md5_hex($buffer);
   159         $file = $cs = md5_hex($buffer);
   151         $file =~ s/(?<fn>(?<prefix>...).*)/$+{prefix}\/$+{fn}/g;
   160         $file =~ s/(?<fn>(?<prefix>...).*)/$+{prefix}\/$+{fn}/g;
   152         $ext .= $o{pass}     ? ".x"  : "";
   161         $ext .= $o{pass} ? ".x" : "";
   153 
   162 
   154         # the extension we do not put into the index
   163         # the extension we do not put into the index
   155         push @{ $index{BLOCKS} }, sprintf "%12d %s %s" => $blknr,
   164         push @{ $index{BLOCKS} }, sprintf "%12d %s %s" => $blknr,
   156           $cs,                    $file;
   165           $cs,                    $file;
   157 
   166 
   165             if ($o{pass}) {
   174             if ($o{pass}) {
   166                 open($out, "|openssl @{[CIPHER]} -pass $o{pass} -out $out");
   175                 open($out, "|openssl @{[CIPHER]} -pass $o{pass} -out $out");
   167             }
   176             }
   168             binmode($out);
   177             binmode($out);
   169 
   178 
   170             if ($o{compress}) {
   179            
   171 		my $zbuffer;
   180                 my $bufref = \$buffer;
   172                 gzip(
   181                 if ($o{compress}) {
   173                     \$buffer  => \$zbuffer,
   182                     my $zbuffer;
   174                     -Minimal  => 1,
   183                     gzip(
   175                     -Level    => Z_BEST_SPEED,
   184                         \$buffer  => \$zbuffer,
   176                     -Strategy => Z_FILTERED
   185                         -Minimal  => 1,
   177                 ) or die $GzipError;
   186                         -Level    => Z_BEST_SPEED,
   178 		if (length($zbuffer)/length($buffer) < 0.9) {
   187                         -Strategy => Z_FILTERED
   179 		    $buffer = $zbuffer;
   188                     ) or die $GzipError;
   180 		    $ext = ".gz$ext";
   189                     if (length($zbuffer) / length($buffer) < 0.9) {
   181 		}
   190                         $bufref = \$zbuffer;
   182             }
   191                         $ext    = ".gz$ext";
   183 
   192                     }
   184             syswrite $out => $buffer;
   193                 }
   185             close($out);
   194 
       
   195 		#for(my $todo = length $$bufref;
       
   196 		#    $todo -= syswrite $out => $$bufref, $todo, -$todo; 1)
       
   197 		#{
       
   198 		#}
       
   199 		syswrite $out => $$bufref;
       
   200             
       
   201             close($out) or die $!;
   186             rename($out => "$data/$file$ext");
   202             rename($out => "$data/$file$ext");
   187             $index{BLOCKS}[$blknr] .= " *";
   203             $index{BLOCKS}[$blknr] .= " *";
   188             $stats{written}++;
   204             $stats{written}++;
   189         }
   205         }
   190         else {
   206         else {