-
Notifications
You must be signed in to change notification settings - Fork 106
/
36-diskstatus
executable file
·69 lines (60 loc) · 1.77 KB
/
36-diskstatus
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
#!/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)
disknames=(sda sdb sdc sdd sde sdf sdg sdi)
# hddtemp
hddtemp_host=localhost
hddtemp_port=7634
# logfiles to check
logfiles='/var/log/syslog /var/log/syslog.1'
# get all lines with smartd entries from syslog
lines=$(tac $logfiles | grep -hiP 'smartd\[[[:digit:]]+\]:' | grep -iP "previous self-test")
# use nc to query temps from hddtemp daemon
hddtemp=$(timeout 0.01 nc $hddtemp_host $hddtemp_port | sed 's/|//m' | sed 's/||/ \n/g')
out=""
for i in "${!disks[@]}"; do
disk=${disks[$i]}
# use disknames if given
diskname=${disknames[$i]}
if [ -z "${diskname}" ]; then
diskname=$disk
fi
uuid=$(blkid -s UUID -o value "/dev/${disk}")
status=$( (grep "${uuid}" <<< "${lines}") | grep -m 1 -oP "previous self-test.*" | awk '{ print $4 " " $5 }')
temp=$( (grep "${disk}" <<< "${hddtemp}") | awk -F'|' '{ print $3 }')
# color green if temp <= MAX_TEMP, else red
if [[ "${temp}" -gt "${MAX_TEMP}" ]]; then
color=$red
else
color=$green
fi
# add "C" if temp is numeric
if [[ "$temp" =~ ^[0-9]+$ ]]; then
temp="${temp}C"
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+="${diskname}:,${color}${temp}${undim} | ${status_color}${status}${undim},"
# insert \n every $COLUMNS column
if [ $((($i+1) % $COLUMNS)) -eq 0 ]; then
out+="\n"
fi
done
out+="\n"
printf "\ndisk status:\n"
printf "$out" | column -ts $',' | sed -e 's/^/ /'