92 lines
5.0 KiB
Bash
92 lines
5.0 KiB
Bash
#!/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 15 seconds, loop again
|
|
echo "Sleeping 15 seconds so you can read this"
|
|
sleep 15
|
|
done
|