#!/bin/bash # this is a big loop # it shows SSD health data exec 2> /dev/null while true; do clear # get all disks DISK_LIST=$(ls -lo /dev/sd? | awk '{print $9}') # process each disk IFS=$'\n' read -rd '' -a DISK_ARRAY <<< "$DISK_LIST" for DISK in "${DISK_ARRAY[@]}"; do # store smartctl data once SMART_DATA=$(smartctl -x $DISK) NVME_CHECK=$(echo "$SMART_DATA" | grep "NVMe Version") SSD_CHECK=$(echo "$SMART_DATA" | grep "Rotation Rate" | grep "Solid State") # if either SATA SSD or NVMe if [ -n "$NVME_CHECK" ] || [ -n "$SSD_CHECK" ]; then BLOCK_SIZE=$(fdisk -l $DISK | grep 'Sector size' | awk '{print $4}' ) # SATA Logic if [ -n "$SSD_CHECK" ] ; then # Set Variables TBW=$(echo "$SMART_DATA" | grep "Logical Sectors Written" | \ awk -v BLOCK_SIZE="$BLOCK_SIZE" '{print $4 * BLOCK_SIZE / (2 ^ 40)}') PLR=$(echo "$SMART_DATA" | grep Percent_Lifetime_Remain | awk '{print $4}') CAPACITY=$(echo "$SMART_DATA" | grep "User Capacity" | cut -d '[' -f 2 | sed 's/]//g') SERIAL=$(echo "$SMART_DATA" | grep "Serial Number" | cut -d ":" -f 2 | xargs) MODEL=$(echo "$SMART_DATA" | grep "Device Model" | cut -d ":" -f 2 | xargs) SMART=$(echo "$SMART_DATA" | grep "self-assessment test result" | cut -d ":" -f 2 | xargs) FLAVOR="SATA SSD" DRIVE_EXISTS=$(curl -s 0.0.0.0:5000/check?serial_lookup=$SERIAL | jq .serial_number_exists) # Display drive data echo "============ $DISK Disk Info - SSD: ============" #echo "DRIVE_EXISTS: $DRIVE_EXISTS" echo "Serial Number: $SERIAL" echo "Model String: $MODEL" echo "SMART Check: $SMART" echo "Disk capacity: $CAPACITY" echo "TB Written: $TBW TB" if [ -z "$PLR" ] ; then echo "Percent Lifetime Remaining data not available" else echo "$DISK has $PLR% lifetime remaining" fi echo # database handler if [ "$DRIVE_EXISTS" == "false" ] ; then #echo "{{ service_folder }}/store_drive.sh -a '$SERIAL,$MODEL,$FLAVOR,$CAPACITY,$TBW,$SMART' -d {{ db_path }}" {{ service_folder }}/store_drive.sh -a "$SERIAL,$MODEL,$FLAVOR,$CAPACITY,$TBW,$SMART" -d {{ db_path }} else #echo "{{ service_folder }}/store_drive.sh -u '$SERIAL,$TBW,$SMART' -d {{ db_path }}" {{ service_folder }}/store_drive.sh -u "$SERIAL,$TBW,$SMART" -d {{ db_path }} fi # NVMe Logic elif [ -n "$NVME_CHECK" ] ; then # Set Variables MODEL=$(echo "$SMART_DATA" | grep "Model Number" | cut -d ":" -f 2 | xargs) SERIAL=$(echo "$SMART_DATA" | grep "Serial Number" | cut -d ":" -f 2 | xargs) TBW=$(echo "$SMART_DATA" | grep "Data Units Written" | sed 's/,//g' | \ awk -v BLOCK_SIZE="$BLOCK_SIZE" '{print $4 * BLOCK_SIZE / (2 ^ 30)}') AVAIL_SPARE=$(echo "$SMART_DATA" | grep "Available Spare:" | cut -d ':' -f 2 | xargs) CAPACITY=$(echo "$SMART_DATA" | grep "amespace 1 Size" | cut -d '[' -f 2 | sed 's/]//g') SMART=$(echo "$SMART_DATA" | grep "self-assessment test result" | cut -d ":" -f 2 | xargs) FLAVOR="NVMe" DRIVE_EXISTS=$(curl -s 0.0.0.0:5000/check?serial_lookup=$SERIAL | jq .serial_number_exists) # Display Disk Info echo "============ $DISK Disk Info - NVMe: ============" #echo "DRIVE_EXISTS: $DRIVE_EXISTS" echo "Serial Number: $SERIAL" echo "Model String: $MODEL" echo "SMART Check: $SMART" echo "Disk capacity: $CAPACITY" echo "TB Written: $TBW TB" echo "NAND spare blocks: $AVAIL_SPARE" echo # database handler if [ "$DRIVE_EXISTS" == "false" ] ; then #echo "{{ service_folder }}/store_drive.sh -a '$SERIAL,$MODEL,$FLAVOR,$CAPACITY,$TBW,$SMART' -d {{ db_path }}" {{ service_folder }}/store_drive.sh -a "$SERIAL,$MODEL,$FLAVOR,$CAPACITY,$TBW,$SMART" -d {{ db_path }} else #echo "{{ service_folder }}/store_drive.sh -u '$SERIAL,$TBW,$SMART' -d {{ db_path }}" {{ service_folder }}/store_drive.sh -u "$SERIAL,$TBW,$SMART" -d {{ db_path }} fi fi else echo "Skipping $DISK, not SATA SSD or NVMe" fi done # wait {{ sleep_time }} seconds, loop again echo "Sleeping {{ sleep_time }} seconds" sleep {{ sleep_time }} done