From b61aeb3cec904ab97d826dc8bddda33ad827f5ea Mon Sep 17 00:00:00 2001 From: Patrick Van der Veken Date: Tue, 10 Nov 2020 12:17:04 +0100 Subject: [PATCH] add support for --pe & --pv toggles [Patrick Van der Veken] --- lx-lvm/vgs.pl | 127 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 97 insertions(+), 30 deletions(-) diff --git a/lx-lvm/vgs.pl b/lx-lvm/vgs.pl index 7bd59b0..1e52fee 100644 --- a/lx-lvm/vgs.pl +++ b/lx-lvm/vgs.pl @@ -62,6 +62,8 @@ if ( @ARGV > 0 ) { help|h|? size|s=s vg|g=s + pe|e + pv|v active|a terse|t )); @@ -71,6 +73,10 @@ if ($options{'help'}) { pod2usage(-verbose => 3); exit (0); }; +if ($options{'pe'} and $options{'pv'}) { + pod2usage(-verbose => 3); + exit (0); +}; unless ($options{'size'}) { $options{'size'} = 'GB'; }; @@ -102,16 +108,29 @@ foreach my $vg_entry (@vgdisplay) { } # print header -unless ($options{'terse'}) { - printf STDOUT ("\n%-${vg_str_size}s %-5s %-5s %-20s %-8s %-8s %-10s %-10s %-10s %-12s\n", - "VG", "PVs", "LVs", "Status", "Version", "PE Size", "VG Size", "VG Free", "VG Max", "VG Major/Minor"); +if ($options{'pe'}) { + unless ($options{'terse'}) { + printf STDOUT ("\n%-${vg_str_size}s %-5s %-5s %-20s %-8s %-8s %-10s %-10s %-10s %-12s\n", + "VG", "PVs", "LVs", "Status", "Version", "PE Size", "PE Total", "PE Alloc", "PE Free", "Max PE/PV"); + } +} elsif ($options{'pv'}) { + unless ($options{'terse'}) { + printf STDOUT ("\n%-${vg_str_size}s %-5s %-5s %-20s %-8s %-8s %-8s %-8s %-12s\n", + "VG", "PVs", "LVs", "Status", "Version", "Max PV", "Act PV", "PVGs", "Max PE/PV"); + } +} else { + unless ($options{'terse'}) { + printf STDOUT ("\n%-${vg_str_size}s %-5s %-5s %-20s %-8s %-8s %-10s %-10s %-10s %-12s\n", + "VG", "PVs", "LVs", "Status", "Version", "PE Size", "VG Size", "VG Free", "VG Max", "VG Major/Minor"); + } } # loop over vgdisplay (ASCII sorted) foreach my $vg_entry (sort (@vgdisplay)) { my ($vg_name, $vg_status, $vg_version, $lsvg, $vg_major, $vg_minor,) = ("","","n/a","","n/a","n/a"); - my ($vg_total_pe, $vg_size_pe, $vg_free_pe, $vg_cur_pvs, $vg_cur_lvs, $vg_max_pe) = (0,0,0,0,0,0); + my ($vg_total_pe, $vg_alloc_pe, $vg_size_pe, $vg_free_pe, $vg_cur_pvs, $vg_cur_lvs, $vg_max_pe, $vg_pe_per_pv) = (0,0,0,0,0,0,0,0); + my ($vg_max_pv, $vg_act_pv, $vg_total_pvg) = (0,0,0); my ($vg_size, $vg_free, $vg_max) = (0,0,0); my @vg_data = split (/:/, $vg_entry); @@ -123,37 +142,72 @@ foreach my $vg_entry (sort (@vgdisplay)) { $vg_status = $1 if ($vg_field =~ m%^vg_status=(.*)%); unless ($vg_status eq "deactivated") { - $vg_total_pe = $1 if ($vg_field =~ m%^total_pe=(.*)%); - $vg_size_pe = $1 if ($vg_field =~ m%^pe_size=(.*)%); - $vg_free_pe = $1 if ($vg_field =~ m%^free_pe=(.*)%); - $vg_cur_pvs = $1 if ($vg_field =~ m%^cur_pv=(.*)%); - $vg_cur_lvs = $1 if ($vg_field =~ m%^cur_lv=(.*)%); - $vg_version = $1 if ($vg_field =~ m%^vg_version=(.*)%); - $vg_max_pe = $1 if ($vg_field =~ m%^vg_max_extents=(.*)%); + $vg_total_pe = $1 if ($vg_field =~ m%^total_pe=(.*)%); + $vg_alloc_pe = $1 if ($vg_field =~ m%^alloc_pe=(.*)%); + $vg_size_pe = $1 if ($vg_field =~ m%^pe_size=(.*)%); + $vg_free_pe = $1 if ($vg_field =~ m%^free_pe=(.*)%); + $vg_cur_pvs = $1 if ($vg_field =~ m%^cur_pv=(.*)%); + $vg_cur_lvs = $1 if ($vg_field =~ m%^cur_lv=(.*)%); + $vg_version = $1 if ($vg_field =~ m%^vg_version=(.*)%); + $vg_max_pe = $1 if ($vg_field =~ m%^vg_max_extents=(.*)%); + $vg_pe_per_pv = $1 if ($vg_field =~ m%^max_pe_per_pv=(.*)%); + $vg_max_pv = $1 if ($vg_field =~ m%^max_pv=(.*)%); + $vg_act_pv = $1 if ($vg_field =~ m%^act_pv=(.*)%); + $vg_total_pvg = $1 if ($vg_field =~ m%^total_pvg=(.*)%); } } - # calculate sizes - unless ($vg_status eq "deactivated") { - $vg_size = $vg_total_pe * $vg_size_pe; - $vg_size /= 1024 unless ($options{'size'} =~ /MB/i); - $vg_size = ceil ($vg_size); - $vg_free = $vg_free_pe * $vg_size_pe; - $vg_free /= 1024 unless ($options{'size'} =~ /MB/i); - $vg_free = ceil ($vg_free); - $vg_max = $vg_max_pe * $vg_size_pe; - $vg_max /= 1024 unless ($options{'size'} =~ /MB/i); - $vg_max = ceil ($vg_max); - } - # get minor number - $lsvg = `/usr/bin/ls -l /dev/${vg_name}/group 2>/dev/null`; - unless ($?) { - $vg_major = (split (/\s+/, $lsvg))[4]; - $vg_minor = (split (/\s+/, $lsvg))[5]; + if (!$options{'pe'}) { + # calculate sizes + unless ($vg_status eq "deactivated") { + $vg_size = $vg_total_pe * $vg_size_pe; + $vg_size /= 1024 unless ($options{'size'} =~ /MB/i); + $vg_size = ceil ($vg_size); + $vg_free = $vg_free_pe * $vg_size_pe; + $vg_free /= 1024 unless ($options{'size'} =~ /MB/i); + $vg_free = ceil ($vg_free); + $vg_max = $vg_max_pe * $vg_size_pe; + $vg_max /= 1024 unless ($options{'size'} =~ /MB/i); + $vg_max = ceil ($vg_max); + } + # get minor number + $lsvg = `/usr/bin/ls -l /dev/${vg_name}/group 2>/dev/null`; + unless ($?) { + $vg_major = (split (/\s+/, $lsvg))[4]; + $vg_minor = (split (/\s+/, $lsvg))[5]; + } } # report data - unless ($options{'active'} and ($vg_status eq "deactivated")) { - printf STDOUT ("%-${vg_str_size}s %-5s %-5s %-20s %-8s %-8d %-10d %-10d %-10d %3s/%-8s\n", + if ($options{'pe'}) { + unless ($options{'active'} and ($vg_status eq "deactivated")) { + printf STDOUT ("%-${vg_str_size}s %-5s %-5s %-20s %-8s %-8d %-10d %-10d %-10d %-12d\n", + $vg_name, + $vg_cur_pvs, + $vg_cur_lvs, + $vg_status, + $vg_version, + $vg_size_pe, + $vg_total_pe, + $vg_alloc_pe, + $vg_free_pe, + $vg_pe_per_pv) + } + } elsif ($options{'pv'}) { + unless ($options{'active'} and ($vg_status eq "deactivated")) { + printf STDOUT ("%-${vg_str_size}s %-5s %-5s %-20s %-8s %-8d %-8d %-8d %-12d\n", + $vg_name, + $vg_cur_pvs, + $vg_cur_lvs, + $vg_status, + $vg_version, + $vg_max_pv, + $vg_act_pv, + $vg_total_pvg, + $vg_pe_per_pv) + } + } else { + unless ($options{'active'} and ($vg_status eq "deactivated")) { + printf STDOUT ("%-${vg_str_size}s %-5s %-5s %-20s %-8s %-8d %-10d %-10d %-10d %3s/%-8s\n", $vg_name, $vg_cur_pvs, $vg_cur_lvs, @@ -166,6 +220,7 @@ foreach my $vg_entry (sort (@vgdisplay)) { $vg_major, $vg_minor) } + } } # footer @@ -202,6 +257,7 @@ vgs.pl - Show volume group information in a terse way (Linux style). [(-g|--vg)=] [(-s|--size)=] [(-a|--active)] + [(-e|--pe) | (-v|--pv)] [(-t|--terse)] =head1 OPTIONS @@ -224,10 +280,20 @@ S< >Display information for a specific volume group. S< >Show volume group sizes in MB or GB (default is GB). +=item -e | --pe + +S< >Show PE (physical extents) information instead of detailed VG (volume group) information + +=item -v | --pv + +S< >Show PV (physical volume) information instead of detailed VG (volume group) information + =item -t | --terse S< >Do not show header and footer information. +=back + =head1 AUTHOR (c) KUDOS BVBA - Patrick Van der Veken @@ -239,3 +305,4 @@ S< >Do not show header and footer information. @(#) 2017-12-12: made VG name display size dynamic, added --active, added --terse [Patrick Van der Veken] @(#) 2019-02-08: remove /dev/ prefix for VG [Patrick Van der Veken] @(#) 2020-03-26: use ceil() to round up to more sensible numbers [Patrick Van der Veken] + @(#) 2020-11-10: add support for --pe & --pv toggles [Patrick Van der Veken]