| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- #!/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/^/ /'
|