diff -r 2e3ad71484ea -r aecda2763079 SI/dumper.pm --- a/SI/dumper.pm Sun Jan 17 13:54:10 2010 +0100 +++ b/SI/dumper.pm Mon Jan 18 22:55:10 2010 +0100 @@ -4,15 +4,74 @@ use strict; use warnings; use SI::tools; +use File::Basename; + +#$VAR1 = { +# 'volume' => { +# '/dev/mapper/debian-swap' => { +# 'origin' => 'lvm', +# 'label' => undef, +# 'type' => 'swap', +# 'uuid' => undef +# }, +# '/dev/hda4' => { +# 'ptable_type' => '0', +# 'origin' => 'ptable' +# }, +# '/dev/hda1' => { +# 'ptable_type' => '83', +# 'origin' => 'ptable', +# 'label' => undef, +# 'type' => 'ext2', +# 'uuid' => 'a1fc3fc0-7bde-49c4-9afe-c71db8c4d08b' +# }, +# '/dev/hda3' => { +# 'ptable_type' => '0', +# 'origin' => 'ptable' +# }, +# '/dev/mapper/debian-root' => { +# 'origin' => 'lvm', +# 'label' => undef, +# 'type' => 'ext3', +# 'uuid' => 'b30578ac-841f-48b4-8ceb-1cdcbabc7fab' +# }, +# '/dev/hda2' => { +# 'ptable_type' => '8', +# 'origin' => 'ptable', +# 'label' => undef, +# 'type' => 'lvm2pv', +# 'uuid' => 'S4zDgc-hEWW-h9BY-XHz3-32TE-66W1-W0iMVE' +# } +# }, +# }; sub dump($\%) { my ($file, $devs) = @_; - my %volume = %{$devs->{volume}}; + foreach my $volume ( map { { name => $_, %{$devs->{volume}{$_}}}} keys %{$devs->{volume}}) { + next if !defined $volume->{type} or $volume->{type} !~ /^ext/i; + + verbose("dumping volume $volume->{name}"); + my $dumpdev = $volume->{name}; + + if ($volume->{origin} =~ /lvm/i) { + verbose("(lvm)"); + my ($vg, $lv) = `lvdisplay -c $volume->{name}` =~ /\s*\/dev\/(.*?)\/(.*?):/; + my $snap = "snap$$"; - foreach my $v ( grep { $volume{$_}{type} ~~ /^ext/ } keys %volume ) { - verbose("dumping $v\n"); - ### v: $volume{$v} + END { eval { run("lvchange -an $vg/$snap 2>/dev/null") }; + eval { run("lvremove -ff $vg/$snap 2>/dev/null") }; } + + eval { + run("lvcreate -s -L 1G -n snap$$ $vg/$lv 2>/dev/null"); + }; + if ($@) { warn "Can't create snapshot\n" } + else { $dumpdev = "/dev/$vg/$snap$$" }; + } + + my $of = sprintf $file, basename($volume->{name}); + run("dump -0 -z -f $of $dumpdev"); + verbose("\n"); } }