overview of disks on system with zfs pool/vdev info
[sysadmin-cookbook] / recepies / zfs / disks.pl
1 #!/usr/bin/perl
2 use warnings;
3 use strict;
4 use autodie;
5 use Data::Dump qw(dump);
6
7 my ($before, $delimiter, $after) = ( ''=>' | '=> "\n" ); # double space for display
8    ($before, $delimiter, $after) = ( '"'=>'","'=> '"'."\n" ) if @ARGV;
9
10 my $in_pool;
11 open(my $zpool, '-|', 'zpool status');
12 my $name = 'zfs';
13 my $vdev = '';
14 while(<$zpool>) {
15         chomp;
16         $name = $1 if /^\s+pool:\s(\S+)/;
17         $vdev = $1 if /^\s+(raid\S+|spare)/;
18         $in_pool->{$1} = join(' ', $name, $vdev) if /^\s+(sd\S+)/;
19 }
20
21 warn "# in_pool ",dump($in_pool);
22
23 open(my $lsscsi, '-|', 'lsscsi --size -v');
24
25 print $before, join($delimiter, qw(id type name dev size zfs path) ), $after;
26
27 while(my $line = <$lsscsi>) {
28         chomp($line);
29 #       warn "## $line\n";
30
31         my @l = $line =~ m{(^\S+)\s+(\S+)\s+(.+)\s+(\S+)\s+(\S+)};
32
33         my $dev = $l[3];
34 #       warn "# dev $dev\n";
35         if ( $dev =~ s{/dev/}{} ) {
36                 push @l, exists $in_pool->{$dev} ? $in_pool->{$dev} : '-';
37         } else {
38                 push @l, $dev;
39         }
40
41         my $v = <$lsscsi>;
42         chomp($v);
43         push @l, $1 if $v =~ m/\[(.+)\]/;
44         print $before,join($delimiter,@l),$after;
45 };