--- 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");
}
}