From 1cdf38cc3a8a79f364a2a87593d07739fd4d7f24 Mon Sep 17 00:00:00 2001 From: jfontaine35 <76435797+jfontaine35@users.noreply.github.com> Date: Fri, 28 Feb 2025 18:31:42 +0100 Subject: [PATCH] Update and rename samba_backup_restore.sh to samba_ad_backup.sh --- samba_ad_backup.sh | 509 ++++++++++++++++++++++++++++++++++++++++ samba_backup_restore.sh | 416 -------------------------------- 2 files changed, 509 insertions(+), 416 deletions(-) create mode 100644 samba_ad_backup.sh delete mode 100644 samba_backup_restore.sh diff --git a/samba_ad_backup.sh b/samba_ad_backup.sh new file mode 100644 index 0000000..ff256a2 --- /dev/null +++ b/samba_ad_backup.sh @@ -0,0 +1,509 @@ +#!/bin/bash + +#---------------------------------------------------------------- +### Attention MSMTPRC doit être configuré sur le poste client ### +#---------------------------------------------------------------- + +# Variables +SAMBA_PRIVATE="/var/lib/samba/private" +SAMBA_SYSVOL="/var/lib/samba/sysvol" +SAMBA_CONFIG="/etc/samba" +BACKUP_DIR="/mnt/Backups/srv-AD/sauvegardes/samba" +BACKUP_MOUNT="/mnt/Backups" +BACKUP_SHARE="//nashitema/Backups" +BACKUP_USER="backup" +BACKUP_PASSWORD="**********" +DATE=$(date +%Y%m%d_%H%M%S) +GREEN="\033[1;32m" +RED="\033[1;31m" +YELLOW="\033[1;33m" +NC="\033[0m" +ADMIN_CREDS_FILE="/root/.creds/smb_bcks" +LOG_FILE="/var/log/samba_backup.log" +MAIL_TO="admin@domain.fr" + +# Mode automatique (défaut à false) +AUTO_MODE=false +RETENTION_DAYS=30 +DRY_RUN=false + +# Fonction de journalisation +log_message() { + local message="$1" + local level="$2" + + if [[ "$level" == "ERROR" ]]; then + echo -e "${RED}[ERROR] $message${NC}" + elif [[ "$level" == "WARNING" ]]; then + echo -e "${YELLOW}[WARNING] $message${NC}" + else + echo -e "${GREEN}[INFO] $message${NC}" + fi + + echo "[$(date +"%Y-%m-%d %H:%M:%S")] [$level] $message" >> "$LOG_FILE" +} + +# Fonction pour gérer les identifiants administrateur +setup_admin_credentials() { + if [ ! -f "$ADMIN_CREDS_FILE" ]; then + mkdir -p "$(dirname "$ADMIN_CREDS_FILE")" + + if [ -z "$ADMIN_PASSWORD" ]; then + echo -e "${YELLOW}Entrez le mot de passe Administrateur pour Samba AD :${NC}" + read -s ADMIN_PASSWORD + echo + fi + + echo "username = Administrator" > "$ADMIN_CREDS_FILE" + echo "password = $ADMIN_PASSWORD" >> "$ADMIN_CREDS_FILE" + + chmod 600 "$ADMIN_CREDS_FILE" + log_message "Fichier d'identifiants créé: $ADMIN_CREDS_FILE" "INFO" + fi + + ADMIN_USER=$(grep -oP '(?<=username = ).+' "$ADMIN_CREDS_FILE") + ADMIN_PASSWORD=$(grep -oP '(?<=password = ).+' "$ADMIN_CREDS_FILE") + + if [ -z "$ADMIN_USER" ] || [ -z "$ADMIN_PASSWORD" ]; then + log_message "Impossible de lire les identifiants depuis $ADMIN_CREDS_FILE" "ERROR" + return 1 + fi + + return 0 +} + +# Fonction d'envoi d'email avec msmtp +send_email() { + local subject="$1" + local body="$2" + local status="${3:-info}" + + TEMP_EMAIL=$(mktemp) + + local message_class="info" + local bg_color="#4a86e8" + + if [[ "$status" == "ERROR" ]]; then + message_class="error" + bg_color="#cc0000" + elif [[ "$status" == "SUCCESS" ]]; then + message_class="success" + bg_color="#007700" + fi + + body=$(echo -e "$body" | sed 's/$/\/g') + + cat > "$TEMP_EMAIL" << EOF +From: Système de sauvegarde Samba +To: $MAIL_TO +Subject: $subject +MIME-Version: 1.0 +Content-Type: text/html; charset=UTF-8 + + + + + + + +
+
+

Notification de sauvegarde Samba

+
+
+
+ ${body} +
+
+ + + + + + + + + + + + + +
Serveur$(hostname)
Date$(date)
Scriptsamba_ad_backup.sh
+
+
+ +
+ + +EOF + + msmtp -a Backups -t < "$TEMP_EMAIL" + + if [ $? -eq 0 ]; then + log_message "Email envoyé à $MAIL_TO" "INFO" + else + log_message "Échec de l'envoi d'email à $MAIL_TO" "ERROR" + fi + + rm -f "$TEMP_EMAIL" +} + +# Fonction de test d'envoi d'email +test_send_email() { + log_message "Test d'envoi d'email..." "INFO" + send_email "Test d'envoi d'email" "Ceci est un email de test envoyé par le script de sauvegarde Samba." "info" +} + +# Fonction pour vérifier et monter le partage réseau +check_mount() { + if [ ! -d "$BACKUP_MOUNT" ]; then + mkdir -p "$BACKUP_MOUNT" + log_message "Création du point de montage $BACKUP_MOUNT" "INFO" + fi + + if mountpoint -q "$BACKUP_MOUNT"; then + log_message "Le partage est déjà monté sur $BACKUP_MOUNT" "INFO" + return 0 + fi + + mount -t cifs "$BACKUP_SHARE" "$BACKUP_MOUNT" -o username="$BACKUP_USER",password="$BACKUP_PASSWORD",vers=3.0 + + if [ $? -eq 0 ]; then + log_message "Partage $BACKUP_SHARE monté avec succès sur $BACKUP_MOUNT" "INFO" + return 0 + else + log_message "Impossible de monter le partage $BACKUP_SHARE sur $BACKUP_MOUNT" "ERROR" + send_email "ERREUR: Échec du montage du partage pour la sauvegarde Samba" "Le script de sauvegarde n'a pas pu monter le partage réseau $BACKUP_SHARE sur $BACKUP_MOUNT. Veuillez vérifier la connectivité réseau et les identifiants." "ERROR" + return 1 + fi +} + +# Fonction de sauvegarde des GPO +backup_gpo() { + local custom_name="$1" + local gpo_dir="" + + if [[ -z "$custom_name" ]]; then + gpo_dir="$BACKUP_DIR/gpo_backup_$DATE" + else + gpo_dir="$BACKUP_DIR/gpo_backup_${custom_name}" + fi + + log_message "Sauvegarde des GPO dans $gpo_dir..." "INFO" + mkdir -p "$gpo_dir" + + gpo_list=$(samba-tool gpo listall 2>/dev/null) + + if [ $? -ne 0 ]; then + log_message "Erreur lors de la récupération de la liste des GPO" "ERROR" + return 1 + fi + + while IFS= read -r line; do + gpo_guid=$(echo "$line" | grep -o -P '\{[0-9A-Fa-f\-]+\}') + if [[ -n "$gpo_guid" ]]; then + if [[ "$DRY_RUN" = true ]]; then + log_message "DRY RUN: Simulation de sauvegarde du GPO $gpo_guid dans $gpo_dir" "INFO" + else + samba-tool gpo backup "$gpo_guid" -H "$gpo_dir/$gpo_guid" -U "${ADMIN_USER}%${ADMIN_PASSWORD}" 2>/dev/null + + if [ $? -ne 0 ]; then + log_message "Erreur lors de la sauvegarde du GPO $gpo_guid" "ERROR" + send_email "ERREUR: Échec de la sauvegarde du GPO $gpo_guid" "Le script n'a pas pu sauvegarder le GPO $gpo_guid. Vérifiez les logs pour plus de détails." "ERROR" + return 1 + fi + fi + fi + done <<< "$gpo_list" + + log_message "Sauvegarde des GPO terminée dans $gpo_dir" "INFO" + return 0 +} + +# Fonction de nettoyage des anciennes sauvegardes +cleanup_old_backups() { + if [[ "$DRY_RUN" = true ]]; then + log_message "DRY RUN: Simulation de nettoyage des anciennes sauvegardes (plus de $RETENTION_DAYS jours)" "INFO" + find "$BACKUP_DIR" -name "*.tar.gz" -type f -mtime +$RETENTION_DAYS -print + find "$BACKUP_DIR" -name "gpo_backup_*" -type d -mtime +$RETENTION_DAYS -print + else + log_message "Nettoyage des anciennes sauvegardes (plus de $RETENTION_DAYS jours)..." "INFO" + find "$BACKUP_DIR" -name "*.tar.gz" -type f -mtime +$RETENTION_DAYS -delete + find "$BACKUP_DIR" -name "gpo_backup_*" -type d -mtime +$RETENTION_DAYS -exec rm -rf {} \; 2>/dev/null || true + fi + log_message "Nettoyage terminé" "INFO" +} + +# Fonction principale de sauvegarde Samba +backup_samba() { + log_message "Début de la sauvegarde Samba..." "INFO" + + setup_admin_credentials || return 1 + check_mount || return 1 + + if [ ! -d "$BACKUP_DIR" ]; then + if [[ "$DRY_RUN" = true ]]; then + log_message "DRY RUN: Création du répertoire $BACKUP_DIR" "INFO" + else + mkdir -p "$BACKUP_DIR" || { + log_message "Impossible de créer le répertoire $BACKUP_DIR" "ERROR" + send_email "ERREUR: Échec de création du répertoire de sauvegarde Samba" "Le script n'a pas pu créer le répertoire $BACKUP_DIR." "ERROR" + return 1 + } + fi + fi + + if [[ "$AUTO_MODE" = true ]]; then + CUSTOM_NAME="samba_backup_$DATE" + log_message "Mode automatique activé. Sauvegarde : $CUSTOM_NAME" "INFO" + else + echo -e "${YELLOW}Entrez un nom pour la sauvegarde (laisser vide pour générer automatiquement) :${NC}" + read -r CUSTOM_NAME + if [[ -z "$CUSTOM_NAME" ]]; then + CUSTOM_NAME="samba_backup_$DATE" + fi + fi + + ARCHIVE="$BACKUP_DIR/${CUSTOM_NAME}.tar.gz" + + cleanup_old_backups + + backup_gpo "$CUSTOM_NAME" || return 1 + + REQUIRED_SPACE=$(du -sb "$SAMBA_PRIVATE" "$SAMBA_SYSVOL" "$SAMBA_CONFIG" | awk '{total += $1} END {print total}') + AVAILABLE_SPACE=$(df -B1 "$BACKUP_DIR" | tail -1 | awk '{print $4}') + + if [ "$AVAILABLE_SPACE" -lt "$REQUIRED_SPACE" ]; then + log_message "Espace disque insuffisant pour la sauvegarde. Requis: $(numfmt --to=iec-i --suffix=B $REQUIRED_SPACE), Disponible: $(numfmt --to=iec-i --suffix=B $AVAILABLE_SPACE)" "ERROR" + send_email "ERREUR: Espace disque insuffisant pour la sauvegarde Samba" "L'espace disque est insuffisant pour effectuer la sauvegarde.\n\nRequis: $(numfmt --to=iec-i --suffix=B $REQUIRED_SPACE)\nDisponible: $(numfmt --to=iec-i --suffix=B $AVAILABLE_SPACE)" "ERROR" + return 1 + fi + + if [[ "$DRY_RUN" = true ]]; then + log_message "DRY RUN: Création de l'archive $ARCHIVE" "INFO" + log_message "DRY RUN: Sauvegarde des ACL dans $BACKUP_DIR/${CUSTOM_NAME}_acl.acl" "INFO" + else + tar --exclude="*/ldap_priv/ldapi" --exclude="*/ldapi" -czf "$ARCHIVE" "$SAMBA_PRIVATE" "$SAMBA_SYSVOL" "$SAMBA_CONFIG" || { + log_message "Erreur lors de la création de l'archive $ARCHIVE" "ERROR" + send_email "ERREUR: Échec de la création de l'archive Samba" "Le script n'a pas pu créer l'archive de sauvegarde $ARCHIVE." "ERROR" + return 1 + } + + log_message "Fichiers sauvegardés dans $ARCHIVE" "INFO" + + ACL_FILE="$BACKUP_DIR/${CUSTOM_NAME}_acl.acl" + getfacl -R "$SAMBA_SYSVOL" > "$ACL_FILE" || { + log_message "Erreur lors de la sauvegarde des ACL dans $ACL_FILE" "WARNING" + } + + log_message "ACL sauvegardées dans $ACL_FILE" "INFO" + + if [ -f "$ARCHIVE" ]; then + ARCHIVE_SIZE=$(du -h "$ARCHIVE" | cut -f1) + log_message "Sauvegarde terminée. Taille de l'archive: $ARCHIVE_SIZE" "INFO" + send_email "Sauvegarde Samba réussie" "La sauvegarde Samba a été effectuée avec succès.\n\nArchive: $ARCHIVE\nTaille: $ARCHIVE_SIZE" "SUCCESS" + else + log_message "L'archive $ARCHIVE n'existe pas après la sauvegarde" "ERROR" + send_email "ERREUR: Échec de la sauvegarde Samba" "L'archive de sauvegarde $ARCHIVE n'a pas été créée correctement." "ERROR" + return 1 + fi + fi + + return 0 +} + +# Fonction de restauration +restore_samba() { + log_message "Début de la restauration Samba..." "INFO" + + setup_admin_credentials || return 1 + check_mount || return 1 + + if [[ ! -d "$BACKUP_DIR" ]] || [[ -z $(ls -A "$BACKUP_DIR" | grep "tar.gz") ]]; then + log_message "Aucune sauvegarde trouvée dans $BACKUP_DIR" "ERROR" + return 1 + fi + + echo -e "${YELLOW}Liste des sauvegardes disponibles :${NC}" + ls -1 "$BACKUP_DIR" | grep "tar.gz" | nl + + echo -e "${YELLOW}Choisissez le numéro de la sauvegarde à restaurer :${NC}" + read -r BACKUP_CHOICE + BACKUP_FILE=$(ls -1 "$BACKUP_DIR" | grep "tar.gz" | sed -n "${BACKUP_CHOICE}p") + + if [[ -z "$BACKUP_FILE" ]]; then + log_message "Sélection invalide" "ERROR" + return 1 + fi + + BACKUP_PATH="$BACKUP_DIR/$BACKUP_FILE" + log_message "Sauvegarde sélectionnée : $BACKUP_FILE" "INFO" + + if [[ "$DRY_RUN" = true ]]; then + log_message "DRY RUN: Simulation de restauration de $BACKUP_PATH" "INFO" + echo -e "${GREEN}En mode DRY RUN, les étapes suivantes seraient exécutées :${NC}" + echo "1. Arrêt du service samba-ad-dc" + echo "2. Sauvegarde des fichiers actuels dans $BACKUP_DIR/original_$DATE/" + echo "3. Extraction de l'archive $BACKUP_PATH" + echo "4. Restauration des ACL si disponibles" + echo "5. Réinitialisation des permissions SYSVOL" + echo "6. Redémarrage du service samba-ad-dc" + return 0 + fi + + echo -e "${YELLOW}Arrêt du service Samba...${NC}" + systemctl stop samba-ad-dc || { + log_message "Erreur lors de l'arrêt du service samba-ad-dc" "ERROR" + return 1 + } + + BACKUP_ORIG_DIR="$BACKUP_DIR/original_$DATE" + mkdir -p "$BACKUP_ORIG_DIR" + log_message "Sauvegarde des fichiers originaux dans $BACKUP_ORIG_DIR" "INFO" + + tar -czf "$BACKUP_ORIG_DIR/original_samba_files.tar.gz" "$SAMBA_PRIVATE" "$SAMBA_SYSVOL" "$SAMBA_CONFIG" || { + log_message "Erreur lors de la sauvegarde des fichiers originaux" "WARNING" + echo -e "${YELLOW}Voulez-vous continuer la restauration quand même ? (o/n) :${NC}" + read -r CONTINUE_RESTORE + if [[ "$CONTINUE_RESTORE" != "o" ]]; then + systemctl start samba-ad-dc + log_message "Restauration annulée par l'utilisateur" "INFO" + return 1 + fi + } + + tar -xzf "$BACKUP_PATH" -C / || { + log_message "Erreur lors de l'extraction de l'archive $BACKUP_PATH" "ERROR" + echo -e "${RED}La restauration a échoué. Voulez-vous restaurer les fichiers originaux ? (o/n) :${NC}" + read -r RESTORE_ORIG + if [[ "$RESTORE_ORIG" == "o" ]]; then + tar -xzf "$BACKUP_ORIG_DIR/original_samba_files.tar.gz" -C / + log_message "Fichiers originaux restaurés" "INFO" + fi + systemctl start samba-ad-dc + return 1 + } + + ACL_FILE="$BACKUP_DIR/${BACKUP_FILE%.tar.gz}_acl.acl" + if [[ -f "$ACL_FILE" ]]; then + setfacl --restore="$ACL_FILE" + log_message "ACL restaurées depuis $ACL_FILE" "INFO" + else + log_message "Fichier ACL introuvable. Les permissions SYSVOL doivent être réinitialisées." "WARNING" + fi + + echo -e "${YELLOW}Réinitialisation des permissions SYSVOL...${NC}" + samba-tool ntacl sysvolreset || log_message "Erreur lors de la réinitialisation des permissions SYSVOL" "WARNING" + + echo -e "${YELLOW}Redémarrage du service Samba...${NC}" + systemctl start samba-ad-dc || { + log_message "Erreur lors du redémarrage du service samba-ad-dc" "ERROR" + send_email "ERREUR: Échec du redémarrage de Samba après restauration" "Le service samba-ad-dc n'a pas pu être redémarré après la restauration. Une intervention manuelle est requise." "ERROR" + return 1 + } + + log_message "Restauration Samba terminée avec succès" "INFO" + send_email "Restauration Samba réussie" "La restauration de Samba a été effectuée avec succès à partir de $BACKUP_PATH." "SUCCESS" + return 0 +} + +# Fonction d'affichage de l'aide +show_help() { + echo -e "${GREEN}Usage: $0 [options]${NC}" + echo + echo "Options:" + echo " --auto Mode automatique (sans interaction)" + echo " --retention=JOURS Définir la durée de rétention (défaut: 30 jours)" + echo " --dry-run Simuler les opérations sans les exécuter" + echo " --test-email Tester l'envoi d'email" + echo " --help Afficher cette aide" + echo + echo "Exemples:" + echo " $0 Exécution interactive" + echo " $0 --auto Exécution automatique de la sauvegarde" + echo " $0 --dry-run Simulation de sauvegarde" + echo " $0 --retention=60 Conserver les sauvegardes pendant 60 jours" + echo " $0 --test-email Tester l'envoi d'email" +} + +if [[ $EUID -ne 0 ]]; then + log_message "Ce script doit être exécuté en tant que root" "ERROR" + exit 1 +fi + +# Traitement des arguments +while [[ $# -gt 0 ]]; do + case "$1" in + --auto) + AUTO_MODE=true + shift + ;; + --retention=*) + RETENTION_DAYS="${1#*=}" + shift + ;; + --dry-run) + DRY_RUN=true + log_message "Mode DRY RUN activé - aucune modification ne sera effectuée" "INFO" + shift + ;; + --test-email) + test_send_email + exit 0 + ;; + --help) + show_help + exit 0 + ;; + *) + log_message "Option non reconnue: $1" "ERROR" + show_help + exit 1 + ;; + esac +done + +if [[ "$AUTO_MODE" = true ]]; then + backup_samba + exit_code=$? + exit $exit_code +else + echo -e "${YELLOW}Samba Backup & Restore Script${NC}" + echo -e "${GREEN}1. Sauvegarder Samba${NC}" + echo -e "${GREEN}2. Restaurer Samba${NC}" + echo -e "${GREEN}5. Quitter${NC}" + echo -e "Choisissez une option :" + read -r OPTION + + case $OPTION in + 1) + backup_samba + ;; + 2) + restore_samba + ;; + 5) + echo -e "${GREEN}Quitter...${NC}" + exit 0 + ;; + *) + log_message "Option invalide" "ERROR" + exit 1 + ;; + esac +fi diff --git a/samba_backup_restore.sh b/samba_backup_restore.sh deleted file mode 100644 index 7194ae7..0000000 --- a/samba_backup_restore.sh +++ /dev/null @@ -1,416 +0,0 @@ -#!/bin/bash - -# Variables -SAMBA_PRIVATE="/var/lib/samba/private" -SAMBA_SYSVOL="/var/lib/samba/sysvol" -SAMBA_CONFIG="/etc/samba" -BACKUP_DIR="/mnt/Backups/srv-mtp-addc01/sauvegardes/samba" -BACKUP_MOUNT="/mnt/Backups" -BACKUP_SHARE="//192.168.1.100/Backups" # Remplacez par votre partage réseau -BACKUP_USER="backup_user" # Remplacez par votre utilisateur de sauvegarde -BACKUP_PASSWORD="backup_password" # Remplacez par votre mot de passe -DATE=$(date +%Y%m%d_%H%M%S) -GREEN="\033[1;32m" -RED="\033[1;31m" -YELLOW="\033[1;33m" -NC="\033[0m" -ADMIN_USER="Administrator" -DOMAIN="h3adm.lan" -LOG_FILE="/var/log/samba_backup.log" -MAIL_TO="admin@h3campus.fr" # Adresse email pour les notifications - - -# Ports requis pour Samba AD -REQUIRED_PORTS=( - 53 # DNS - 88 # Kerberos - 123 # NTP - 139 # NetBIOS - 389 # LDAP - 445 # SMB - 464 # Kerberos password - 636 # LDAPS - 3268 # Global Catalog - 3269 # Global Catalog SSL - 8385 # Port utilisé par Syncthing pour l'interface du serveur de relais (STRelaySrv) - 22000 # Port utilisé par Syncthing pour les transferts de fichiers - 22001 # Port utilisé par Syncthing pour les connexions relayées - 22027 # Port utilisé par Syncthing pour la découverte globale - 161 # Port utilisé par SNMP (Simple Network Management Protocol) pour les requêtes de gestion -) - -# Couleurs pour le rapport HTML -COLOR_GREEN="#e6ffe6" -COLOR_RED="#ffe6e6" -COLOR_YELLOW="#fffae6" - -# Fonction de logging -log_message() { - echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" -} - -# Vérification des outils LDAP -check_ldap_tools() { - local ldap_packages=("ldap-utils") - local missing_packages=() - - for pkg in "${ldap_packages[@]}"; do - if ! dpkg -s "$pkg" &> /dev/null; then - missing_packages+=("$pkg") - fi - done - - if [ ${#missing_packages[@]} -gt 0 ]; then - log_message "Installation des paquets LDAP manquants : ${missing_packages[*]}" - apt-get update -apt-get install -y "${missing_packages[@]}" - fi -} - -# Vérification de la cohérence de la base de données -check_database_consistency() { - local db_checks=() - local temp_file="/tmp/dbcheck_output.txt" - - log_message "Début de la vérification de la base de données AD" - - # Vérification de la base de données avec dbcheck - if samba-tool dbcheck --cross-ncs > "$temp_file" 2>&1; then - db_checks+=("Base de données ADCohérente") - else - db_checks+=("Base de données ADProblèmes détectés") - - # Extraction et formatage des erreurs - local db_errors=$(cat "$temp_file" | sed 's//\>/g' | sed 's/\n/
/g') - db_checks+=("Erreurs détectées:
$db_errors
") - fi - - # Vérification des objets supprimés - local deleted_objects=$(samba-tool dbcheck --cross-ncs --fix --yes 2>&1 | grep "fix_all_deleted_objects") - if [ -n "$deleted_objects" ]; then - db_checks+=("Objets supprimésNettoyage effectué") - fi - - # Vérification de la réplication (si applicable dans votre environnement) - if samba-tool drs showrepl 2>/dev/null | grep -q "failed"; then - db_checks+=("Réplication ADErreurs de réplication détectées") - else - db_checks+=("Réplication ADFonctionnelle") - fi - - # Nettoyage - rm -f "$temp_file" - - echo "${db_checks[@]}" -} - -# Vérification des processus Samba -check_samba_processes() { - local processes_to_check=( - "samba" - "winbind_server" - "ldap_server" - "dns" - "kdc_server" - "dreplsrv" - "rpc_server" - "cldap_server" - "nbt_server" - ) - local process_status=() - - log_message "Début de la vérification des processus Samba" - - local samba_processes=$(samba-tool processes | tail -n +3 | awk '{print $1}' | sort | uniq) - - for proc in "${processes_to_check[@]}"; do - if echo "$samba_processes" | grep -q "$proc"; then - process_status+=("$procActif") - else - process_status+=("$procInactif") - fi - done - - echo "${process_status[@]}" -} - -check_syncthing_processes() { - local processes_to_check=( - "syncthing" - ) - local process_status=() - #log_message "Début de la vérification des processus Syncthing" - - # Correction: utilisation de ps ou pgrep pour vérifier les processus - local syncthing_processes=$(ps aux | awk '{print $11}' | sort | uniq) - for proc in "${processes_to_check[@]}"; do - if echo "$syncthing_processes" | grep -q "$proc"; then - process_status+=("$procActif") - else - process_status+=("$procInactif") - fi - done - echo "${process_status[@]}" -} - -check_tis_services() { - local services_to_check=( - "tis-sysvolsync" - "tis-sysvolacl" - ) - local service_status=() - #log_message "Début de la vérification des services TIS" - - for service in "${services_to_check[@]}"; do - # Vérifier si le service est activé (enabled au démarrage) - if systemctl is-enabled "$service" &>/dev/null; then - local enabled_status="Activé au démarrage" - local enabled_color="$COLOR_GREEN" - else - local enabled_status="Non activé au démarrage" - local enabled_color="$COLOR_RED" - fi - - # Vérifier si le service est démarré (running) - if systemctl is-active "$service" &>/dev/null; then - local active_status="Démarré" - local active_color="$COLOR_GREEN" - else - local active_status="Arrêté" - local active_color="$COLOR_RED" - fi - - service_status+=("$service$enabled_status$active_status") - done - - echo "${service_status[@]}" -} - -# Vérification détaillée Kerberos -check_kerberos() { - local kerberos_checks=() - local password="Linux741!" - - # Demander interactivement le mot de passe - #read -s -p "Mot de passe pour $ADMIN_USER : " password - echo - - local kdc_processes=$(samba-tool processes | grep "kdc_server") - - if [ -n "$kdc_processes" ]; then - if echo "$password" | kinit "$ADMIN_USER" &> /dev/null; then - kerberos_checks+=("Authentification KerberosActif et Valide") - else - kerberos_checks+=("Authentification KerberosProblème détecté") - kerberos_checks+=("Problème avec l'authentification Kerberos pour l'utilisateur '$ADMIN_USER'.") - fi - else - kerberos_checks+=("Authentification KerberosProblème détecté") - kerberos_checks+=("Service KDC inactif.") - fi - - echo "${kerberos_checks[@]}" -} - -# Vérification LDAP -check_ldap() { - local ldap_checks=() - - # Vérifier la configuration LDAP via samba-tool - if samba-tool domain info $(hostname -f) &> /dev/null; then - ldap_checks+=("Annuaire LDAPConfiguré et Accessible") - else - ldap_checks+=("Annuaire LDAPProblème de configuration") - ldap_checks+=("Impossible de récupérer les informations du domaine.") - fi - - echo "${ldap_checks[@]}" -} - -# Vérification DNS -check_dns() { - local dns_checks=() - - local dns_processes=$(samba-tool processes | grep "dns") - - if [ -n "$dns_processes" ] && host "$DOMAIN_NAME" &> /dev/null; then - dns_checks+=("Serveur DNSActif et Fonctionnel") - else - dns_checks+=("Serveur DNSProblème détecté") - dns_checks+=("Problème avec le service DNS.") - fi - - echo "${dns_checks[@]}" -} - -# Vérification de la synchronisation de l'heure -check_time_sync() { - local time_checks=() - - # Vérifier si ntpd ou chronyd est installé - if ! command -v ntpstat &> /dev/null && ! command -v chronyc &> /dev/null; then - time_checks+=("Service NTPNon installé") - return - fi - - # Vérifier la synchronisation avec chronyd - if command -v chronyc &> /dev/null; then - if chronyc tracking | grep -q "^Leap status.*Normal"; then - local offset=$(chronyc tracking | grep "Last offset" | awk '{print $4}') - if [ "$(echo "$offset < 1.0" | bc -l)" -eq 1 ]; then - time_checks+=("Synchronisation NTP (chronyd)Synchronisé (offset: ${offset}s)") - else - time_checks+=("Synchronisation NTP (chronyd)Offset important: ${offset}s") - fi - else - time_checks+=("Synchronisation NTP (chronyd)Non synchronisé") - fi - fi - - # Vérifier la synchronisation avec ntpd - if command -v ntpq &> /dev/null; then - if ntpq -p &> /dev/null; then - local offset=$(ntpq -c rv | grep offset | cut -d= -f2) - if [ "$(echo "$offset < 1.0" | bc -l)" -eq 1 ]; then - time_checks+=("Synchronisation NTP (ntpd)Synchronisé (offset: ${offset}ms)") - else - time_checks+=("Synchronisation NTP (ntpd)Offset important: ${offset}ms") - fi - else - time_checks+=("Synchronisation NTP (ntpd)Non synchronisé") - fi - fi - - echo "${time_checks[@]}" -} - -# Vérification des ports UFW -check_ufw_ports() { - local ufw_checks=() - - # Vérifier si UFW est installé - if ! command -v ufw &> /dev/null; then - ufw_checks+=("UFWNon installé") - return - fi - - # Vérifier si UFW est actif - if ! ufw status | grep -q "Status: active"; then - ufw_checks+=("UFW StatusInactif") - return - fi - - # Vérifier chaque port requis - for port in "${REQUIRED_PORTS[@]}"; do - if ufw status | grep -qE "^$port/(tcp|udp).*ALLOW"; then - ufw_checks+=("Port $portOuvert") - else - ufw_checks+=("Port $portFermé") - fi - done - - echo "${ufw_checks[@]}" -} - -# Génération du rapport HTML -generate_html_report() { - cat << EOF > "$REPORT_FILE" - - - - Rapport Monitoring Samba AD DC - $SERVER_NAME - - - -

Rapport de Monitoring Samba AD DC - $SERVER_NAME - $(date '+%d/%m/%Y %H:%M:%S')

- -

Processus Samba AD

- - $(check_samba_processes) -
- -

Processus Syncthing Sysvol

- - $(check_syncthing_processes) -
- -

Processus tis-sysvol services

- - $(check_tis_services) -
- -

Authentification Kerberos

- - $(check_kerberos) -
- -

Annuaire LDAP

- - $(check_ldap) -
- -

Serveur DNS

- - $(check_dns) -
- -

Synchronisation de l'heure

- - $(check_time_sync) -
- -

État des ports UFW

- - $(check_ufw_ports) -
- -

État de la Base de Données AD

- - $(check_database_consistency) -
- - -EOF -} - -# Envoi du rapport par email -send_email_report() { - if [ -f "$REPORT_FILE" ]; then - if command -v sendmail &> /dev/null; then - ( - echo "To: $ADMIN_EMAIL" - echo "Subject: Rapport Monitoring Samba AD DC - $SERVER_NAME - $(date '+%d/%m/%Y')" - echo "Content-Type: text/html" - echo "" - cat "$REPORT_FILE" - ) | sendmail -t - log_message "Rapport envoyé via sendmail à $ADMIN_EMAIL" - elif command -v ssmtp &> /dev/null; then - ( - echo "To: $ADMIN_EMAIL" - echo "Subject: Rapport Monitoring Samba AD DC - $SERVER_NAME - $(date '+%d/%m/%Y')" - echo "Content-Type: text/html" - echo "" - cat "$REPORT_FILE" - ) | ssmtp "$ADMIN_EMAIL" - log_message "Rapport envoyé via ssmtp à $ADMIN_EMAIL" - else - log_message "Aucun outil d'envoi d'email (sendmail/ssmtp) trouvé. Le rapport n'a pas été envoyé." - fi - else - log_message "Le fichier de rapport $REPORT_FILE n'existe pas. Impossible d'envoyer l'email." - fi -} - -# Démarrage du monitoring -log_message "Démarrage du script de monitoring" -check_ldap_tools -generate_html_report -send_email_report -log_message "Script terminé avec succès"