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