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