215 lines
6.4 KiB
Bash
Executable File
215 lines
6.4 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
|
|
# --- 0. VÉRIFICATION DES DROITS ---
|
|
if [ "$EUID" -ne 0 ]; then
|
|
echo "❌ Erreur : Ce script doit être lancé avec sudo."
|
|
exit 1
|
|
fi
|
|
|
|
|
|
# --- 1. CONFIGURATION DYNAMIQUE ---
|
|
HOSTNAME=$(hostname)
|
|
SMTP_HOST="mail.acemail.fr"
|
|
SMTP_PORT="587"
|
|
SMTP_USER="srv@a5l.fr"
|
|
DEST_EMAIL="cedric+${HOSTNAME}@abonnel.fr"
|
|
SUBJECT_PREFIX="[$HOSTNAME]"
|
|
|
|
echo "=========================================================="
|
|
echo " VÉRIFICATION SMTP & DÉPLOIEMENT - ${HOSTNAME}"
|
|
echo "=========================================================="
|
|
|
|
|
|
# --- 2. INSTALLATION INITIALE ---
|
|
DEBIAN_FRONTEND=noninteractive apt update
|
|
DEBIAN_FRONTEND=noninteractive apt install -y msmtp msmtp-mta bsd-mailx
|
|
DEBIAN_FRONTEND=noninteractive apt install -y ufw fail2ban unattended-upgrades curl
|
|
DEBIAN_FRONTEND=noninteractive apt install -y curl bc
|
|
|
|
|
|
# --- 3. RÉCUPÉRATION ET TEST DU MOT DE PASSE SMTP ---
|
|
PASS_FILE=".smtp_pass"
|
|
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."
|
|
else
|
|
# 2. Sinon, saisie manuelle
|
|
echo -n "🔑 Mot de passe SMTP pour ${SMTP_USER} : "
|
|
read -s SMTP_PASS
|
|
echo ""
|
|
fi
|
|
|
|
echo "⏳ Vérification de la connexion SMTP..."
|
|
|
|
# Création config temporaire pour le test
|
|
cat > /tmp/.msmtp_test <<EOF
|
|
defaults
|
|
auth on
|
|
tls on
|
|
tls_trust_file /etc/ssl/certs/ca-certificates.crt
|
|
account test
|
|
host $SMTP_HOST
|
|
port $SMTP_PORT
|
|
from $SMTP_USER
|
|
user $SMTP_USER
|
|
password $SMTP_PASS
|
|
account default : test
|
|
EOF
|
|
chmod 600 /tmp/.msmtp_test
|
|
|
|
# Test d'envoi réel (indispensable pour valider)
|
|
echo "Test de configuration" | msmtp --file=/tmp/.msmtp_test -t "$DEST_EMAIL" 2>/dev/null
|
|
|
|
if [ $? -eq 0 ]; then
|
|
echo "✅ Authentification SMTP réussie !"
|
|
AUTH_OK=true
|
|
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
|
|
fi
|
|
rm /tmp/.msmtp_test
|
|
fi
|
|
done
|
|
|
|
|
|
# --- 4. CONFIGURATION DES ALIASES ---
|
|
echo "--- 4. Vérification et configuration des redirections (Aliases) ---"
|
|
ALIAS_FILE="/etc/aliases"
|
|
|
|
# On s'assure que le fichier existe (certaines distros minimales ne l'ont pas)
|
|
[ ! -f "$ALIAS_FILE" ] && touch "$ALIAS_FILE"
|
|
|
|
# Vérification pour root
|
|
if grep -q "^root:" "$ALIAS_FILE"; then
|
|
# Si root existe mais pointe vers autre chose, on met à jour
|
|
sed -i "s|^root:.*|root: $DEST_EMAIL|" "$ALIAS_FILE"
|
|
echo "✅ Alias 'root' mis à jour vers $DEST_EMAIL."
|
|
else
|
|
# Sinon on l'ajoute
|
|
echo "root: $DEST_EMAIL" >> "$ALIAS_FILE"
|
|
echo "✅ Alias 'root' ajouté."
|
|
fi
|
|
|
|
# Vérification pour default
|
|
if grep -q "^default:" "$ALIAS_FILE"; then
|
|
sed -i "s|^default:.*|default: $DEST_EMAIL|" "$ALIAS_FILE"
|
|
echo "✅ Alias 'default' mis à jour."
|
|
else
|
|
echo "default: $DEST_EMAIL" >> "$ALIAS_FILE"
|
|
echo "✅ Alias 'default' ajouté."
|
|
fi
|
|
|
|
|
|
# --- 5. CONFIGURATION MSMTP ---
|
|
echo "--- 5. Vérification de la configuration MSMTP ---"
|
|
|
|
# 1. Génération de la configuration cible dans un fichier temporaire
|
|
TMP_MSMTP=$(mktemp)
|
|
cat > "$TMP_MSMTP" <<EOF
|
|
defaults
|
|
auth on
|
|
tls on
|
|
tls_trust_file /etc/ssl/certs/ca-certificates.crt
|
|
logfile /var/log/msmtp.log
|
|
aliases /etc/aliases
|
|
|
|
account default
|
|
host $SMTP_HOST
|
|
port $SMTP_PORT
|
|
from $SMTP_USER
|
|
user $SMTP_USER
|
|
password $SMTP_PASS
|
|
EOF
|
|
|
|
# 2. Comparaison avec le fichier existant
|
|
MSMTP_CONF="/etc/msmtprc"
|
|
SHOULD_UPDATE=false
|
|
|
|
if [ ! -f "$MSMTP_CONF" ]; then
|
|
echo "📜 Le fichier $MSMTP_CONF n'existe pas. Création..."
|
|
SHOULD_UPDATE=true
|
|
else
|
|
# Comparaison du contenu (diff ignore les différences de droits, uniquement le texte)
|
|
if ! diff -q "$TMP_MSMTP" "$MSMTP_CONF" > /dev/null; then
|
|
echo "🔄 La configuration a changé. Mise à jour de $MSMTP_CONF..."
|
|
SHOULD_UPDATE=true
|
|
else
|
|
echo "✅ La configuration MSMTP est déjà à jour et identique."
|
|
fi
|
|
fi
|
|
|
|
# 3. Application si nécessaire
|
|
if [ "$SHOULD_UPDATE" = true ]; then
|
|
cp "$TMP_MSMTP" "$MSMTP_CONF"
|
|
chmod 600 "$MSMTP_CONF"
|
|
chown root:root "$MSMTP_CONF"
|
|
fi
|
|
|
|
# Nettoyage du fichier temporaire
|
|
rm -f "$TMP_MSMTP"
|
|
|
|
|
|
# --- 6. INTERCEPTION GLOBALE (LE WRAPPER) ---
|
|
echo "--- 6. Création du wrapper sendmail pour préfixer les objets ---"
|
|
# On crée un script qui va modifier le sujet à la volée
|
|
cat > /usr/local/bin/msmtp-wrapper <<EOF
|
|
#!/bin/bash
|
|
# Ce script intercepte les mails pour ajouter le préfixe [$HOSTNAME]
|
|
# On utilise sed pour injecter le préfixe dans la ligne 'Subject:'
|
|
sed "s/^Subject: /Subject: $SUBJECT_PREFIX /" | /usr/bin/msmtp "\$@"
|
|
EOF
|
|
|
|
chmod +x /usr/local/bin/msmtp-wrapper
|
|
|
|
# On pointe le sendmail du système vers notre wrapper au lieu de msmtp directement
|
|
ln -sf /usr/local/bin/msmtp-wrapper /usr/sbin/sendmail
|
|
|
|
|
|
# --- 7. SCRIPT DE SURVEILLANCE ---
|
|
echo "--- 7. Récupération du script de surveillance depuis Git ---"
|
|
SCRIPT_URL="https://git.abonnel.fr/cedricAbonnel/scripts-bash/raw/branch/main/servers/linux/sys_check.sh"
|
|
DEST_PATH="/usr/local/bin/sys_check.sh"
|
|
|
|
# Téléchargement du script
|
|
curl -sSL "$SCRIPT_URL" -o "$DEST_PATH"
|
|
|
|
# Vérification du succès du téléchargement
|
|
if [ $? -eq 0 ]; then
|
|
chmod +x "$DEST_PATH"
|
|
echo "✅ sys_check.sh récupéré et installé."
|
|
else
|
|
echo "❌ Erreur lors de la récupération du script sur Git. Création d'une version de secours locale."
|
|
cat > "$DEST_PATH" <<EOF
|
|
#!/bin/bash
|
|
# Version de secours (fallback)
|
|
DISK_USAGE=\$(df / | awk 'NR==2 {print \$5}' | sed 's/%//')
|
|
if [ "\$DISK_USAGE" -gt 90 ]; then
|
|
echo "Alerte Disque: \$DISK_USAGE%" | mail -s "ALERTE" root
|
|
fi
|
|
EOF
|
|
chmod +x "$DEST_PATH"
|
|
fi
|
|
|
|
|
|
# --- 8. SÉCURITÉ & AUTOMATISATION ---
|
|
ufw allow 22/tcp
|
|
ufw --force enable
|
|
systemctl restart fail2ban
|
|
(crontab -l 2>/dev/null | grep -v "sys_check.sh" ; echo "0 * * * * /usr/local/bin/sys_check.sh") | crontab -
|
|
|
|
|
|
# --- 9. RAPPORT FINAL ---
|
|
echo "Déploiement terminé de ${0} sur ${HOSTNAME}" | mail -s "Setup OK" "$DEST_EMAIL"
|
|
|
|
echo "✅ Terminé ! Teste avec : echo 'test' | mail -s 'Sujet simple' root"
|
|
|
|
rm ${0}
|