Created
May 1, 2011 15:14
-
-
Save res0nat0r/950562 to your computer and use it in GitHub Desktop.
diskinfo
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/perl | |
$INQ = "/net/ironchef/var/tmp/pkgs/linux/inq.linux"; | |
#$INQ = "/net/goober/scratch/inq/inq"; | |
$HEAD = 1; | |
while (@ARGV) | |
{ | |
$arg = shift @ARGV; | |
if ($arg eq "-emc") { $EMC = 1; } | |
elsif ($arg eq "-vm") { $VM = 1; } | |
elsif ($arg eq "-h") { $HEAD = 0; } | |
elsif ($arg eq "-inq") { $INQ = shift @ARGV; } | |
elsif ($arg eq "-pv" ) { $PVSORT = 1; } | |
elsif ($arg eq "-ser") { $SERSORT = 1; } | |
elsif ($arg eq "-mp" ) { $MPSORT = 1; } | |
} | |
for (`ls /dev/sd* /dev/hd* /dev/cciss/* 2>/dev/null`) | |
{ | |
chomp; | |
my $size = `fdisk -s $_ 2>/dev/null`; | |
next unless ($size); | |
my @F = split(/[\/]+/,$_); | |
push @{$DISK{$_}{PATHS}}, $F[-1]; | |
$DISK{$_}{SIZE} = $size/1024/1024; | |
$DISK{$_}{TYPE} = "Local" if (/cciss/); | |
} | |
for (`$INQ -no_dots`) | |
{ | |
next unless (/^\//); | |
chomp; | |
my @F = split(/:/,$_); | |
@F = grep(s/(^\s*|\s*$)//g, @F); | |
$DISK{$F[0]}{SIZE} = $F[-1]/1024/1024; | |
$DISK{$F[0]}{TYPE} = $F[1]; | |
$DISK{$F[0]}{SERNO} = $F[4] if (/EMC/||/DGC/); | |
} | |
for (keys %DISK) | |
{ | |
next unless (/^(\/dev\/sd.+)\d$/); | |
$DISK{$_}{TYPE} = $DISK{$1}{TYPE}; | |
$DISK{$_}{SERNO} = $DISK{$1}{SERNO}; | |
} | |
for (`ls -l /dev/mpath/mpath*`) | |
{ | |
chomp; | |
my @F = split; | |
($MPATH{$F[-3]} = $F[-1]) =~ s/\.\./\/dev/; | |
} | |
for (`multipath -l`) | |
{ | |
chomp; | |
my @F = split; | |
if (/^mpath/) | |
{ | |
$mp = "/dev/mpath/$F[0]"; | |
$dm = $MPATH{$mp}; | |
} | |
elsif (/sd/) | |
{ | |
$sd = "/dev/$F[2]"; | |
if ($DISK{$dm}) { push @{$DISK{$dm}{PATHS}}, $F[2]; } | |
else { $DISK{$dm} = $DISK{$sd}; } | |
delete $DISK{$sd}; | |
$DISK{$dm}{MPATH} = $mp; | |
$DISK{$dm}{FS}{" "} = 0; | |
} | |
} | |
for (`powermt display dev=all 2>/dev/null`) | |
{ | |
chomp; | |
my @F = split(/[\s=]+/,$_); | |
if (/Pseudo name=/) | |
{ | |
$dm = "/dev/$F[2]"; | |
} | |
elsif ($F[3] =~ /sd/) | |
{ | |
$sd = "/dev/$F[3]"; | |
if ($DISK{$dm}) { push @{$DISK{$dm}{PATHS}}, $F[3]; } | |
else { $DISK{$dm} = $DISK{$sd}; } | |
delete $DISK{$sd}; | |
$DISK{$dm}{FS}{" "} = 0; | |
} | |
} | |
for (`pvdisplay -m`) | |
{ | |
chomp; | |
s/mapper/mpath/; | |
my @F = split; | |
if (/PV Name/) { $pv = (/mpath/) ? $MPATH{$F[2]} : $F[2]; } | |
elsif (/PV Size/) { $DISK{$pv}{SIZE} = $F[2] * ((/TB/) ? 1024 : 1); } | |
elsif (/VG Name/) { $DISK{$pv}{VG} = $F[2]; } | |
elsif (/Logical volume/) { push @{$LV{$F[2]}}, $pv; } | |
} | |
for (`df -k -t ext3`) | |
{ | |
next unless ($n++); | |
chomp; | |
if (!/\%/) { $x = $_; next; } | |
$_ = $x.$_; | |
$x = undef; | |
my @F = split; | |
if ($F[0] =~ /mapper/) | |
{ | |
my @x = split(/[\/\-]+/,$F[0]); | |
$F[0] = "/dev/$x[3]/$x[4]"; | |
} | |
for $v (($DISK{$F[0]}) ? ($F[0]) : @{$LV{$F[0]}}) | |
{ | |
$DISK{$v}{FS}{$F[5]} = $F[1]/1024/1024; | |
delete $DISK{$v}{FS}{" "}; | |
} | |
} | |
for (`swapon -s`) | |
{ | |
chomp; | |
my @F = split; | |
$DISK{$F[0]}{FS}{"swap"} = $F[2]/1024/1024 if ($DISK{$F[0]}); | |
} | |
$format = "%-35s%6.1f %-20s%-20s%-21s%4.0f %-20s%-11s%-3s\n"; | |
for $d (keys %DISK) | |
{ | |
my $D = $DISK{$d}; | |
next if ($EMC && $D->{TYPE} ne "EMC" && $D->{TYPE} ne "DGC"); | |
next if ($VM && $D->{TYPE} ne "VMware"); | |
my $paths = join(",", sort psort @{$D->{PATHS}}); | |
$D->{FS}{" "} = 0 unless ($D->{FS}); | |
for $fs (keys %{$D->{FS}}) | |
{ | |
$s = sprintf $format, $fs, $D->{FS}{$fs}, $D->{VG}, $d, $D->{MPATH}, $D->{SIZE}, $paths, $D->{SERNO}, $D->{TYPE}; | |
if ($PVSORT) { $S{$d}{$fs} = $s; } | |
elsif ($SERSORT) { $S{$D->{SERNO}}{$fs}{$d} = $s; } | |
elsif ($MPSORT) { $S{$D->{MPATH}}{$fs} = $s; } | |
else { $S{$D->{VG}}{$fs}{$d} = $s; } | |
} | |
} | |
($header = $format) =~ s/\%(\d+).*?f/\%-$1s/g; | |
printf $header, "Filesystem", "Size", "VG", "PV/Dev", "mpath", "Size", "Paths", "Serial #", "Type" if ($HEAD); | |
if ($PVSORT) | |
{ | |
for my $i (sort pvsort keys %S) { for my $j (sort fssort keys %{$S{$i}}) { print $S{$i}{$j}; } } | |
} | |
elsif ($SERSORT) | |
{ | |
for my $i (sort keys %S) { for my $j (sort fssort keys %{$S{$i}}) { for my $k (sort pvsort keys %{$S{$i}{$j}}) { print $S{$i}{$j}{$k}; } } } | |
} | |
elsif ($MPSORT) | |
{ | |
for my $i (sort pvsort keys %S) { for my $j (sort fssort keys %{$S{$i}}) { print $S{$i}{$j}; } } | |
} | |
else | |
{ | |
for my $i (sort vgsort keys %S) { for my $j (sort fssort keys %{$S{$i}}) { for my $k (sort pvsort keys %{$S{$i}{$j}}) { print $S{$i}{$j}{$k}; } } } | |
} | |
sub psort { length($a) <=> length($b) || $a cmp $b; } | |
sub pvsort | |
{ | |
return ($a cmp $b) unless (($a =~ /dm-/ && $b =~ /dm-/) || ($a =~ /mpath/ && $b =~ /mpath/)); | |
$a =~ /(\d+)$/; | |
my $A = $1; | |
$b =~ /(\d+)$/; | |
my $B = $1; | |
$A <=> $B; | |
} | |
sub fssort | |
{ | |
return ($a cmp $b) unless ($a =~ /\d+$/ && $b =~ /\d+$/); | |
$a =~ /^(.+?)(\d+)$/; | |
my ($A1,$A2) = ($1,$2); | |
$b =~ /^(.+?)(\d+)$/; | |
my ($B1,$B2) = ($1,$2); | |
$A1 cmp $B1 || $A2 <=> $B2; | |
} | |
sub vgsort | |
{ | |
return (-1) if ($a eq "rootvg" && $b); | |
return ( 1) if ($a && $b eq "rootvg"); | |
$a cmp $b; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment