SI/lvm.pm
changeset 7 03ca6d811a17
parent 6 df6ca24871d4
child 10 23dd30396607
--- a/SI/lvm.pm	Fri Jan 15 23:17:23 2010 +0100
+++ b/SI/lvm.pm	Sat Jan 16 23:53:50 2010 +0100
@@ -2,16 +2,61 @@
 
 use strict;
 use warnings;
+use IO::File;
+
+use if $ENV{DEBUG} ~~ /lvm|all/ => qw(Smart::Comments);
+
 use SI::tools;
 
+my @volumegroups = ();
+
+sub _vgs(\%) {
+    return @volumegroups if @volumegroups;
+
+    my $devs = shift;
+
+    my @pvs = grep { $devs->{volume}{$_}{type} =~ /^lvm/ } 
+	grep { defined $devs->{volume}{$_} }
+	keys %{$devs->{volume}};
+
+    return @volumegroups = map { (split /:/)[1] } `pvdisplay -c @pvs`;
+}
+
+sub volumes(\%) {
+    my ($devs) = @_;
+
+    # we can't just use `pvs', since this would return *all*
+    # physical devices known to lvm, not just the non-removable
+    my @pvs = grep { $devs->{volume}{$_}{type} =~ /^lvm/ } 
+	grep { defined $devs->{volume}{$_} }
+	keys %{$devs->{volume}};
+
+    my @vgs = _vgs(%$devs);
+    my @lvs = map { readlink } 
+	      map { s/^\s*//; (split /:/)[0] } 
+	      grep { (split /:/)[1] ~~ @vgs } `lvdisplay -c`;
+
+    @{$devs->{volume}}{@lvs} = ();
+
+
+}
+
 sub vgcfgbackup($\%) {
-    my ($file, $part) = @_;
-    foreach (map { (split /:/)[0] }
-        map { /^\s*(.*)/; } `vgs --noheadings --separator :`)
+    my ($file, $devs) = @_;
+
+    # we save it vg by vg to have the restore more easy
+    my @vgs = _vgs(%$devs);
+    foreach ( map { s/^\s*(.*)/$1/; $_ = (split /:/)[0] } `vgs --noheadings --separator : @vgs`)
     {
+	verbose("saving vg $_\n");
         my $file = sprintf $file, $_;
-        run("vgcfgbackup -f $file >/dev/null");
+        run("vgcfgbackup -f $file $_ >/dev/null");
     }
+
+    # for testing let's save it all
+    verbose("saving vg *\n");
+    $file = sprintf $file, "*";
+    run("vgcfgbackup -f '$file' >/dev/null");
 }
 
 1;