#!/bin/sh

COUNT_TOTAL=0
COUNT_OK=0
COUNT_WARN=0
COUNT_CRIT=0
COUNT_UNKNOWN=0
LONG_STATUS_LIST=""

# shellcheck disable=SC2010 # Not supporting some filenames is okay for /dev/
for device in $(ls /dev/ | grep -E '^(sd[a-z]|hd[a-z]|nvme[0-9]+n[0-9]+)$') ; do
	DRIVE_SIZE="$(lsblk -o SIZE -n -r "/dev/$device")"
	if [ "$DRIVE_SIZE" = "0B" ] ; then
		OUTPUT="Skipped because zero size device."
		EXIT_CODE=0
	else
		OUTPUT="$( /usr/lib/nagios/plugins/check_smart.pl -i auto --device "/dev/$device" 2>&1 )"
		EXIT_CODE="$?"
		OUTPUT="$( printf '%s\n' "$OUTPUT" | cut -d'|' -f1 )"
	fi
	if [ -n "$LONG_STATUS_LIST" ] ; then
		LONG_STATUS_LIST="$(printf "%s\n%s (%s): %s" "$LONG_STATUS_LIST" "$device" "$DRIVE_SIZE" "$OUTPUT")"
	else
		LONG_STATUS_LIST="$device ($DRIVE_SIZE): $OUTPUT"
	fi
	COUNT_TOTAL=$(( COUNT_TOTAL + 1 ))
	case "$EXIT_CODE" in
		0)
			COUNT_OK=$(( COUNT_OK + 1 ))
			;;
		1)
			COUNT_WARN=$(( COUNT_WARN + 1 ))
			;;
		3)
			COUNT_UNKNOWN=$(( COUNT_UNKNOWN + 1 ))
			;;
		*)
			COUNT_CRIT=$(( COUNT_CRIT + 1 ))
			;;
	esac
done

if [ "$COUNT_TOTAL" -eq 0 ] ; then
	printf "OK: No disks to check\n"
	exit 0
fi

EXIT_CODE=0
if [ "$COUNT_TOTAL" -eq "$COUNT_OK" ] ; then
	printf "OK: All %s disks are ok\n" "$COUNT_OK"
elif [ "$COUNT_CRIT" -gt 0 ] ; then
	printf "Critical: %s/%s disks have errors\n" "$COUNT_CRIT" "$COUNT_TOTAL"
	EXIT_CODE=2
elif [ "$COUNT_WARN" -gt 0 ] ; then
	printf "Warning: %s/%s disks have warnings\n" "$COUNT_WARN" "$COUNT_TOTAL"
	EXIT_CODE=1
else
	printf "Unknown: %s/%s disks could not be checked\n" "$COUNT_UNKNOWN" "$COUNT_TOTAL"
	EXIT_CODE=1
fi

printf "%s\n" "$LONG_STATUS_LIST"
exit "$EXIT_CODE"

