SI/lvm.pm
branch2010-01-17
changeset 10 23dd30396607
parent 7 03ca6d811a17
child 12 a1aee1136609
equal deleted inserted replaced
7:03ca6d811a17 10:23dd30396607
     1 package SI::lvm;
     1 package SI::lvm;
       
     2 
       
     3 use if $ENV{DEBUG} ~~ /lvm|all/ => qw(Smart::Comments);
     2 
     4 
     3 use strict;
     5 use strict;
     4 use warnings;
     6 use warnings;
     5 use IO::File;
     7 use IO::File;
     6 
     8 
     7 use if $ENV{DEBUG} ~~ /lvm|all/ => qw(Smart::Comments);
       
     8 
     9 
     9 use SI::tools;
    10 use SI::tools;
    10 
    11 
    11 my @volumegroups = ();
    12 my @volumegroups = ();
    12 
    13 
    13 sub _vgs(\%) {
    14 sub _vgs(\%) {
    14     return @volumegroups if @volumegroups;
    15     return @volumegroups if @volumegroups;
    15 
    16 
    16     my $devs = shift;
    17     my $devs = shift;
    17 
    18 
    18     my @pvs = grep { $devs->{volume}{$_}{type} =~ /^lvm/ } 
    19     use Data::Dumper;
    19 	grep { defined $devs->{volume}{$_} }
    20     die Dumper \@pvs;
    20 	keys %{$devs->{volume}};
    21     my @pvs = grep { exists $devs->{disk}{$_} } map { s/\s*//; (split /:/)[0] } `pvdisplay -c`;
    21 
    22 
    22     return @volumegroups = map { (split /:/)[1] } `pvdisplay -c @pvs`;
    23     return @volumegroups = map { (split /:/)[1] } `pvdisplay -c @pvs 2>/dev/null`;
    23 }
    24 }
    24 
    25 
    25 sub volumes(\%) {
    26 sub volumes(\%) {
    26     my ($devs) = @_;
    27     my ($devs) = @_;
    27 
    28 
    28     # we can't just use `pvs', since this would return *all*
    29     # we can't just use `pvs', since this would return *all*
    29     # physical devices known to lvm, not just the non-removable
    30     # physical devices known to lvm, not just the non-removable
    30     my @pvs = grep { $devs->{volume}{$_}{type} =~ /^lvm/ } 
       
    31 	grep { defined $devs->{volume}{$_} }
       
    32 	keys %{$devs->{volume}};
       
    33 
    31 
    34     my @vgs = _vgs(%$devs);
    32     my @vgs = _vgs(%$devs);
    35     my @lvs = map { readlink } 
    33     my @lvs = map { readlink } 
    36 	      map { s/^\s*//; (split /:/)[0] } 
    34 	      map { s/^\s*//; (split /:/)[0] } 
    37 	      grep { (split /:/)[1] ~~ @vgs } `lvdisplay -c`;
    35 	      grep { (split /:/)[1] ~~ @vgs } `lvdisplay -c`;