#!/usr/bin/env bash
#
# Alerte par email lorsque l'espace disque disponible d'une partition
# passe sous un seuil donne.
#
# Installation : voir /etc/cron.d/check-disk-space
set -euo pipefail

# ----------------------- Configuration -----------------------
# Seuil d'alerte en pourcentage d'utilisation (modifiable ici)
THRESHOLD=80

# Destinataire de l'alerte
MAIL_TO="tech@w-seils.com"

# Parametres SMTP (repris de cud-14lts-prod/shared/config/system/additional.php)
SMTP_SERVER="smtp-01-fr.hosteurtransac.net"
SMTP_PORT="587"
SMTP_USER="103598-hctztmji@hosteurtransac.net"
SMTP_PASSWORD="?,95,OOlUtITOnyLLio"
MAIL_FROM="$SMTP_USER"

# Ne pas renvoyer un mail pour la meme partition avant ce delai (en secondes)
# tant que le seuil reste depasse. 21600 = 6h.
REPEAT_INTERVAL=21600

# Repertoire d'etat (memorise la derniere alerte par partition)
STATE_DIR="/var/lib/check-disk-space"
# ----------------------------------------------------------------

mkdir -p "$STATE_DIR"

HOSTNAME="$(hostname -f 2>/dev/null || hostname)"
NOW="$(date +%s)"

# Parcourt les systemes de fichiers "reels" (exclut tmpfs, devtmpfs, efivarfs, overlay, squashfs...)
df -hPl -x tmpfs -x devtmpfs -x efivarfs -x overlay -x squashfs | tail -n +2 | while read -r FILESYSTEM SIZE USED AVAIL USE_PCT MOUNT; do
    USE_PCT_NUM="${USE_PCT%\%}"
    STATE_FILE="$STATE_DIR/$(echo "$MOUNT" | tr '/' '_').state"

    if [ "$USE_PCT_NUM" -ge "$THRESHOLD" ]; then
        LAST_ALERT=0
        [ -f "$STATE_FILE" ] && LAST_ALERT="$(cat "$STATE_FILE")"

        if [ $((NOW - LAST_ALERT)) -ge "$REPEAT_INTERVAL" ]; then
            SUBJECT="[ALERTE DISQUE] $HOSTNAME : $MOUNT a ${USE_PCT_NUM}% d'utilisation"
            BODY="Le systeme de fichiers $FILESYSTEM monte sur $MOUNT depasse le seuil d'alerte de ${THRESHOLD}%.

Taille totale     : $SIZE
Espace utilise     : $USED (${USE_PCT_NUM}%)
Espace disponible  : $AVAIL

Serveur : $HOSTNAME - FALCON
Date    : $(date '+%Y-%m-%d %H:%M:%S')"

            EMAIL_RAW="From: $MAIL_FROM
To: $MAIL_TO
Subject: $SUBJECT
Content-Type: text/plain; charset=UTF-8
Date: $(date -R)

$BODY"

            curl -s --url "smtp://${SMTP_SERVER}:${SMTP_PORT}" \
                --ssl-reqd \
                --mail-from "$MAIL_FROM" \
                --mail-rcpt "$MAIL_TO" \
                --user "${SMTP_USER}:${SMTP_PASSWORD}" \
                --upload-file - <<< "$EMAIL_RAW"

            echo "$NOW" > "$STATE_FILE"
        fi
    else
        # Repasse sous le seuil : on reinitialise l'etat pour une future alerte immediate
        rm -f "$STATE_FILE"
    fi
done
