equal
deleted
inserted
replaced
8 use File::Temp qw(tempdir); |
8 use File::Temp qw(tempdir); |
9 use File::Find; |
9 use File::Find; |
10 |
10 |
11 sub dump($\%) { |
11 sub dump($\%) { |
12 my ($file, $devs) = @_; |
12 my ($file, $devs) = @_; |
|
13 my $dumpdates = dirname($file) . "/dumpdates"; |
13 |
14 |
14 foreach my $volume ( |
15 foreach my $volume ( |
15 map { { name => $_, %{ $devs->{volume}{$_} } } } |
16 map { { name => $_, %{ $devs->{volume}{$_} } } } |
16 keys %{ $devs->{volume} } |
17 keys %{ $devs->{volume} } |
17 ) |
18 ) |
19 next if !defined $volume->{type} or $volume->{type} !~ /^ext/i; |
20 next if !defined $volume->{type} or $volume->{type} !~ /^ext/i; |
20 |
21 |
21 verbose("dumping volume $volume->{name}"); |
22 verbose("dumping volume $volume->{name}"); |
22 my $dumpdev = $volume->{name}; |
23 my $dumpdev = $volume->{name}; |
23 my $of = sprintf $file, basename($volume->{name}); |
24 my $of = sprintf $file, basename($volume->{name}); |
24 run("dump -0 -z -f $of $dumpdev"); |
25 run("dump -D $dumpdates -u -0 -z -f $of $dumpdev"); |
25 verbose("\n"); |
26 verbose("\n"); |
26 } |
27 } |
27 } |
28 } |
28 |
29 |
29 sub restore($\%) { |
30 sub restore($\%) { |
30 my @dumps = glob(shift); |
31 my @dumps = glob(shift); |
31 my $devs = shift; |
32 my $devs = shift; |
32 |
33 |
33 my $tmpdir = tempdir (CLEANUP => 1); |
34 my $tmpdir = tempdir (CLEANUP => 0); |
34 |
35 |
35 foreach my $dump (@dumps) { |
36 foreach my $dump (@dumps) { |
36 # suppose it's gzipped |
37 # suppose it's gzipped |
37 # find the device |
38 # find the device |
38 my $dev; |
39 my $dev; |
45 } }, "/dev"); |
46 } }, "/dev"); |
46 my $fs = $devs->{volume}{$dev}{type}; |
47 my $fs = $devs->{volume}{$dev}{type}; |
47 |
48 |
48 verbose("restore $dump -> $dev : $fs\n"); |
49 verbose("restore $dump -> $dev : $fs\n"); |
49 run("mount -t $fs $dev $tmpdir"); |
50 run("mount -t $fs $dev $tmpdir"); |
50 my $pid = fork or do { |
51 |
51 open(STDIN, $dump) or die "Can't open $dump as STDIN: $!\n"; |
52 eval { |
52 chdir $tmpdir or die "Can't chdir to $tmpdir: $!\n"; |
53 my $pid = fork or do { |
53 exec restore => "-orf-"; |
54 open(STDIN, $dump) or die "Can't open $dump as STDIN: $!\n"; |
54 die "Can't exec restore: $!\n"; |
55 chdir $tmpdir or die "Can't chdir to $tmpdir: $!\n"; |
|
56 exec restore => "-orf-"; |
|
57 die "Can't exec restore: $!\n"; |
|
58 }; |
|
59 waitpid($pid, 0); |
55 }; |
60 }; |
56 waitpid($pid, 0); |
|
57 run("umount $tmpdir"); |
61 run("umount $tmpdir"); |
|
62 die $@ if $@; |
58 } |
63 } |
|
64 rmdir($tmpdir); |
59 } |
65 } |
60 |
66 |
61 |
67 |
62 1; |
68 1; |
63 |
69 |