report md devices and zfs spare cache and log drives
authorDobrica Pavlinusic <dpavlin@rot13.org>
Sat, 25 Aug 2012 14:13:11 +0000 (14:13 +0000)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Sat, 25 Aug 2012 14:13:11 +0000 (14:13 +0000)
git-svn-id: svn://svn.rot13.org/sysadmin-cookbook@300 191e9f34-6774-4a6d-acfc-7664dacd4a2a

recepies/zfs/disks.pl

index 112701b..c33a4c0 100755 (executable)
@@ -7,22 +7,35 @@ use Data::Dump qw(dump);
 my ($before, $delimiter, $after) = ( ''=>' | '=> "\n" ); # double space for display
    ($before, $delimiter, $after) = ( '"'=>'","'=> '"'."\n" ) if @ARGV;
 
-my $in_pool;
+my $zfs;
 open(my $zpool, '-|', 'zpool status');
 my $name = 'zfs';
 my $vdev = '';
 while(<$zpool>) {
        chomp;
        $name = $1 if /^\s+pool:\s(\S+)/;
-       $vdev = $1 if /^\s+(raid\S+|spare)/;
-       $in_pool->{$1} = join(' ', $name, $vdev) if /^\s+(sd\S+)/;
+       $vdev = $1 if /^\s+(raid\S+|spare|log|cache)/;
+       $zfs->{$1} = join(' ', $name, $vdev) if /^\s+(sd\S+)/;
 }
+warn "# zfs ",dump($zfs);
 
-warn "# in_pool ",dump($in_pool);
+my $md;
+open(my $mdstat, '<', '/proc/mdstat');
+while(<$mdstat>) {
+       chomp;
+       if ( m/(md\d+)\s+:\s+active\s+(\S+)\s+(.+)/ ) {
+               my ( $nr, $raid ) = ( $1, $2 );
+               foreach my $dev ( split(/\s+/, $3) ) {
+                       my $d = $1 if $dev =~ m{(sd\w+)\d+};
+                       $md->{$d} = "$nr $raid $dev";
+               }
+       }
+}
+warn "# md ",dump($md);
 
 open(my $lsscsi, '-|', 'lsscsi --size -v');
 
-print $before, join($delimiter, qw(id type name dev size zfs path) ), $after;
+print $before, join($delimiter, qw(id type name dev size pert_of path) ), $after;
 
 while(my $line = <$lsscsi>) {
        chomp($line);
@@ -31,12 +44,13 @@ while(my $line = <$lsscsi>) {
        my @l = $line =~ m{(^\S+)\s+(\S+)\s+(.+)\s+(\S+)\s+(\S+)};
 
        my $dev = $l[3];
-#      warn "# dev $dev\n";
-       if ( $dev =~ s{/dev/}{} ) {
-               push @l, exists $in_pool->{$dev} ? $in_pool->{$dev} : '-';
-       } else {
-               push @l, $dev;
-       }
+       $dev =~ s{/dev/}{};
+       warn "# dev $dev\n";
+
+       push @l,
+               exists $zfs->{$dev} ? $zfs->{$dev} :
+               exists $md->{$dev} ? $md->{$dev} :
+               '-';
 
        my $v = <$lsscsi>;
        chomp($v);