diff -r 28090de7d005 -r 38af4add892a lib/SI/dumper.pm --- a/lib/SI/dumper.pm Fri Jan 22 23:28:45 2010 +0100 +++ b/lib/SI/dumper.pm Mon Feb 01 00:07:30 2010 +0100 @@ -5,6 +5,8 @@ use warnings; use SI::tools; use File::Basename; +use File::Temp qw(tempdir); +use File::Find; sub dump($\%) { my ($file, $devs) = @_; @@ -25,6 +27,39 @@ } } +sub restore($\%) { + my @dumps = glob(shift); + my $devs = shift; + + my $tmpdir = tempdir (CLEANUP => 1); + + foreach my $dump (@dumps) { + # suppose it's gzipped + # find the device + my $dev; + my $base = basename($dump); + find(sub { + return if defined $dev; + if ($_ eq $base) { + $dev = $File::Find::name; + return; + } }, "/dev"); + my $fs = $devs->{volume}{$dev}{type}; + + verbose("restore $dump -> $dev : $fs\n"); + run("mount -t $fs $dev $tmpdir"); + my $pid = fork or do { + open(STDIN, $dump) or die "Can't open $dump as STDIN: $!\n"; + chdir $tmpdir or die "Can't chdir to $tmpdir: $!\n"; + exec restore => "-orf-"; + die "Can't exec restore: $!\n"; + }; + waitpid($pid, 0); + run("umount $tmpdir"); + } +} + + 1; # vim:sts=4 sw=4 aw ai sm: