Skip to content

Instantly share code, notes, and snippets.

@res0nat0r
Created May 1, 2011 15:14
Show Gist options
  • Save res0nat0r/950562 to your computer and use it in GitHub Desktop.
Save res0nat0r/950562 to your computer and use it in GitHub Desktop.
diskinfo
#!/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