lib/SI/dumper.pm
changeset 37 a61b92c60367
parent 28 7d7ca3f05f25
child 38 38af4add892a
equal deleted inserted replaced
36:bdc967bf50d2 37:a61b92c60367
     3 use if $ENV{DEBUG} ~~ /dumper|all/ => "Smart::Comments";
     3 use if $ENV{DEBUG} ~~ /dumper|all/ => "Smart::Comments";
     4 use strict;
     4 use strict;
     5 use warnings;
     5 use warnings;
     6 use SI::tools;
     6 use SI::tools;
     7 use File::Basename;
     7 use File::Basename;
       
     8 use File::Temp qw(tempdir);
       
     9 use File::Find;
     8 
    10 
     9 sub dump($\%) {
    11 sub dump($\%) {
    10     my ($file, $devs) = @_;
    12     my ($file, $devs) = @_;
    11 
    13 
    12     foreach my $volume (
    14     foreach my $volume (
    22         run("dump -0 -z -f $of $dumpdev");
    24         run("dump -0 -z -f $of $dumpdev");
    23         verbose("\n");
    25         verbose("\n");
    24     }
    26     }
    25 }
    27 }
    26 
    28 
       
    29 sub restore($\%) {
       
    30     my @dumps = glob(shift);
       
    31     my $devs = shift;
       
    32 
       
    33     my $tmpdir = tempdir (CLEANUP => 1);
       
    34 
       
    35     foreach my $dump (@dumps) {
       
    36 	# suppose it's gzipped
       
    37 	# find the device
       
    38 	my $dev;
       
    39 	my $base = basename($dump);
       
    40 	find(sub { 
       
    41 	    return if defined $dev;
       
    42 	    if ($_ eq $base) {
       
    43 		$dev = $File::Find::name;
       
    44 		return;
       
    45 	    } }, "/dev");
       
    46 	my $fs = $devs->{volume}{$dev}{type};
       
    47 
       
    48 	verbose("restore $dump -> $dev : $fs\n");
       
    49 	run("mount -t $fs $dev $tmpdir");
       
    50 	my $pid = fork or do {
       
    51 	    open(STDIN, $dump) or die "Can't open $dump as STDIN: $!\n";
       
    52 	    chdir $tmpdir  or die "Can't chdir to $tmpdir: $!\n";
       
    53 	    exec restore => "-orf-";
       
    54 	    die "Can't exec restore: $!\n";
       
    55 	};
       
    56 	waitpid($pid, 0);
       
    57 	run("umount $tmpdir");
       
    58     }
       
    59 }
       
    60 
       
    61 
    27 1;
    62 1;
    28 
    63 
    29 # vim:sts=4 sw=4 aw ai sm:
    64 # vim:sts=4 sw=4 aw ai sm: