utils: import S.M.A.R.T. statistics monitor script for NetBSD
authorMatthew Mondor <mmondor@pulsar-zone.net>
Sat, 11 Feb 2017 13:13:40 +0000 (13:13 +0000)
committerMatthew Mondor <mmondor@pulsar-zone.net>
Sat, 11 Feb 2017 13:13:40 +0000 (13:13 +0000)
mmsoftware/util/smart-alert.sh [new file with mode: 0755]

diff --git a/mmsoftware/util/smart-alert.sh b/mmsoftware/util/smart-alert.sh
new file mode 100755 (executable)
index 0000000..76edf42
--- /dev/null
@@ -0,0 +1,40 @@
+#!/bin/sh
+
+# For each disk, query SMART statistics and report critical issues
+
+# Number of expected disks (wd* and sd*), to warn if one is missing
+EXPECTED_NDISKS=6
+
+SYSCTL=/sbin/sysctl
+TR=/usr/bin/tr
+EGREP=/usr/bin/egrep
+WC=/usr/bin/wc
+ATACTL=/sbin/atactl
+AWK=/usr/bin/awk
+
+disks=$($SYSCTL -n hw.disknames | $TR ' ' "\n" | $EGREP wd\|sd)
+ndisks=$(echo "$disks" | $WC -l)
+ndisks=$(($ndisks))
+
+code=0
+alert()
+{
+       printf 1>&2 "%s\n" "$@"
+       code=1
+}
+
+if [ $ndisks -ne $EXPECTED_NDISKS ]; then
+       alert "Number of disks ($ndisks) is not $EXPECTED_NDISKS!"
+fi
+
+for disk in $disks; do
+       stats=$($ATACTL $disk smart status) || \
+               alert "$disk: Could not query SMART statistics"
+       warnings=$(echo "$STATS" | $AWK '{w = 0; if (int($1) < 1) next; if (($1 == 5 || $1 == 196) && $NF > 0) {print $1, "=", $NF; w = 1} if ($6 != "positive") { print $1, "= negative"; w = 1}; if (w == 1) {for (i = 1; i < 7; i++) $i = ""; $NF = ""; print $0}}')
+       if [ -n "$warnings" ]; then
+               alert "$disk:"
+               alert "$warnings"
+       fi
+done
+
+exit $code