-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathdisk-status.sh
More file actions
126 lines (101 loc) · 2.9 KB
/
Copy pathdisk-status.sh
File metadata and controls
126 lines (101 loc) · 2.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#!/usr/bin/env bash
# TrueNAS SCALE disk standby checker
# Default: HDDs only
# Use --all to include SSD/NVMe disks as well
#
# Shows:
# - current standby/active state for HDDs
# - TrueNAS disk metadata from midclt
# - WWN persistent disk ID where available
clear
MODE="hdd"
case "$1" in
--all|-a)
MODE="all"
;;
--hdd|-h|"")
MODE="hdd"
;;
--help)
echo "Usage:"
echo " sudo bash ~/diskstatus.sh # HDDs only default"
echo " sudo bash ~/diskstatus.sh --hdd # HDDs only"
echo " sudo bash ~/diskstatus.sh --all # All disks"
exit 0
;;
*)
echo "Unknown option: $1"
echo "Use --help"
exit 1
;;
esac
if [[ $EUID -eq 0 ]]; then
SUDO=""
else
SUDO="sudo"
fi
DISK_JSON="$($SUDO midclt call disk.query 2>/dev/null)"
get_tn_value() {
local devname="$1"
local field="$2"
echo "$DISK_JSON" | jq -r --arg n "$devname" --arg f "$field" '
.[]
| select(.name == $n or .devname == $n)
| .[$f] // empty
' 2>/dev/null | head -n1
}
get_wwn_id() {
local dev="$1"
local path=""
for path in /dev/disk/by-id/wwn-*; do
[[ -L "$path" ]] || continue
[[ "$path" == *-part* ]] && continue
if [[ "$(readlink -f "$path" 2>/dev/null)" == "$dev" ]]; then
echo "$path"
return 0
fi
done
return 1
}
printf "%-12s %-22s %-12s %-10s %-28s %-22s %-24s %-s\n" \
"DEVICE" "STATE" "TYPE" "SIZE" "MODEL" "SERIAL" "TRUENAS_DESC" "WWN_ID"
printf "%-12s %-22s %-12s %-10s %-28s %-22s %-24s %-s\n" \
"------" "-----" "----" "----" "-----" "------" "------------" "------"
for d in /sys/block/sd* /sys/block/nvme*n1; do
[[ -e "$d" ]] || continue
dev="/dev/$(basename "$d")"
devname="$(basename "$dev")"
rota="$(cat "$d/queue/rotational" 2>/dev/null)"
# Default mode: only show HDDs
if [[ "$MODE" = "hdd" && "$rota" != "1" ]]; then
continue
fi
size="$(lsblk -ndo SIZE "$dev" 2>/dev/null | sed 's/ //g')"
tran="$(lsblk -ndo TRAN "$dev" 2>/dev/null | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')"
tn_desc="$(get_tn_value "$devname" "description")"
tn_model="$(get_tn_value "$devname" "model")"
tn_serial="$(get_tn_value "$devname" "serial")"
tn_type="$(get_tn_value "$devname" "type")"
tn_bus="$(get_tn_value "$devname" "bus")"
model="${tn_model:-unknown}"
serial="${tn_serial:-unknown}"
disk_type="${tn_type:-unknown}"
bus="${tn_bus:-$tran}"
[[ -z "$bus" ]] && bus="unknown"
[[ -z "$size" ]] && size="unknown"
[[ -z "$tn_desc" ]] && tn_desc="-"
wwn_id="$(get_wwn_id "$dev")"
[[ -z "$wwn_id" ]] && wwn_id="-"
if [[ "$rota" = "1" ]]; then
out="$($SUDO smartctl -n standby -i "$dev" 2>&1)"
if echo "$out" | grep -qi "STANDBY"; then
state="STANDBY/spun down"
else
state="active or idle"
fi
else
state="SSD/NVMe - skipped"
fi
printf "%-12s %-22s %-12s %-10s %-28s %-22s %-24s %-s\n" \
"$dev" "$state" "$disk_type/$bus" "$size" "$model" "$serial" "$tn_desc" "$wwn_id"
done