bin/imager.save
changeset 118 8c2cc26d45fc
parent 109 d199ec625af0
child 125 41872269ca6f
equal deleted inserted replaced
117:136d6b9b5a67 118:8c2cc26d45fc
    14 use Hash::Util qw(lock_keys);
    14 use Hash::Util qw(lock_keys);
    15 use Getopt::Long;
    15 use Getopt::Long;
    16 use Pod::Usage;
    16 use Pod::Usage;
    17 use Imager 0.1;
    17 use Imager 0.1;
    18 
    18 
    19 use constant KiB      => 1024;
    19 use constant KiB     => 1024;
    20 use constant MiB      => 1024 * KiB;
    20 use constant MiB     => 1024 * KiB;
    21 use constant GiB      => 1024 * MiB;
    21 use constant GiB     => 1024 * MiB;
    22 use constant BS       => 4 * MiB;
    22 use constant BS      => 4 * MiB;
    23 use constant DATEFMT  => "%Y-%m-%dT%H:%M:%SZ";
    23 use constant DATEFMT => "%Y-%m-%dT%H:%M:%SZ";
    24 use constant CIPHER   => "aes-128-cbc";
    24 use constant CIPHER  => "aes-128-cbc";
    25 
    25 
    26 sub get_devsize;
    26 sub get_devsize;
    27 sub get_devname;
    27 sub get_devname;
    28 sub save;
    28 sub save;
    29 
       
    30 
    29 
    31 $SIG{INT} = sub { die "Got INT\n" };
    30 $SIG{INT} = sub { die "Got INT\n" };
    32 
    31 
    33 my %o = (
    32 my %o = (
    34     compress  => undef,
    33     compress  => undef,
    51             );
    50             );
    52         },
    51         },
    53         "c|comment=s"   => \$o{comment},
    52         "c|comment=s"   => \$o{comment},
    54         "z|compress:i"  => sub { $o{compress} = $_[1] ? $_[1] : Z_BEST_SPEED },
    53         "z|compress:i"  => sub { $o{compress} = $_[1] ? $_[1] : Z_BEST_SPEED },
    55         "p|pass=s"      => \$o{pass},
    54         "p|pass=s"      => \$o{pass},
    56 	"now=i"		=> \$o{now},
    55         "now=i"         => \$o{now},
    57         "b|blocksize=s" => sub {
    56         "b|blocksize=s" => sub {
    58             given ($_[1]) {
    57             given ($_[1]) {
    59                 when (/(\d+)G/i) { $o{blocksize} = $1 * GiB };
    58                 when (/(\d+)G/i) { $o{blocksize} = $1 * GiB };
    60                 when (/(\d+)M/i) { $o{blocksize} = $1 * MiB };
    59                 when (/(\d+)M/i) { $o{blocksize} = $1 * MiB };
    61                 when (/(\d+)K/i) { $o{blocksize} = $1 * KiB };
    60                 when (/(\d+)K/i) { $o{blocksize} = $1 * KiB };
    81         exit;
    80         exit;
    82     }
    81     }
    83 
    82 
    84     my $rc = 0;
    83     my $rc = 0;
    85     while (wait != -1) {
    84     while (wait != -1) {
    86 	$rc = ($? >> 8) if ($? >> 8) > $rc;
    85         $rc = ($? >> 8) if ($? >> 8) > $rc;
    87     }
    86     }
    88     exit $rc;
    87     exit $rc;
    89 
    88 
    90 }
    89 }
    91 
    90 
   176             if ($o{pass}) {
   175             if ($o{pass}) {
   177                 open($out, "|openssl @{[CIPHER]} -pass $o{pass} -out $out");
   176                 open($out, "|openssl @{[CIPHER]} -pass $o{pass} -out $out");
   178             }
   177             }
   179             binmode($out);
   178             binmode($out);
   180 
   179 
   181            
   180             my $bufref = \$buffer;
   182                 my $bufref = \$buffer;
   181             if ($o{compress}) {
   183                 if ($o{compress}) {
   182                 my $zbuffer;
   184                     my $zbuffer;
   183                 gzip(
   185                     gzip(
   184                     \$buffer  => \$zbuffer,
   186                         \$buffer  => \$zbuffer,
   185                     -Minimal  => 1,
   187                         -Minimal  => 1,
   186                     -Level    => Z_BEST_SPEED,
   188                         -Level    => Z_BEST_SPEED,
   187                     -Strategy => Z_FILTERED
   189                         -Strategy => Z_FILTERED
   188                 ) or die $GzipError;
   190                     ) or die $GzipError;
   189                 if (length($zbuffer) / length($buffer) < 0.9) {
   191                     if (length($zbuffer) / length($buffer) < 0.9) {
   190                     $bufref = \$zbuffer;
   192                         $bufref = \$zbuffer;
   191                     $ext    = ".gz$ext";
   193                         $ext    = ".gz$ext";
       
   194                     }
       
   195                 }
   192                 }
   196 
   193             }
   197 		#for(my $todo = length $$bufref;
   194 
   198 		#    $todo -= syswrite $out => $$bufref, $todo, -$todo; 1)
   195             #for(my $todo = length $$bufref;
   199 		#{
   196             #    $todo -= syswrite $out => $$bufref, $todo, -$todo; 1)
   200 		#}
   197             #{
   201 		syswrite $out => $$bufref;
   198             #}
   202             
   199             syswrite $out => $$bufref or die "$0: write: $!\n";
   203             close($out) or die $!;
   200             close($out) or die "$0: close output file: $!";
       
   201 
   204             rename($out => "$data/$file$ext");
   202             rename($out => "$data/$file$ext");
   205             $index{BLOCKS}[$blknr] .= " *";
   203             $index{BLOCKS}[$blknr] .= " *";
   206             $stats{written}++;
   204             $stats{written}++;
   207         }
   205         }
   208         else {
   206         else {