diff --git a/driveAtlas.sh b/driveAtlas.sh index dd78ea4..bbdb484 100644 --- a/driveAtlas.sh +++ b/driveAtlas.sh @@ -54,28 +54,51 @@ medium1=''' └─────────────────────────────────────────────────────────────┘ ''' -medium2=''' +generate_medium2_layout() { + local usb_drives=$(ls -l /dev/disk/by-path/pci-0000:0b:00.0* | awk -F'/' '{print $NF}') + local sata_drives=$(ls -l /dev/disk/by-path/pci-0000:0c:00.0-ata-* | grep -v "part" | awk -F'/' '{print $NF}') + local nvme_drive=$(ls -l /dev/disk/by-path/pci-0000:0d:00.0* | awk -F'/' '{print $NF}') + + echo " External USB [0b:00.0]" + for usb in $usb_drives; do + size=$(get_drive_details $usb) + smart_info=$(get_drive_smart_info $usb) + echo " ┌────────────────────┐" + echo " │ $usb ($size) │" + echo " │ $smart_info │" + echo " └────────────────────┘" + done + + cat << EOF ┌──────────────────────────────────────────────────────────────┐ +│ B650D4U3-2Q/BCM │ │ │ +│ NVMe [0d:00.0] │ +│ ┌────────────────────┐ │ +│ │ $nvme_drive │ │ +│ │ $(get_drive_smart_info $nvme_drive) │ +│ └────────────────────┘ │ │ │ -│ │ -│ │ -│ medium2 │ -│ │ -│ │ -│ │ -│ ┌────┐┌────┐┌────┐┌────┐┌────┐┌────┐┌────┐┌────┐┌────┐┌────┐ │ -│ │ ││ ││ ││ ││ ││ ││ ││ ││ ││ │ │ -│ │ ││ ││ ││ ││ ││ ││ ││ ││ ││ │ │ -│ │ ││ ││ ││ ││ ││ ││ ││ ││ ││ │ │ -│ │ 1 ││ 2 ││ 3 ││ 4 ││ 5 ││ 6 ││ 7 ││ 8 ││ 9 ││ 10 │ │ -│ │ ││ ││ ││ ││ ││ ││ ││ ││ ││ │ │ -│ │ ││ ││ ││ ││ ││ ││ ││ ││ ││ │ │ -│ │ ││ ││ ││ ││ ││ ││ ││ ││ ││ │ │ -│ └────┘└────┘└────┘└────┘└────┘└────┘└────┘└────┘└────┘└────┘ │ -│ │ -└──────────────────────────────────────────────────────────────┘ -''' +│ Front Hot-swap Bays [0c:00.0] │ +EOF + + for i in {1..10}; do + drive=$(echo "$sata_drives" | grep "ata-$i" || echo "empty") + if [ "$drive" != "empty" ]; then + size=$(get_drive_details $drive) + smart_info=$(get_drive_smart_info $drive) + echo "│ ┌────────────────────┐ │" + echo "│ │ Bay $i: $drive │ │" + echo "│ │ $size | $smart_info│ │" + echo "│ └────────────────────┘ │" + else + echo "│ ┌────────────────────┐ │" + echo "│ │ Bay $i: [EMPTY] │ │" + echo "│ └────────────────────┘ │" + fi + done + echo "└──────────────────────────────────────────────────────────────┘" +} microGeneric=''' ┌─┐ ┌─┐ @@ -103,7 +126,7 @@ case "$HOSTNAME" in echo -e "$medium1" ;; "medium2") - echo -e "$medium2" + generate_medium2_layout ;; "micro1" | "micro2") echo -e "$microGeneric" @@ -125,6 +148,49 @@ map_drives_to_layout() { esac } +get_device_info() { + local pci_addr=$1 + local info=$(lspci -s "$pci_addr") + echo "$info" +} + +get_drive_details() { + local device=$1 + local size=$(lsblk -d -o NAME,SIZE | grep "$device" | awk '{print $2}') + echo "$size" +} + +get_drive_smart_info() { + local device=$1 + local smart_info=$(sudo smartctl -A -i -H /dev/$device 2>/dev/null) + local temp=$(echo "$smart_info" | grep "Temperature" | awk '{print $10}' | head -1) + local type=$(echo "$smart_info" | grep "Rotation Rate" | grep -q "Solid State" && echo "SSD" || echo "HDD") + local health=$(echo "$smart_info" | grep "SMART overall-health" | grep -q "PASSED" && echo "✓" || echo "✗") + local model=$(echo "$smart_info" | grep "Device Model" | cut -d: -f2 | xargs) + + echo "$type|$temp°C|$health|$model" +} + +#get_drive_details() { +# local position=$1 +# # Get drive info from lsblk and nvme list +# local drive_info=$(lsblk -d -o NAME,SIZE,TYPE | grep "disk") +# local nvme_info=$(sudo nvme list 2>/dev/null) +# +# # Map position to drive using DRIVE_PATHS +# local drive_path=$(echo "$DRIVE_PATHS" | grep "position$position" || echo "") +# +# if [ -z "$drive_path" ]; then +# echo "[EMPTY]" +# return +# fi +# +# local device_name=$(basename $(readlink -f "$drive_path")) +# local size=$(echo "$drive_info" | grep "$device_name" | awk '{print $2}') +# +# echo "$device_name $size" +#} + # Enhanced Drive Information Function get_drives_info() { local path="/dev/disk/by-path" @@ -135,6 +201,27 @@ get_drives_info() { done } +update_ascii_layout() { + local layout="$1" + + for i in {1..9}; do + local drive_details=$(get_drive_details $i) + if [[ "$drive_details" == "[EMPTY]" ]]; then + layout=${layout//│ $i │/│ [EMPTY] │} + else + layout=${layout//│ $i │/│ $drive_details │} + fi + done + + # Update NVMe slots in motherboard + local nvme1=$(get_drive_details "nvme0") + local nvme2=$(get_drive_details "nvme1") + layout=${layout//│M1│/│${nvme1:0:3}│} + layout=${layout//│M2│/│${nvme2:0:3}│} + + echo "$layout" +} + DRIVE_PATHS=$(get_drives_info | awk '{print $1, $2}') # Initialize array for "not found" messages