85 lines
1.9 KiB
Bash
85 lines
1.9 KiB
Bash
#!/bin/sh
|
|
# This script is in the public domain. Original author: Garrett Wollman
|
|
#
|
|
# $FreeBSD$
|
|
#
|
|
|
|
if [ -r /etc/defaults/periodic.conf ]; then
|
|
. /etc/defaults/periodic.conf
|
|
source_periodic_confs
|
|
fi
|
|
|
|
smartctl=%%PREFIX%%/sbin/smartctl
|
|
: ${daily_status_smartctl_flags="-H"}
|
|
: ${daily_status_smartctl_extra_status_flags="-a"}
|
|
|
|
case "${daily_status_smart_devices}" in
|
|
# XXX AUTO mode selects only regular ad/da disks
|
|
[Aa][Uu][Tt][Oo])
|
|
daily_status_smart_devices="$(sysctl -n kern.disks | sed -E 's/[[:<:]](cd|ar)[0-9]+//g')"
|
|
;;
|
|
*) ;;
|
|
esac
|
|
|
|
if [ -z "${daily_status_smart_devices}" ]; then
|
|
: ${daily_status_smart_enable="NO"}
|
|
else
|
|
: ${daily_status_smart_enable="YES"}
|
|
fi
|
|
|
|
trim_junk="tail -n +4"
|
|
|
|
tmpfile="$(mktemp -t daily)"
|
|
trap "rm -f ${tmpfile}" 0 1 3 15
|
|
|
|
rc=0
|
|
case "${daily_status_smart_enable}" in
|
|
[Yy][Ee][Ss])
|
|
echo
|
|
echo 'SMART status:'
|
|
cd /dev
|
|
for device in ${daily_status_smart_devices}; do
|
|
device="${device#/dev/}"
|
|
devflags=""
|
|
case ${device} in
|
|
tw[aes]*) devflags="-d3ware,${device##tw[aes][0-9]*,}"
|
|
device="/dev/${device%,[0-9]*}"
|
|
;;
|
|
ciss*) devflags="-dcciss,${device##ciss[0-9]*,}"
|
|
device="/dev/${device%,[0-9]*}"
|
|
;;
|
|
/*) ;;
|
|
*) device="/dev/${device}"
|
|
;;
|
|
esac
|
|
|
|
if [ -e ${device} ]; then
|
|
echo -n "Checking health of ${device}"
|
|
if [ -n "${devflags}" ]; then
|
|
echo -n " (${devflags})"
|
|
fi
|
|
echo -n ": "
|
|
|
|
${smartctl} ${devflags} ${daily_status_smartctl_flags} ${device} > "${tmpfile}"
|
|
status=$?
|
|
if [ ${status} -eq 0 ]; then
|
|
echo "OK"
|
|
elif [ ${status} -eq 32 ]; then
|
|
echo "OK (but has failed in the past)"
|
|
elif [ $((status & 3)) -ne 0 ]; then
|
|
rc=2
|
|
${trim_junk} "${tmpfile}"
|
|
elif [ `grep -c '^SMART support is: Unavailable' ${tmpfile}` -eq 1 ] ; then
|
|
rc=2
|
|
echo "N/A"
|
|
else
|
|
rc=1
|
|
${smartctl} ${devflags} ${daily_status_smartctl_extra_status_flags} \
|
|
${device} | ${trim_junk}
|
|
fi
|
|
fi
|
|
done
|
|
;;
|
|
esac
|
|
|
|
exit "${rc}"
|