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 |
8 |
9 my @cleanup; |
|
10 END { |
|
11 #map { eval { run("lvchange -an $_ 2>/dev/null") } } @cleanup; |
|
12 #map { eval { run("lvremove -ff $_ 2>/dev/null") } } @cleanup; |
|
13 } |
|
14 |
|
15 sub dump($\%) { |
9 sub dump($\%) { |
16 my ($file, $devs) = @_; |
10 my ($file, $devs) = @_; |
17 |
11 |
18 foreach my $volume ( map { { name => $_, %{$devs->{volume}{$_}}}} keys %{$devs->{volume}}) { |
12 foreach my $volume ( map { { name => $_, %{$devs->{volume}{$_}}}} keys %{$devs->{volume}}) { |
19 next if !defined $volume->{type} or $volume->{type} !~ /^ext/i; |
13 next if !defined $volume->{type} or $volume->{type} !~ /^ext/i; |
20 |
14 |
|
15 system("fsck -f -C0 $volume->{name}"); |
|
16 die "ERR: fsck failed\n" if $? > 2; |
|
17 |
21 verbose("dumping volume $volume->{name}"); |
18 verbose("dumping volume $volume->{name}"); |
22 my $dumpdev = $volume->{name}; |
19 my $dumpdev = $volume->{name}; |
23 |
|
24 # if ($volume->{origin} =~ /lvm/i) { |
|
25 # verbose("(lvm)"); |
|
26 # my ($vg, $lv) = `lvdisplay -c $volume->{name}` =~ /\s*\/dev\/(.*?)\/(.*?):/; |
|
27 # my $snap = "snap$$"; |
|
28 # push @cleanup, "$vg/$lv"; |
|
29 # |
|
30 # #eval { |
|
31 # # run("lvcreate -s -L 1G -n snap$$ $vg/$lv 2>/dev/null"); |
|
32 # #}; |
|
33 # if ($@) { warn "Can't create snapshot\n" } |
|
34 # else { $dumpdev = "/dev/$vg/$snap$$" }; |
|
35 # } |
|
36 |
|
37 my $of = sprintf $file, basename($volume->{name}); |
20 my $of = sprintf $file, basename($volume->{name}); |
38 run("dump -0 -z -f $of $dumpdev"); |
21 run("dump -0 -z -f $of $dumpdev"); |
39 verbose("\n"); |
22 verbose("\n"); |
40 } |
23 } |
41 } |
24 } |