[root@Triforce] /mnt/Baldr/bin# cat -e Script1
#!/bin/sh$
$
### Parameters ###$
logfile="/tmp/smart_report.tmp"$
email="jh***@gmail.com"$
subject="SMART Status Report for FreeNAS"$
drives=`sysctl -n kern.disks | awk '{for (i=NF; i!=0 ; i--) print $i }'`$
tempWarn=40$
tempCrit=45$
sectorsCrit=10$
warnSymbol="?"$
critSymbol="!"$
$
### Set email headers ###$
($
echo "To: ${email}"$
echo "Subject: ${subject}"$
echo "Content-Type: text/html"$
echo "MIME-Version: 1.0"$
echo -e "\r\n"$
) > ${logfile}$
$
### Set email body ###$
echo "<pre style=\"font-size:14px\">" >> ${logfile}$
$
###### summary ######$
($
echo ""$
echo "########## SMART status report summary for all drives ##########"$
echo ""$
echo "+------+---------------+----+-----+-----+-----+-------+-------+------- -+------+----------+------+-------+"$
echo "|Device|Serial |Temp|Power|Start|Spin |ReAlloc|Current|Offline |Seek |Total |High |Command|"$
echo "| | | |On |Stop |Retry|Sectors|Pending|Uncorre c|Errors|Seeks |Fly |Timeout|"$
echo "| | | |Hours|Count|Count| |Sectors|Sectors | | |Writes|Count |"$
echo "+------+---------------+----+-----+-----+-----+-------+-------+------- -+------+----------+------+-------+"$
) >> ${logfile}$
for drive in $drives$
do$
($
smartctl -A -i -v 7,hex48 /dev/${drive} | \$
awk -v device=${drive} -v tempWarn=${tempWarn} -v tempCrit=${tempCrit} - v sectorsCrit=${sectorsCrit} -v warnSymbol=${warnSymbol} -v $
critSymbol=${critSymbol} '\$
/Serial Number:/{serial=$3} \$
/Temperature_Celsius/{temp=$10} \$
/Power_On_Hours/{onHours=$10} \$
/Start_Stop_Count/{startStop=$10} \$
/Spin_Retry_Count/{spinRetry=$10} \$
/Reallocated_Sector/{reAlloc=$10} \$
/Current_Pending_Sector/{pending=$10} \$
/Offline_Uncorrectable/{offlineUnc=$10} \$
/Seek_Error_Rate/{seekErrors=("0x" substr($10,3,4));totalSeeks=("0x" sub str($10,7))} \$
/High_Fly_Writes/{hiFlyWr=$10} \$
/Command_Timeout/{cmdTimeout=$10} \$
END {$
if (temp > tempCrit || reAlloc > sectorsCrit || pending > sectorsCri t || offlineUnc > sectorsCrit) device=device " " critSymbol;$
else if (temp > tempWarn || reAlloc > 0 || pending > 0 || offlineUnc > 0) device=device " " warnSymbol;$
seekErrors=sprintf("%d", seekErrors);$
totalSeeks=sprintf("%d", totalSeeks);$
if (totalSeeks == "0") {$
seekErrors="N/A";$
totalSeeks="N/A";$
}$
if (hiFlyWr == "") hiFlyWr="N/A";$
if (cmdTimeout == "") cmdTimeout="N/A";$
printf "|%-6s|%-15s| %s |%5s|%5s|%5s|%7s|%7s|%8s|%6s|%10s|%6s|%7s|\n ",$
device, serial, temp, onHours, startStop, spinRetry, reAlloc, pendin g, offlineUnc, seekErrors, totalSeeks, hiFlyWr, cmdTimeout;$
}'$
) >> ${logfile}$
done$
($
echo "+------+---------------+----+-----+-----+-----+-------+-------+------- -+------+----------+------+-------+"$
echo ""$
echo ""$
) >> ${logfile}$
$
###### for each drive ######$
for drive in $drives$
do$
brand=`smartctl -i /dev/${drive} | grep "Model Family" | awk '{print $3, $4, $5}'`$
serial=`smartctl -i /dev/${drive} | grep "Serial Number" | awk '{print $3}'` $
($
echo ""$
echo "########## SMART status report for ${drive} drive (${brand}: ${ser ial}) ##########"$
smartctl -n never -H -A -l error /dev/${drive}$
smartctl -n never -l selftest /dev/${drive} | grep "# 1 \|Num" | cut -c6 -$
echo ""$
echo ""$
) >> ${logfile}$
done$
sed -i '' -e '/smartctl 6.3/d' ${logfile}$
sed -i '' -e '/Copyright/d' ${logfile}$
sed -i '' -e '/=== START OF READ/d' ${logfile}$
sed -i '' -e '/SMART Attributes Data/d' ${logfile}$
sed -i '' -e '/Vendor Specific SMART/d' ${logfile}$
sed -i '' -e '/SMART Error Log Version/d' ${logfile}$
echo "</pre>" >> ${logfile}$
$
### Send report ###$
sendmail -t < ${logfile}$
rm ${logfile}$