really dumping now
authorHeiko Schlittermann <hs@schlittermann.de>
Mon, 18 Jan 2010 22:55:10 +0100
changeset 14 aecda2763079
parent 13 2e3ad71484ea
child 15 4e3753b998a9
really dumping now
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");
     }
 }