diff -r df6ca24871d4 -r 03ca6d811a17 SI/lvm.pm --- 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;