--- 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: