#!/bin/bash

SMARTCTL="smartctl"


if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root" 1>&2
   exit 1
fi


if [[ -z "$1" ]]
then
	DEVICE="/dev/sda"
else
	DEVICE="$1"
fi


if [ ! -b "${DEVICE}" ]
then
	if [ ! -b "/dev/${DEVICE}" ]
	then
		echo "No device given or given device not a block device."
		echo "Call this script with the devicename of the SSD."
		echo "E.g.: ./ssd.sh /dev/sda"
		exit
	else
		DEVICE="/dev/${DEVICE}"
	fi
fi


OLDDIR=`pwd`

abspath="$(cd "${0%/*}" 2>/dev/null; echo "$PWD"/"${0##*/}")"
path_only=`dirname "$abspath"`
cd ${path_only}

SMARTINFO=`${SMARTCTL} ${DEVICE} -i | grep ": " | sed -r 's/ +/*/g'`
SMARTVALUES=`${SMARTCTL} ${DEVICE} -A -v N,raw64 | grep 0x0000 | sed 's/0x0000.*-//' | sed -r 's/^ +//' | sed -r 's/ +/*/g'`
TRIMINFO=`hdparm -I ${DEVICE} | grep TRIM`

ID1="Raw_Read_Error_Rate"
ID9="Power_On_Hours"
ID12="Power_Cycle_Count"
ID184="Initial_Bad_Block_Count"
ID195="Program_Failure_Blk_Ct"
ID196="Erase_Failure_Blk_Ct"
ID197="Read_Failure_Blk_Ct"
ID198="Read_Sectors_Tot_Ct"
ID199="Write_Sectors_Tot_Ct"
ID200="Read_Commands_Tot_Ct"
ID201="Write_Commands_Tot_Ct"
ID202="Error_Bits_Flash_Tot_Ct"
ID203="Corr_Read_Errors_Tot_Ct"
ID204="Bad_Block_Full_Flag"
ID205="Max_PE_Count_Spec"
ID206="Min_Erase_Count"
ID207="Max_Erase_Count"
ID208="Average_Erase_Count"
ID209="Remaining_Life_Time"

for LINE in ${SMARTINFO}
do
	if [[ -n `echo ${LINE} | grep -i "device\*model"` ]]
	then
		MODEL=`echo ${LINE} | cut -d* -f3`
	fi

	if [[ -n `echo ${LINE} | grep -i "serial\*number"` ]]
	then
		SERIAL=`echo ${LINE} | cut -d* -f3`
	fi

	if [[ -n `echo ${LINE} | grep -i "firmware\*version"` ]]
	then
		FIRMWARE=`echo ${LINE} | cut -d* -f3`
	fi

	if [[ -n `echo ${LINE} | grep -i "user\*capacity"` ]]
	then
		SIZE=`echo ${LINE} | cut -d* -f3 | sed 's/\.//g' | sed 's/,//g'`
	fi
done

for LINE in ${SMARTVALUES}
do
	ID=`echo ${LINE} | cut -d* -f1`
	VALUE=`echo ${LINE} | cut -d* -f3`

	if [ "${ID}" = "1" ]; then
		RAW_READ_ERROR_RATE=${VALUE}
	fi

	if [ "${ID}" = "9" ]; then
		POWER_ON_HOURS=${VALUE}
	fi

	if [ "${ID}" = "12" ]; then
		POWER_CYCLE_COUNT=${VALUE}
	fi

	if [ "${ID}" = "184" ]; then
		INITIAL_BAD_BLOCK_COUNT=${VALUE}
	fi

	if [ "${ID}" = "195" ]; then
		PROGRAM_FAILURE_BLK_CT=${VALUE}
	fi

	if [ "${ID}" = "196" ]; then
		ERASE_FAILURE_BLK_CT=${VALUE}
	fi

	if [ "${ID}" = "197" ]; then
		READ_FAILURE_BLK_CT=${VALUE}
	fi

	if [ "${ID}" = "198" ]; then
		READ_SECTORS_TOT_CT=${VALUE}
	fi

	if [ "${ID}" = "199" ]; then
		WRITE_SECTORS_TOT_CT=${VALUE}
	fi

	if [ "${ID}" = "200" ]; then
		READ_COMMANDS_TOT_CT=${VALUE}
	fi

	if [ "${ID}" = "201" ]; then
		WRITE_COMMANDS_TOT_CT=${VALUE}
	fi

	if [ "${ID}" = "202" ]; then
		ERROR_BITS_FLASH_TOT_CT=${VALUE}
	fi

	if [ "${ID}" = "203" ]; then
		CORR_READ_ERRORS_TOT_CT=${VALUE}
	fi

	if [ "${ID}" = "204" ]; then
		BAD_BLOCK_FULL_FLAG=${VALUE}
	fi

	if [ "${ID}" = "205" ]; then
		MAX_PE_COUNT_SPEC=${VALUE}
	fi

	if [ "${ID}" = "206" ]; then
		MIN_ERASE_COUNT=${VALUE}
	fi

	if [ "${ID}" = "207" ]; then
		MAX_ERASE_COUNT=${VALUE}
	fi

	if [ "${ID}" = "208" ]; then
		AVERAGE_ERASE_COUNT=${VALUE}
	fi

	if [ "${ID}" = "209" ]; then
		REMAINING_LIFE_TIME=${VALUE}
	fi
done

if [[ -n "${TRIMINFO}" ]]
then
	TRIM="Yes"
else
	TRIM="No"
fi

#echo "Model:           ${MODEL}"
#echo "Serialnumber:    `echo ${SERIAL} | sed -r "s/.{5}$/*****/"`"
#echo "Firmware / TRIM: ${FIRMWARE} / ${TRIM}"
#echo "Size:            `echo "scale=3; ${SIZE}/1024/1024/1024" | bc -l` GB"
#echo "Status:          ${REMAINING_LIFE_TIME}%"
#echo "Power on time:   ${POWER_ON_HOURS} Stunden"
#echo "Power cycles:    ${POWER_CYCLE_COUNT} mal"
#echo "Cell wear level: ${AVERAGE_ERASE_COUNT} (${MIN_ERASE_COUNT} / ${MAX_ERASE_COUNT}) [avg (min / max)]"
#echo "Read:            `echo "scale=3; ${READ_SECTORS_TOT_CT}*512/1024/1024/1024" | bc -l` GB"
#echo "Written:         `echo "scale=3; ${WRITE_SECTORS_TOT_CT}*512/1024/1024/1024" | bc -l` GB"

READ=`echo "scale=3; ${READ_SECTORS_TOT_CT}*512/1024/1024/1024" | bc -l`
WRITTEN=`echo "scale=3; ${WRITE_SECTORS_TOT_CT}*512/1024/1024/1024" | bc -l`
echo `date "+%F %H:%M:%S"` $READ $WRITTEN ${AVERAGE_ERASE_COUNT} ${MIN_ERASE_COUNT} ${MAX_ERASE_COUNT} ${REMAINING_LIFE_TIME} ${POWER_ON_HOURS} ${POWER_CYCLE_COUNT} ${RAW_READ_ERROR_RATE} ${PROGRAM_FAILURE_BLK_CT} ${ERASE_FAILURE_BLK_CT} ${READ_FAILURE_BLK_CT} ${READ_SECTORS_TOT_CT} ${WRITE_SECTORS_TOT_CT} ${READ_COMMANDS_TOT_CT} ${WRITE_COMMANDS_TOT_CT} ${ERROR_BITS_FLASH_TOT_CT} ${CORR_READ_ERRORS_TOT_CT} >>/var/log/ssd.log

cd ${OLDDIR}

