#! /usr/bin/env perl use warnings; use strict; my %allDrives; # create a hash with the keys having values ada0, da0, etc # comment/uncomment one of the three lines below # manually enter the drives to look at # %allDrives = map { $_ => 0 } qw/ada0 da0 da1 da2 da3 da4 da5 da6 da7 da8 da9/; # automagically find the drives on a BSD system %allDrives = map { &trim($_) => 0 } `geom disk list | grep 'Geom name:' | cut -d':' -f 2`; # automagically find the drives on a Linux system #%allDrives = map { &trim($_) => 0 } `lsblk | grep disk | cut -d' ' -f1`; sub trim { my $value = shift; $value =~ s/^\s+|\s+$//g; return $value; } sub getTotalWrites { my $drive = shift; my @report = `smartctl -a /dev/$drive`; return -2 unless grep{ /(Solid State Device)|(SSD)/ } @report; my @temp = grep{ /^Sector Size:/ } @report; my $sectors = shift @temp; # print "The Value is [$sectors]\n"; die; if ( $sectors =~ m/^Sector Size\:\s+(\d+)\s+bytes/ ) { $sectors = $1; # print "Sectors is $sectors\n"; die; @temp = grep{ /^241/ } @report; my $lbas = $temp[0]; if ( $lbas =~ m/(\d+)\s*$/ ) { $lbas = $1; return $lbas * $sectors; } else { return -3; } } else { return -4; } return -1; # we could not find something } # output the drives and information as tab delimited, foreach my $thisDrive ( sort keys %allDrives ) { #print "$thisDrive\n"; $allDrives{$thisDrive} = getTotalWrites( $thisDrive ); print "$thisDrive\t" . $allDrives{$thisDrive} . "\n" if $allDrives{$thisDrive} > 0; }