corrections divers
This commit is contained in:
@@ -29,17 +29,23 @@ DEBIAN_FRONTEND=noninteractive apt install -y curl bc
|
||||
|
||||
|
||||
# --- 3. RÉCUPÉRATION ET TEST DU MOT DE PASSE SMTP ---
|
||||
PASS_FILE=".smtp_pass"
|
||||
# Ici, PASS_FILE_ORI pointe probablement vers /etc/msmtprc ou une sauvegarde
|
||||
PASS_FILE_ORI="/etc/msmtprc"
|
||||
AUTH_OK=false
|
||||
|
||||
while [ "$AUTH_OK" = false ]; do
|
||||
# 1. Tentative de lecture depuis le fichier
|
||||
if [ -f "$PASS_FILE" ] && [ -s "$PASS_FILE" ]; then
|
||||
SMTP_PASS=$(head -n 1 "$PASS_FILE")
|
||||
echo "📄 Mot de passe lu depuis le fichier $PASS_FILE."
|
||||
# 1. Tentative d'extraction depuis le fichier de config existant
|
||||
if [ -f "$PASS_FILE_ORI" ]; then
|
||||
# On cherche la ligne commençant par 'password', on ignore les espaces/tabulations,
|
||||
# et on récupère la deuxième colonne.
|
||||
SMTP_PASS=$(grep -E "^password[[:space:]]+" "$PASS_FILE_ORI" | awk '{print $2}')
|
||||
fi
|
||||
|
||||
if [ -n "$SMTP_PASS" ]; then
|
||||
echo "📄 Mot de passe extrait depuis $PASS_FILE_ORI."
|
||||
else
|
||||
# 2. Sinon, saisie manuelle
|
||||
echo -n "🔑 Mot de passe SMTP pour ${SMTP_USER} : "
|
||||
# 2. Sinon, saisie manuelle si le fichier n'existe pas ou ne contient pas de password
|
||||
echo -n "🔑 Mot de passe SMTP non trouvé. Entrez le pour ${SMTP_USER} : "
|
||||
read -s SMTP_PASS
|
||||
echo ""
|
||||
fi
|
||||
@@ -62,7 +68,7 @@ account default : test
|
||||
EOF
|
||||
chmod 600 /tmp/.msmtp_test
|
||||
|
||||
# Test d'envoi réel (indispensable pour valider)
|
||||
# Test d'envoi réel
|
||||
echo "Test de configuration" | msmtp --file=/tmp/.msmtp_test -t "$DEST_EMAIL" 2>/dev/null
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
@@ -71,9 +77,11 @@ EOF
|
||||
rm /tmp/.msmtp_test
|
||||
else
|
||||
echo "❌ Échec de l'authentification SMTP."
|
||||
if [ -f "$PASS_FILE" ]; then
|
||||
echo "⚠️ Le mot de passe dans $PASS_FILE est incorrect ou le serveur est injoignable."
|
||||
mv "$PASS_FILE" "${PASS_FILE}.old" # On renomme pour forcer la saisie manuelle au prochain tour
|
||||
# Si le password extrait était mauvais, on vide la variable pour forcer la saisie au prochain tour
|
||||
if [ -f "$PASS_FILE_ORI" ]; then
|
||||
echo "⚠️ Le mot de passe extrait de $PASS_FILE_ORI est incorrect."
|
||||
SMTP_PASS=""
|
||||
PASS_FILE_ORI="/dev/null" # On "désactive" la lecture fichier pour ce tour
|
||||
fi
|
||||
rm /tmp/.msmtp_test
|
||||
fi
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
#!/bin/bash
|
||||
|
||||
# --- CONFIGURATION ---
|
||||
THRESHOLD=90
|
||||
THRESHOLD=80
|
||||
LOAD_THRESHOLD=5.0
|
||||
PROC_THRESHOLD=500
|
||||
TMP_THRESHOLD=90
|
||||
CONN_THRESHOLD=500
|
||||
HOST=$(hostname)
|
||||
|
||||
# On envoie à 'root', le système fera la redirection grâce aux aliases
|
||||
@@ -11,31 +14,44 @@ DEST="root"
|
||||
REPORT=""
|
||||
ALERT=false
|
||||
|
||||
|
||||
# Fonction pour ajouter une ligne au rapport avec une icône
|
||||
add_to_report() {
|
||||
REPORT="${REPORT}$1\n"
|
||||
}
|
||||
|
||||
|
||||
|
||||
# 1. CHECK DISQUE & INODES
|
||||
DISK_USAGE=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
|
||||
INODE_USAGE=$(df -i / | awk 'NR==2 {print $5}' | sed 's/%//')
|
||||
|
||||
if [ "$DISK_USAGE" -gt "$THRESHOLD" ]; then
|
||||
REPORT="${REPORT}⚠️ DISQUE : $DISK_USAGE% utilisé\n"
|
||||
add_to_report "⚠️ DISQUE : $DISK_USAGE% utilisé\n"
|
||||
ALERT=true
|
||||
fi
|
||||
if [ "$INODE_USAGE" -gt "$THRESHOLD" ]; then
|
||||
REPORT="${REPORT}⚠️ INODES : $INODE_USAGE% utilisé\n"
|
||||
add_to_report "⚠️ INODES : $INODE_USAGE% utilisé\n"
|
||||
ALERT=true
|
||||
fi
|
||||
|
||||
# 2. CHECK RAM & SWAP
|
||||
# --- CHECK RAM & SWAP ---
|
||||
RAM_USAGE=$(free | grep Mem | awk '{print int($3/$2 * 100)}')
|
||||
SWAP_TOTAL=$(free | grep Swap | awk '{print $2}')
|
||||
|
||||
# On ajoute '|| echo 0' pour s'assurer que la variable n'est jamais vide
|
||||
SWAP_TOTAL=$(free | grep Swap | awk '{print $2}' | grep -E '^[0-9]+$' || echo 0)
|
||||
|
||||
if [ "$RAM_USAGE" -gt "$THRESHOLD" ]; then
|
||||
REPORT="${REPORT}⚠️ RAM : $RAM_USAGE% utilisé\n"
|
||||
add_to_report "⚠️ RAM : $RAM_USAGE% utilisé\n"
|
||||
ALERT=true
|
||||
fi
|
||||
if [ "$SWAP_TOTAL" -gt 0 ]; then
|
||||
SWAP_USAGE=$(free | grep Swap | awk '{print int($3/$2 * 100)}')
|
||||
|
||||
# On vérifie si SWAP_TOTAL est supérieur à 0 et n'est pas vide
|
||||
if [ -n "$SWAP_TOTAL" ] && [ "$SWAP_TOTAL" -gt 0 ]; then
|
||||
# Calcul du SWAP_USAGE avec une sécurité pour éviter la division par zéro
|
||||
SWAP_USAGE=$(free | grep Swap | awk '{print ($2>0) ? int($3/$2 * 100) : 0}')
|
||||
if [ "$SWAP_USAGE" -gt 50 ]; then
|
||||
REPORT="${REPORT}⚠️ SWAP : $SWAP_USAGE% utilisé\n"
|
||||
add_to_report "⚠️ SWAP : $SWAP_USAGE% utilisé (Saturation RAM imminente)\n"
|
||||
ALERT=true
|
||||
fi
|
||||
fi
|
||||
@@ -43,20 +59,96 @@ fi
|
||||
# 3. CHECK CHARGE CPU
|
||||
CPU_LOAD=$(uptime | awk -F'load average:' '{ print $2 }' | cut -d',' -f1 | tr -d ' ' | tr ',' '.')
|
||||
if (( $(echo "$CPU_LOAD > $LOAD_THRESHOLD" | bc -l) )); then
|
||||
REPORT="${REPORT}🔥 CPU LOAD : $CPU_LOAD (Surcharge)\n"
|
||||
add_to_report "🔥 CPU LOAD : $CPU_LOAD (Surcharge)\n"
|
||||
ALERT=true
|
||||
fi
|
||||
|
||||
# 4. CHECK SERVICES (SSH et Fail2Ban sont vitaux)
|
||||
for SVC in "ssh" "fail2ban"; do
|
||||
if ! systemctl is-active --quiet "$SVC"; then
|
||||
REPORT="${REPORT}❌ SERVICE : $SVC est ARRÊTÉ\n"
|
||||
add_to_report "❌ SERVICE : $SVC est ARRÊTÉ\n"
|
||||
ALERT=true
|
||||
fi
|
||||
done
|
||||
|
||||
# --- ENVOI VIA ALIAS ROOT ---
|
||||
# ------------------------------------------------
|
||||
# 5. NOMBRE DE PROCESSUS
|
||||
# ------------------------------------------------
|
||||
PROC_COUNT=$(ps -e --no-headers | wc -l)
|
||||
|
||||
if [ "$PROC_COUNT" -gt "$PROC_THRESHOLD" ]; then
|
||||
add_to_report "PROCESSUS : $PROC_COUNT processus actifs\n"
|
||||
ALERT=true
|
||||
fi
|
||||
|
||||
# ------------------------------------------------
|
||||
# 6. ESPACE /tmp
|
||||
# ------------------------------------------------
|
||||
TMP_USAGE=$(df /tmp | awk 'NR==2 {print $5}' | sed 's/%//')
|
||||
|
||||
if [ "$TMP_USAGE" -gt "$TMP_THRESHOLD" ]; then
|
||||
add_to_report "/tmp : $TMP_USAGE% utilisé\n"
|
||||
ALERT=true
|
||||
fi
|
||||
|
||||
# ------------------------------------------------
|
||||
# 7. PROCESSUS ZOMBIES
|
||||
# ------------------------------------------------
|
||||
ZOMBIES=$(ps aux | awk '{ if ($8=="Z") print $0 }' | wc -l)
|
||||
|
||||
if [ "$ZOMBIES" -gt 0 ]; then
|
||||
add_to_report "ZOMBIES : $ZOMBIES processus zombies\n"
|
||||
ALERT=true
|
||||
fi
|
||||
|
||||
# ------------------------------------------------
|
||||
# 8. FICHIERS SUPPRIMÉS MAIS OUVERTS
|
||||
# ------------------------------------------------
|
||||
# On utilise tail -n +2 pour ignorer la ligne d'en-tête de lsof
|
||||
DELETED_DATA=$(sudo lsof +L1 2>/dev/null | tail -n +2)
|
||||
DELETED_COUNT=$(echo -n "$DELETED_DATA" | grep -c '^' || echo 0)
|
||||
|
||||
if [ "$DELETED_COUNT" -gt 0 ]; then
|
||||
# On extrait les noms des commandes uniques pour le rapport (ex: systemd-j, apache2)
|
||||
PROCESS_NAMES=$(echo "$DELETED_DATA" | awk '{print $1}' | sort -u | tr '\n' ' ')
|
||||
|
||||
add_to_report "📂 FICHIERS SUPPRIMÉS MAIS OUVERTS : $DELETED_COUNT (Processus : $PROCESS_NAMES)"
|
||||
ALERT=true
|
||||
fi
|
||||
|
||||
|
||||
# ------------------------------------------------
|
||||
# 9. CONNEXIONS RÉSEAU
|
||||
# ------------------------------------------------
|
||||
CONN_COUNT=$(ss -tun | tail -n +2 | wc -l)
|
||||
|
||||
if [ "$CONN_COUNT" -gt "$CONN_THRESHOLD" ]; then
|
||||
add_to_report "CONNEXIONS RÉSEAU : $CONN_COUNT\n"
|
||||
ALERT=true
|
||||
fi
|
||||
|
||||
# ------------------------------------------------
|
||||
# 10. ERREURS RÉCENTES DANS LES LOGS
|
||||
# ------------------------------------------------
|
||||
LOG_ERRORS=$(journalctl -p 3 -n 20 --no-pager | wc -l)
|
||||
|
||||
if [ "$LOG_ERRORS" -gt 0 ]; then
|
||||
add_to_report "ERREURS CRITIQUES DANS LES LOGS : $LOG_ERRORS\n"
|
||||
ALERT=true
|
||||
fi
|
||||
|
||||
# ------------------------------------------------
|
||||
# ENVOI MAIL
|
||||
# ------------------------------------------------
|
||||
if [ "$ALERT" = true ]; then
|
||||
# Le sujet sera automatiquement préfixé par le wrapper [$HOSTNAME]
|
||||
echo -e "Détails de l'alerte :\n\n$REPORT\n---\nDate: $(date)" | mail -s "ALERTE RESSOURCES" "$DEST"
|
||||
SUBJECT="🔴 ALERTE SERVEUR [$HOST] - $(date +'%H:%M')"
|
||||
|
||||
# Construction du corps du mail avec un header propre
|
||||
MAIL_BODY="Bonjour,\n\nUne ou plusieurs anomalies ont été détectées sur le serveur : $HOST\n"
|
||||
MAIL_BODY="$MAIL_BODY\n------------------------------------------------\n"
|
||||
MAIL_BODY="$MAIL_BODY$REPORT"
|
||||
MAIL_BODY="$MAIL_BODY\n------------------------------------------------\n"
|
||||
MAIL_BODY="$MAIL_BODY\nDate du rapport : $(date)"
|
||||
|
||||
echo -e "$MAIL_BODY" | mail -s "$SUBJECT" "$DEST"
|
||||
fi
|
||||
Reference in New Issue
Block a user