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