#!/bin/bash # Ustawienie progów temperatury PROG_CPU=50 # Próg dla temperatury CPU PROG_SSD=35 # Próg dla SSD OS PROG_NVME=35 # Próg dla dysków NVMe PROG_PROXMOX=40 # Próg dla Proxmox Backup Server DOMYSLNY_PROG=40 # Domyslny próg temperatury dla dysków PROG_OBCIAZENIA=80 # Próg dla obciazenia dysków (%util) # Konfiguracja e-mail EMAIL="oskar@ipv4.pl" TEMAT="Wykryto wysoka temperature dysku lub CPU albo wysokie obciazenie!" OD="HomeLAB " HOSTNAME=$(hostname) # Inicjalizacja zmiennej na tresc wiadomosci tresc_emaila="Subject: $TEMAT\nFrom: $OD\nTo: $EMAIL\n\nAlert na $HOSTNAME:\n\n" # Flaga do sprawdzenia, czy którys z komponentów przekroczyl próg czy_alert=false # Funkcja do sprawdzania temperatur CPU z polecenia sensors sprawdz_temp_cpu() { # Pobranie tylko linii temp1 do temp6 z polecenia sensors wynik_sensors=$(sensors | grep -E '^temp[1-6]:') # Wydobycie wszystkich temperatur i znalezienie najwyzszej najwyzsza_temp=$(echo "$wynik_sensors" | awk '{print $2}' | tr -d '+' | tr -d '°C' | sort -nr | head -n 1) echo "" echo "Najwyzsza temperatura CPU: ${najwyzsza_temp}°C" echo "" # Konwersja najwyzszej temperatury na wartosc calkowita, aby porównac z progiem najwyzsza_temp_int=$(printf "%.0f" "$najwyzsza_temp") # Sprawdzenie, czy najwyzsza temperatura przekracza próg CPU if (( najwyzsza_temp_int > PROG_CPU )); then echo "UWAGA: Najwyzsza temperatura CPU przekracza ${PROG_CPU}°C!" tresc_emaila+="Najwyzsza temperatura CPU: ${najwyzsza_temp}°C\n\n" czy_alert=true fi } # Funkcja do sprawdzania temperatur dysków i numerów seryjnych sprawdz_temp_dyskow() { echo "# SSD OS" dysk="/dev/sdd" sprawdz_dysk_ssd "$dysk" $PROG_SSD "SSD OS" echo "" # Sprawdzanie dysków NVMe echo -e "\n# NVMe" for dysk in /dev/nvme0n1 /dev/nvme1n1; do temp=$(sudo nvme smart-log "$dysk" | grep -i 'temperature' | grep -o '[0-9]\+' | head -n 1) rozmiar=$(lsblk -o NAME,SIZE | grep -w $(basename "$dysk") | awk '{print $2}') echo "Dysk: $dysk - Rozmiar: $rozmiar - Temperatura: ${temp}°C" if (( temp > PROG_NVME )); then echo "UWAGA: Temperatura dysku NVMe przekracza ${PROG_NVME}°C!" tresc_emaila+="# NVMe\nDysk: $dysk - Rozmiar: $rozmiar - Temperatura: ${temp}°C\n\n" czy_alert=true fi # Sprawdzanie obciazenia dysku sprawdz_obciazenie_dysku "$dysk" echo "" done # Sprawdzanie dysków TrueNAS Raid1 echo -e "\n# TrueNAS Raid1" for dysk in /dev/sdb /dev/sdc; do sprawdz_dysk "$dysk" $DOMYSLNY_PROG "TrueNAS Raid1" echo "" done # Sprawdzanie dysków Movies / Seriale echo -e "\n# Movies / Seriale" for dysk in /dev/sda /dev/sdg; do sprawdz_dysk "$dysk" $DOMYSLNY_PROG "Movies / Seriale" echo "" done # Sprawdzanie dysku Downloaded echo -e "\n# Downloaded" dysk="/dev/sdh" sprawdz_dysk "$dysk" $DOMYSLNY_PROG "Downloaded" echo "" # Sprawdzanie dysków Proxmox Backup Server echo -e "\n# Proxmox Backup Server" for dysk in /dev/sdf /dev/sde; do sprawdz_dysk "$dysk" $PROG_PROXMOX "Proxmox Backup Server" echo "" done } # Funkcja do sprawdzania temperatury i obciazenia poszczególnych dysków sprawdz_dysk_ssd() { local dysk=$1 local prog=$2 local etykieta=$3 wynik_smartctl=$(sudo smartctl -a "$dysk") temp=$(echo "$wynik_smartctl" | awk '/Temperature_Celsius|Temperature:/ {print $10; exit}') rozmiar=$(lsblk -o NAME,SIZE | grep -w $(basename "$dysk") | awk '{print $2}') echo "Dysk: $dysk - Rozmiar: $rozmiar - Temperatura: ${temp}°C" if (( temp > prog )); then echo "UWAGA: Temperatura dysku $etykieta przekracza ${prog}°C!" tresc_emaila+="# $etykieta\nDysk: $dysk - Rozmiar: $rozmiar - Temperatura: ${temp}°C\n\n" czy_alert=true fi # Sprawdzanie obciazenia dysku sprawdz_obciazenie_dysku "$dysk" "$etykieta" } sprawdz_dysk() { local dysk=$1 local prog=$2 local etykieta=$3 wynik_smartctl=$(sudo smartctl -a "$dysk") temp=$(echo "$wynik_smartctl" | awk '/Temperature_Celsius|Temperature:/ {print $10; exit}') serial=$(echo "$wynik_smartctl" | awk '/Serial Number:/ {print $3; exit}') rozmiar=$(lsblk -o NAME,SIZE | grep -w $(basename "$dysk") | awk '{print $2}') echo "Dysk: $dysk - Rozmiar: $rozmiar - Temperatura: ${temp}°C - Numer seryjny: $serial" if (( temp > prog )); then echo "UWAGA: Temperatura dysku $etykieta przekracza ${prog}°C!" tresc_emaila+="# $etykieta\nDysk: $dysk - Rozmiar: $rozmiar - Temperatura: ${temp}°C - Numer seryjny: $serial\n\n" czy_alert=true fi # Sprawdzanie obciazenia dysku sprawdz_obciazenie_dysku "$dysk" "$etykieta" } # Funkcja do sprawdzania obciazenia dysku sprawdz_obciazenie_dysku() { local dysk=$1 local etykieta=$2 # Uruchomienie iostat i zapisanie wyników dwóch cykli do zmiennej wynik=$(iostat -dx "$dysk" 1 2) # Wyciagniecie drugiego odczytu drugi_odczyt=$(echo "$wynik" | awk 'NR>6 {print}' | tail -n 1) # Wyciagniecie %util z drugiego odczytu obciazenie=$(echo "$drugi_odczyt" | awk '{print $(NF)}') # Wyswietlenie tylko wartosci obciazenia echo "Dysk: $dysk - Obciazenie: $obciazenie%" # Sprawdzenie, czy obciazenie przekracza próg obciazenie_int=$(printf "%.0f" "$obciazenie") if (( obciazenie_int > PROG_OBCIAZENIA )); then echo "UWAGA: Obciazenie dysku $etykieta przekracza ${PROG_OBCIAZENIA}%!" tresc_emaila+="# $etykieta\nDysk: $dysk - Obciazenie: $obciazenie%\n\n" czy_alert=true fi } # Sprawdz temperatury CPU z sensors sprawdz_temp_cpu # Sprawdz temperatury dysków i numery seryjne sprawdz_temp_dyskow # Jesli którys z komponentów przekroczyl próg, wyslij e-mail if [ "$czy_alert" = true ]; then echo -e "$tresc_emaila" | sudo sendmail -t else echo "Zaden komponent nie przekroczyl ustalonych progów." fi