36-smartd 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #!/bin/bash
  2. # config
  3. MAX_TEMP=40
  4. # set column width
  5. COLUMNS=2
  6. # colors
  7. white="\e[39m"
  8. green="\e[1;32m"
  9. red="\e[1;31m"
  10. dim="\e[2m"
  11. undim="\e[0m"
  12. # disks to check
  13. disks=(sda sdb sdc sdd sde sdf sdg sdi)
  14. logfiles='/var/log/syslog /var/log/syslog.1'
  15. # get all lines with smartd entries from syslog
  16. mapfile -t lines < <(grep -hiP 'smartd\[[[:digit:]]+\]:' $logfiles | grep -iP "(Temperature_Celsius|previous self-test)" | sort -r)
  17. out=""
  18. for i in "${!disks[@]}"; do
  19. disk=${disks[$i]}
  20. uuid=$(blkid -s UUID -o value "/dev/${disk}")
  21. #mapfile -t disklines < <(printf -- '%s\n' "${lines[@]}" | grep "${uuid}")
  22. temp=$(printf -- '%s\n' "${lines[@]}" | grep "${uuid}" | grep -m 1 "Temperature_Celsius" | awk '{ print $NF }')
  23. status=$(printf -- '%s\n' "${lines[@]}" | grep "${uuid}" | grep -m 1 "previous self-test" | awk '{ print $(NF-1),$NF }')
  24. # color green if temp <= MAX_TEMP, else red
  25. if [[ "${temp}" -gt "${MAX_TEMP}" ]]; then
  26. color=$red
  27. else
  28. color=$green
  29. fi
  30. # if temp > 80 assume reading is wrong and set temp to "--"
  31. if [[ "${temp}" -gt 80 ]]; then
  32. temp="--"
  33. fi
  34. # color green if status is "without error", else red
  35. if [[ "${status}" == "without error" ]]; then
  36. status_color=$green
  37. else
  38. status_color=$red
  39. fi
  40. # print temp & smartd error
  41. out+="${disk}:,${color}${temp}C${undim} | ${status_color}${status}${undim},"
  42. # insert \n every $COLUMNS column
  43. if [ $((($i+1) % $COLUMNS)) -eq 0 ]; then
  44. out+="\n"
  45. fi
  46. done
  47. out+="\n"
  48. printf "\nsmartd status:\n"
  49. printf "$out" | column -ts $',' | sed -e 's/^/ /'