lib/SI/dumper.pm
changeset 41 24d57a2e8df7
parent 39 06bffc9d8977
equal deleted inserted replaced
37:a61b92c60367 41:24d57a2e8df7
     8 use File::Temp qw(tempdir);
     8 use File::Temp qw(tempdir);
     9 use File::Find;
     9 use File::Find;
    10 
    10 
    11 sub dump($\%) {
    11 sub dump($\%) {
    12     my ($file, $devs) = @_;
    12     my ($file, $devs) = @_;
       
    13     my $dumpdates = dirname($file) . "/dumpdates";
    13 
    14 
    14     foreach my $volume (
    15     foreach my $volume (
    15         map { { name => $_, %{ $devs->{volume}{$_} } } }
    16         map { { name => $_, %{ $devs->{volume}{$_} } } }
    16         keys %{ $devs->{volume} }
    17         keys %{ $devs->{volume} }
    17       )
    18       )
    19         next if !defined $volume->{type} or $volume->{type} !~ /^ext/i;
    20         next if !defined $volume->{type} or $volume->{type} !~ /^ext/i;
    20 
    21 
    21         verbose("dumping volume $volume->{name}");
    22         verbose("dumping volume $volume->{name}");
    22         my $dumpdev = $volume->{name};
    23         my $dumpdev = $volume->{name};
    23         my $of = sprintf $file, basename($volume->{name});
    24         my $of = sprintf $file, basename($volume->{name});
    24         run("dump -0 -z -f $of $dumpdev");
    25         run("dump -D $dumpdates -u -0 -z -f $of $dumpdev");
    25         verbose("\n");
    26         verbose("\n");
    26     }
    27     }
    27 }
    28 }
    28 
    29 
    29 sub restore($\%) {
    30 sub restore($\%) {
    30     my @dumps = glob(shift);
    31     my @dumps = glob(shift);
    31     my $devs = shift;
    32     my $devs = shift;
    32 
    33 
    33     my $tmpdir = tempdir (CLEANUP => 1);
    34     my $tmpdir = tempdir (CLEANUP => 0);
    34 
    35 
    35     foreach my $dump (@dumps) {
    36     foreach my $dump (@dumps) {
    36 	# suppose it's gzipped
    37 	# suppose it's gzipped
    37 	# find the device
    38 	# find the device
    38 	my $dev;
    39 	my $dev;
    45 	    } }, "/dev");
    46 	    } }, "/dev");
    46 	my $fs = $devs->{volume}{$dev}{type};
    47 	my $fs = $devs->{volume}{$dev}{type};
    47 
    48 
    48 	verbose("restore $dump -> $dev : $fs\n");
    49 	verbose("restore $dump -> $dev : $fs\n");
    49 	run("mount -t $fs $dev $tmpdir");
    50 	run("mount -t $fs $dev $tmpdir");
    50 	my $pid = fork or do {
    51 
    51 	    open(STDIN, $dump) or die "Can't open $dump as STDIN: $!\n";
    52 	eval {
    52 	    chdir $tmpdir  or die "Can't chdir to $tmpdir: $!\n";
    53 		my $pid = fork or do {
    53 	    exec restore => "-orf-";
    54 		    open(STDIN, $dump) or die "Can't open $dump as STDIN: $!\n";
    54 	    die "Can't exec restore: $!\n";
    55 		    chdir $tmpdir  or die "Can't chdir to $tmpdir: $!\n";
       
    56 		    exec restore => "-orf-";
       
    57 		    die "Can't exec restore: $!\n";
       
    58 		};
       
    59 		waitpid($pid, 0);
    55 	};
    60 	};
    56 	waitpid($pid, 0);
       
    57 	run("umount $tmpdir");
    61 	run("umount $tmpdir");
       
    62 	die $@ if $@;
    58     }
    63     }
       
    64     rmdir($tmpdir);
    59 }
    65 }
    60 
    66 
    61 
    67 
    62 1;
    68 1;
    63 
    69