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);
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);