forked from yboetz/motd
-
Notifications
You must be signed in to change notification settings - Fork 0
/
36-smartd
executable file
·54 lines (49 loc) · 1.58 KB
/
36-smartd
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
#!/bin/bash
# config
MAX_TEMP=40
# set column width
COLUMNS=2
# colors
white="\e[39m"
green="\e[1;32m"
red="\e[1;31m"
dim="\e[2m"
undim="\e[0m"
# disks to check
disks=(sda sdb sdc sdd sde sdf sdg sdi)
logfiles='/var/log/syslog /var/log/syslog.1'
# get all lines with smartd entries from syslog
mapfile -t lines < <(grep -hiP 'smartd\[[[:digit:]]+\]:' $logfiles | grep -iP "(Temperature_Celsius|previous self-test)" | sort -r)
out=""
for i in "${!disks[@]}"; do
disk=${disks[$i]}
uuid=$(blkid -s UUID -o value "/dev/${disk}")
#mapfile -t disklines < <(printf -- '%s\n' "${lines[@]}" | grep "${uuid}")
temp=$(printf -- '%s\n' "${lines[@]}" | grep "${uuid}" | grep -m 1 "Temperature_Celsius" | awk '{ print $NF }')
status=$(printf -- '%s\n' "${lines[@]}" | grep "${uuid}" | grep -m 1 -oP "previous self-test.*" | cut -d' ' -f4-)
# color green if temp <= MAX_TEMP, else red
if [[ "${temp}" -gt "${MAX_TEMP}" ]]; then
color=$red
else
color=$green
fi
# if temp > 80 assume reading is wrong and set temp to "--"
if [[ "${temp}" -gt 80 ]]; then
temp="--"
fi
# color green if status is "without error", else red
if [[ "${status}" == "without error" ]]; then
status_color=$green
else
status_color=$red
fi
# print temp & smartd error
out+="${disk}:,${color}${temp}C${undim} | ${status_color}${status}${undim},"
# insert \n every $COLUMNS column
if [ $((($i+1) % $COLUMNS)) -eq 0 ]; then
out+="\n"
fi
done
out+="\n"
printf "\nsmartd status:\n"
printf "$out" | column -ts $',' | sed -e 's/^/ /'