lib/SI/dumper.pm
changeset 37 a61b92c60367
parent 28 7d7ca3f05f25
child 38 38af4add892a
--- a/lib/SI/dumper.pm	Sun Jan 31 01:17:32 2010 +0100
+++ b/lib/SI/dumper.pm	Sun Jan 31 23:58:01 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) = @_;
@@ -24,6 +26,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: