#!/bin/env perl use feature qw(say); our %smartctl_raw; say '
';

_build_smartctl(18);
_build_smartctl(34);

_print_zpool();
_print_smartctl_summary();
_print_zfs_list();
_print_zpool_iostat();
_print_arc_summary();
_print_smartctl_detail();

say "
"; sub _print_zpool { say ('=' x 75); say ' zpool status'; say ('-' x 75); say `/usr/sbin/zpool status`; } sub _print_zfs_list { say "\n" . ('=' x 75); say ' ZFS Volume List'; say ('-' x 75); say `/usr/sbin/zfs list`; } sub _print_zpool_iostat { say ('=' x 75); say ' zpool iostats'; say ('-' x 75); say `/usr/sbin/zpool iostat -vl`; } sub _print_arc_summary { say ('=' x 72); print ' zpool ARC summary'; my $arc_summary = `/usr/bin/arc_summary`; $arc_summary =~ /(.*?)\s+ZFS Tunables/gsm; say $1; } sub _build_smartctl { my $idLen = shift; my @devs = split /^/, `ls -1 /dev/disk/by-id | grep -E "wwn-.{$idLen}\$"`; my $megacount = ($idLen == 18) ? 0 : 1; foreach $dev (@devs) { chomp($dev); for $drive (0..$megacount) { my $megaraid = "-d megaraid,$drive" if $idLen == 34; my $suffix = ($idLen == 18) ? '' : "-$drive"; $smartctl_raw{"$dev$suffix"} = `/usr/sbin/smartctl $megaraid -x /dev/disk/by-id/$dev`; } } } sub _print_smartctl_summary { say ('=' x 75); say ' SMARTCTL Disk Summary'; say ('-' x 75); my @concerns = ( "SMART overall-health", "SMART Health Status", ); my $concernsRegex = (join "|", @concerns); foreach $dev (keys %smartctl_raw) { my @smartctl = split /^/, $smartctl_raw{$dev}; foreach $line (@smartctl) { if ($line =~ /$concernsRegex/i) { chomp($line); $line =~ /^.+:\s+(.+)$/; my $status = $1; say "$dev: $status"; } } } } sub _print_smartctl_detail { say "\n" . ('=' x 75); say ' SMARTCTL Disk Detail'; say ('-' x 75); my @concerns = ( "^Vendor:", "^Product:", "Device Model", "Serial Number", "User Capacity", "Rotation Rate", "Power_On_Hours", "Wear_Leveling_Count", "Used_Rsvd_Blk_Cnt_Tot", "Percent_Lifetime_Remain", "Test_Description", "# 1 Vendor", "No self-tests", "algorithm", "invocations", "^read:", "^write:", "^verify:" ); my @concernsWithNewline = ( "ATTRIBUTE_NAME", "SMART overall-health", "SMART Extended Self-test", "SMART Health Status", "Accumulated power", "Errors Corrected", "Non-medium error count", ); my $concernsWithNewlineRegex = (join "|", @concernsWithNewline); my $concernsRegex = (join "|", @concerns) . '|' . $concernsWithNewlineRegex; foreach $dev (keys %smartctl_raw) { my @smartctl = split /^/, $smartctl_raw{$dev}; say "Device by-id:" . (' ' x (length($dev) == 22 ? 5 : 9)) . "$dev " . (length($dev) > 22 ? "(raid disk $drive)" : ""); foreach $line (@smartctl) { if ($line =~ /$concernsRegex/i) { if ($line =~ /$concernsWithNewlineRegex/i) { say ''; } chomp($line); say substr($line, 0, 75); } } say "\n" . ('-' x 75); } }