#!/bin/bash
# Мониторинг температуры HDD и NVMe через Uptime Kuma Push API.

set -uo pipefail

# Настройки
PUSH_URL="http://127.0.0.1:3002/api/push/ВСТАВЬ_ТОКЕН"

HDD_DEVICE="/dev/sda"
NVME_DEVICE="/dev/nvme0n1"

THRESHOLD=75
LOG="/var/log/kuma-hdd-temp.log"

# Отправка состояния в Uptime Kuma
push_status() {
    local status="$1"
    local message="$2"

    if curl -fsS --max-time 15 -G "$PUSH_URL" \
        --data-urlencode "status=$status" \
        --data-urlencode "msg=$message"; then

        echo "$(date '+%F %T') pushed: $status ($message)" >> "$LOG"
    else
        echo "$(date '+%F %T') push FAILED: $status ($message)" >> "$LOG"
        return 1
    fi
}

# Получение температуры HDD
read_hdd_temp() {
    smartctl -A "$HDD_DEVICE" 2>/dev/null |
        awk '/Temperature_Celsius/ {
            if ($NF ~ /^[0-9]+$/) {
                print $NF
                exit
            }
        }'
}

# Получение максимальной температуры NVMe
read_nvme_temp() {
    smartctl -A "$NVME_DEVICE" 2>/dev/null |
        awk '
            /^[[:space:]]*Temperature(:| Sensor)/ {
                for (i = 1; i <= NF; i++) {
                    if ($i == "Celsius" && i > 1 &&
                        $(i-1) ~ /^[0-9]+$/) {
                        if ($(i-1) > max) max = $(i-1)
                    }
                }
            }
            END {
                if (max > 0) print max
            }
        '
}

# Проверяем smartctl
if ! command -v smartctl >/dev/null 2>&1; then
    echo "$(date '+%F %T') ERROR: smartctl не установлен" >> "$LOG"
    push_status "down" "Ошибка: smartctl не установлен"
    exit 1
fi

# Считываем температуры
HDD_TEMP=$(read_hdd_temp)
NVME_TEMP=$(read_nvme_temp)

# Формируем сообщение
MSG=""
MAX_TEMP=0
MAX_DISK=""
ERRORS=0

if [[ "$HDD_TEMP" =~ ^[0-9]+$ ]]; then
    MSG="HDD ${HDD_TEMP}C"

    if (( HDD_TEMP > MAX_TEMP )); then
        MAX_TEMP=$HDD_TEMP
        MAX_DISK="HDD"
    fi
else
    MSG="HDD: ошибка чтения"
    ERRORS=1
fi

if [[ "$NVME_TEMP" =~ ^[0-9]+$ ]]; then
    MSG="$MSG | NVMe ${NVME_TEMP}C"

    if (( NVME_TEMP > MAX_TEMP )); then
        MAX_TEMP=$NVME_TEMP
        MAX_DISK="NVMe"
    fi
else
    MSG="$MSG | NVMe: ошибка чтения"
    ERRORS=1
fi

# Определяем состояние
if (( MAX_TEMP > THRESHOLD )); then
    STATUS="down"
    MESSAGE="ПЕРЕГРЕВ! ${MAX_DISK} ${MAX_TEMP}C, порог ${THRESHOLD}C | $MSG"
elif (( ERRORS > 0 )); then
    STATUS="down"
    MESSAGE="Ошибка чтения SMART | $MSG"
else
    STATUS="up"
    MESSAGE="Температура в норме (порог ${THRESHOLD}C) | $MSG"
fi

# Отправляем результат
push_status "$STATUS" "$MESSAGE"
