diff --git a/samba_backup_restore.sh b/samba_backup_restore.sh index 72be7ad..3680661 100644 --- a/samba_backup_restore.sh +++ b/samba_backup_restore.sh @@ -5,6 +5,10 @@ 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" @@ -12,62 +16,117 @@ YELLOW="\033[1;33m" NC="\033[0m" ADMIN_USER="Administrator" DOMAIN="h3adm.lan" -SERVER="srv-*-*" -IP="192.168.*.*" -REVERSE_IP="*.168.192.in-addr.arpa" -OLD_SERVER="srv-poi-addc01" -OLD_IP="192.168.*.*" -OLD_REVERSE_IP="*.168.192.in-addr.arpa" -ADMIN_EMAIL="*.h3campus.fr" +LOG_FILE="/var/log/samba_backup.log" +MAIL_TO="admin@h3campus.fr" # Adresse email pour les notifications # Mode automatique (défaut à false) AUTO_MODE=false +RETENTION_DAYS=30 # Nombre de jours de conservation des backups -# Parsing des arguments -while [[ $# -gt 0 ]]; do - case "$1" in - --auto) - AUTO_MODE=true - shift - ;; - *) - echo -e "${RED}Option non reconnue: $1${NC}" - exit 1 - ;; - esac -done +# Fonction de journalisation +log_message() { + local message="$1" + local level="$2" + + # Afficher le message sur la console + 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 + + # Enregistrer dans le fichier journal + echo "[$(date +"%Y-%m-%d %H:%M:%S")] [$level] $message" >> "$LOG_FILE" +} -# Vérification des privilèges root -if [[ $EUID -ne 0 ]]; then - echo -e "${RED}Ce script doit être exécuté en tant que root.${NC}" - exit 1 -fi +# Fonction d'envoi d'email +send_email() { + local subject="$1" + local body="$2" + + echo "$body" | mail -s "$subject" "$MAIL_TO" + + if [ $? -eq 0 ]; then + log_message "Email envoyé à $MAIL_TO" "INFO" + else + log_message "Échec de l'envoi d'email à $MAIL_TO" "ERROR" + fi +} -# fonction asauvegarde des GPO +# Fonction pour vérifier et monter le partage réseau +check_mount() { + # Vérifier si le point de montage existe + if [ ! -d "$BACKUP_MOUNT" ]; then + mkdir -p "$BACKUP_MOUNT" + log_message "Création du point de montage $BACKUP_MOUNT" "INFO" + fi + + # Vérifier si le partage est déjà monté + if mountpoint -q "$BACKUP_MOUNT"; then + log_message "Le partage est déjà monté sur $BACKUP_MOUNT" "INFO" + return 0 + fi + + # Tenter de monter le partage + 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." + return 1 + fi +} + +# Fonction de sauvegarde des GPO backup_gpo() { - echo -e "${YELLOW}Sauvegarde des GPO...${NC}" + log_message "Sauvegarde des GPO..." "INFO" GPO_BACKUP_DIR="$BACKUP_DIR/gpo_backup_$DATE" mkdir -p "$GPO_BACKUP_DIR" # Utiliser samba-tool pour sauvegarder les GPO - samba-tool gpo backup "$GPO_BACKUP_DIR" -U "$ADMIN_USER" + samba-tool gpo backup "$GPO_BACKUP_DIR" -U "$ADMIN_USER" || { + log_message "Erreur lors de la sauvegarde des GPO" "ERROR" + send_email "ERREUR: Échec de la sauvegarde des GPO Samba" "Le script de sauvegarde n'a pas pu sauvegarder les GPO. Vérifiez les logs pour plus de détails." + return 1 + } - if [ $? -eq 0 ]; then - echo -e "${GREEN}Sauvegarde des GPO terminée dans $GPO_BACKUP_DIR${NC}" - else - echo -e "${RED}Erreur lors de la sauvegarde des GPO${NC}" - fi + log_message "Sauvegarde des GPO terminée dans $GPO_BACKUP_DIR" "INFO" + return 0 } -# Fonction de sauvegarde Samba +# Fonction de nettoyage des anciennes sauvegardes +cleanup_old_backups() { + log_message "Nettoyage des anciennes sauvegardes (plus de $RETENTION_DAYS jours)..." "INFO" + find "$BACKUP_DIR" -name "samba_backup_*" -type f -mtime +$RETENTION_DAYS -delete + find "$BACKUP_DIR" -name "gpo_backup_*" -type d -mtime +$RETENTION_DAYS -exec rm -rf {} \; 2>/dev/null || true + log_message "Nettoyage terminé" "INFO" +} + +# Fonction principale de sauvegarde Samba backup_samba() { - echo -e "${YELLOW}Début de la sauvegarde Samba...${NC}" - mkdir -p "$BACKUP_DIR" + log_message "Début de la sauvegarde Samba..." "INFO" + + # Vérifier et monter le partage + check_mount || return 1 + + # Vérifier que le répertoire de sauvegarde existe + if [ ! -d "$BACKUP_DIR" ]; then + 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." + return 1 + } + fi # Mode automatique : génération automatique du nom de sauvegarde if [[ "$AUTO_MODE" = true ]]; then CUSTOM_NAME="samba_backup_$DATE" - echo -e "${GREEN}Mode automatique activé. Sauvegarde : $CUSTOM_NAME${NC}" + 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 @@ -78,164 +137,174 @@ backup_samba() { ARCHIVE="$BACKUP_DIR/${CUSTOM_NAME}.tar.gz" - # Suppression des anciennes sauvegardes - find "$BACKUP_DIR" -name "samba_backup_*" -type f -mtime +30 -delete - + # Nettoyer les anciennes sauvegardes + cleanup_old_backups + # Sauvegarde des GPO - backup_gpo + backup_gpo || return 1 + + # Vérifier l'espace disque disponible + REQUIRED_SPACE=$(du -s "$SAMBA_PRIVATE" "$SAMBA_SYSVOL" "$SAMBA_CONFIG" | awk '{total += $1} END {print total}') + AVAILABLE_SPACE=$(df -k "$BACKUP_DIR" | tail -1 | awk '{print $4}') + + if [ "$AVAILABLE_SPACE" -lt "$REQUIRED_SPACE" ]; then + log_message "Espace disque insuffisant pour la sauvegarde. Requis: $REQUIRED_SPACE KB, Disponible: $AVAILABLE_SPACE KB" "ERROR" + send_email "ERREUR: Espace disque insuffisant pour la sauvegarde Samba" "L'espace disque est insuffisant pour effectuer la sauvegarde. Requis: $REQUIRED_SPACE KB, Disponible: $AVAILABLE_SPACE KB" + return 1 + fi # Création de l'archive - tar -czvf "$ARCHIVE" "$SAMBA_PRIVATE" "$SAMBA_SYSVOL" "$SAMBA_CONFIG" - echo -e "${GREEN}Fichiers sauvegardés dans $ARCHIVE${NC}" + tar -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." + return 1 + } + + log_message "Fichiers sauvegardés dans $ARCHIVE" "INFO" # Sauvegarde des ACL ACL_FILE="$BACKUP_DIR/${CUSTOM_NAME}_acl.acl" - getfacl -R "$SAMBA_SYSVOL" > "$ACL_FILE" - echo -e "${GREEN}ACL sauvegardées dans $ACL_FILE${NC}" + getfacl -R "$SAMBA_SYSVOL" > "$ACL_FILE" || { + log_message "Erreur lors de la sauvegarde des ACL dans $ACL_FILE" "WARNING" + # On continue malgré cette erreur, car ce n'est pas critique + } - # En mode automatique, on ajoute des logs si nécessaire - if [[ "$AUTO_MODE" = true ]]; then - echo "[$(date)] Sauvegarde Samba automatique : $ARCHIVE" >> /var/log/samba_backup.log - fi -} - -restore_gpo() { - local BACKUP_PATH="$1" - echo -e "${YELLOW}Début de la restauration des GPO...${NC}" + log_message "ACL sauvegardées dans $ACL_FILE" "INFO" - # Chercher le répertoire de sauvegarde des GPO - local GPO_BACKUP_DIR=$(find "$BACKUP_DIR" -type d -name "gpo_backup_*" | sort -r | head -n 1) - - if [[ -z "$GPO_BACKUP_DIR" ]]; then - echo -e "${RED}Aucune sauvegarde de GPO trouvée.${NC}" - return 1 - fi - - echo -e "${GREEN}Restauration des GPO depuis $GPO_BACKUP_DIR${NC}" - - # Lister les GPO disponibles dans le répertoire de sauvegarde - local GPO_LIST=$(ls "$GPO_BACKUP_DIR") - - # Utiliser samba-tool pour restaurer les GPO - for gpo in $GPO_LIST; do - samba-tool gpo restore "$gpo" "$GPO_BACKUP_DIR" -U "$ADMIN_USER" --password="$ADMIN_PASS" - done - - if [ $? -eq 0 ]; then - echo -e "${GREEN}Restauration des GPO terminée.${NC}" + # Vérifier la taille de l'archive créée + 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.\nArchive: $ARCHIVE\nTaille: $ARCHIVE_SIZE" else - echo -e "${RED}Erreur lors de la restauration des GPO${NC}" + 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." return 1 fi + + return 0 } -# Fonction de restauration Samba +# Fonction de restauration restore_samba() { - echo -e "${YELLOW}Début de la restauration Samba...${NC}" + log_message "Début de la restauration Samba..." "INFO" + + # Vérifier et monter le partage + check_mount || return 1 + if [[ ! -d "$BACKUP_DIR" ]] || [[ -z $(ls -A "$BACKUP_DIR" | grep "tar.gz") ]]; then - echo -e "${RED}Aucune sauvegarde trouvée dans $BACKUP_DIR.${NC}" - exit 1 + 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 - echo -e "${RED}Sélection invalide.${NC}" - exit 1 - fi - BACKUP_PATH="$BACKUP_DIR/$BACKUP_FILE" - echo -e "${GREEN}Sauvegarde sélectionnée : $BACKUP_FILE${NC}" - echo -e "${YELLOW}Arrêt du service Samba...${NC}" - systemctl stop samba-ad-dc + 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" + + 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 + } + + # Sauvegarde des fichiers actuels avant restauration BACKUP_ORIG_DIR="$BACKUP_DIR/original_$DATE" mkdir -p "$BACKUP_ORIG_DIR" - tar -czvf "$BACKUP_ORIG_DIR/original_samba_files.tar.gz" "$SAMBA_PRIVATE" "$SAMBA_SYSVOL" "$SAMBA_CONFIG" - echo -e "${GREEN}Sauvegarde des fichiers originaux dans $BACKUP_ORIG_DIR${NC}" + log_message "Sauvegarde des fichiers originaux dans $BACKUP_ORIG_DIR" "INFO" - tar -xzvf "$BACKUP_PATH" -C / + 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 + } - # Demander le mot de passe admin pour la restauration des GPO - read -sp "Entrez le mot de passe administrateur pour restaurer les GPO : " ADMIN_PASS - echo + # Extraction de l'archive + 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 + } - # Appeler la fonction de restauration des GPO - restore_gpo "$BACKUP_PATH" - - echo -e "${GREEN}Fichiers restaurés depuis $BACKUP_PATH${NC}" + # Restauration des ACL ACL_FILE="$BACKUP_DIR/${BACKUP_FILE%.tar.gz}_acl.acl" if [[ -f "$ACL_FILE" ]]; then setfacl --restore="$ACL_FILE" - echo -e "${GREEN}ACL restaurées depuis $ACL_FILE${NC}" + log_message "ACL restaurées depuis $ACL_FILE" "INFO" else - echo -e "${RED}Fichier ACL introuvable. Les permissions SYSVOL doivent être réinitialisées.${NC}" + 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 - echo -e "${YELLOW}Mise à jour des fichiers de configuration Samba...${NC}" - echo -e "${YELLOW}Entrez le nouveau nom du serveur :${NC}" - read -r NEW_HOSTNAME - echo -e "${YELLOW}Entrez la nouvelle adresse IP du serveur :${NC}" - read -r NEW_IP - sed -i "s/$(hostname)/$NEW_HOSTNAME/" "$SAMBA_CONFIG/smb.conf" - hostnamectl set-hostname "$NEW_HOSTNAME" - echo "$NEW_IP $(hostname)" >> /etc/hosts - echo -e "${GREEN}Configuration mise à jour avec le nom $NEW_HOSTNAME et l'adresse $NEW_IP.${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 - echo -e "${GREEN}Restauration Samba terminée.${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." + 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." + return 0 } -# Fonction pour ajouter des enregistrements DNS -add_dns_records() { - samba-tool dns add $SERVER $DOMAIN _ldap._tcp SRV "$SERVER.$DOMAIN 389 0 100" -U $ADMIN_USER --password=$ADMIN_PASS - samba-tool dns add $SERVER $DOMAIN _kerberos._tcp SRV "$SERVER.$DOMAIN 88 0 100" -U $ADMIN_USER --password=$ADMIN_PASS - samba-tool dns add $SERVER $DOMAIN _kerberos._udp SRV "$SERVER.$DOMAIN 88 0 100" -U $ADMIN_USER --password=$ADMIN_PASS - samba-tool dns add $SERVER $DOMAIN _kpasswd._tcp SRV "$SERVER.$DOMAIN 464 0 100" -U $ADMIN_USER --password=$ADMIN_PASS - samba-tool dns add $SERVER $DOMAIN _kpasswd._udp SRV "$SERVER.$DOMAIN 464 0 100" -U $ADMIN_USER --password=$ADMIN_PASS - samba-tool dns add $SERVER $REVERSE_IP 210 PTR "$SERVER.$DOMAIN" -U $ADMIN_USER --password=$ADMIN_PASS - samba-tool dns add $SERVER $DOMAIN $SERVER A $IP -U $ADMIN_USER --password=$ADMIN_PASS - samba-tool dns add $SERVER $DOMAIN @ NS "$SERVER.$DOMAIN" -U $ADMIN_USER --password=$ADMIN_PASS -} +# Vérification des privilèges root +if [[ $EUID -ne 0 ]]; then + log_message "Ce script doit être exécuté en tant que root" "ERROR" + exit 1 +fi -# Fonction pour supprimer les anciens enregistrements DNS -delete_old_dns_records() { - samba-tool dns delete $SERVER $DOMAIN _ldap._tcp SRV "$OLD_SERVER.$DOMAIN 389 0 100" -U $ADMIN_USER --password=$ADMIN_PASS - samba-tool dns delete $SERVER $DOMAIN _kerberos._tcp SRV "$OLD_SERVER.$DOMAIN 88 0 100" -U $ADMIN_USER --password=$ADMIN_PASS - samba-tool dns delete $SERVER $DOMAIN _kerberos._udp SRV "$OLD_SERVER.$DOMAIN 88 0 100" -U $ADMIN_USER --password=$ADMIN_PASS - samba-tool dns delete $SERVER $DOMAIN _kpasswd._tcp SRV "$OLD_SERVER.$DOMAIN 464 0 100" -U $ADMIN_USER --password=$ADMIN_PASS - samba-tool dns delete $SERVER $DOMAIN _kpasswd._udp SRV "$OLD_SERVER.$DOMAIN 464 0 100" -U $ADMIN_USER --password=$ADMIN_PASS - samba-tool dns delete $SERVER $OLD_REVERSE_IP 210 PTR "$OLD_SERVER.$DOMAIN" -U $ADMIN_USER --password=$ADMIN_PASS - samba-tool dns delete $SERVER $DOMAIN $OLD_SERVER A $OLD_IP -U $ADMIN_USER --password=$ADMIN_PASS - samba-tool dns delete $SERVER $DOMAIN @ NS "$OLD_SERVER.$DOMAIN" -U $ADMIN_USER --password=$ADMIN_PASS -} - -# Fonction pour mettre à jour l'enregistrement SOA -update_soa_record() { - samba-tool dns update $SERVER $DOMAIN @ SOA "$OLD_SERVER.$DOMAIN. admin.$DOMAIN. 62646 900 600 86400 3600" "$SERVER.$DOMAIN. $ADMIN_EMAIL. 2024120901 900 600 86400 3600" -U $ADMIN_USER --password=$ADMIN_PASS -} - -# Fonction pour vérifier les enregistrements DNS -verify_dns_records() { - host -t A $SERVER.$DOMAIN - host -t SRV _ldap._tcp.$DOMAIN - host -t SRV _kerberos._tcp.$DOMAIN - host -t SRV _kerberos._udp.$DOMAIN - host -t SRV _kpasswd._tcp.$DOMAIN - host -t SRV _kpasswd._udp.$DOMAIN -} +# Parsing des arguments +while [[ $# -gt 0 ]]; do + case "$1" in + --auto) + AUTO_MODE=true + shift + ;; + --retention=*) + RETENTION_DAYS="${1#*=}" + shift + ;; + *) + log_message "Option non reconnue: $1" "ERROR" + exit 1 + ;; + esac +done # Menu principal modifié pour supporter le mode auto 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}3. Mise à jour du DNS${NC}" - echo -e "${GREEN}4. Quitter${NC}" + echo -e "${GREEN}3. Quitter${NC}" echo -e "Choisissez une option :" read -r OPTION @@ -247,24 +316,11 @@ else restore_samba ;; 3) - read -sp "Enter password for $ADMIN_USER: " ADMIN_PASS - echo - echo -e "\e[34mSuppression des anciens enregistrements DNS...\e[0m" - delete_old_dns_records - echo -e "\e[32mAjout des nouveaux enregistrements DNS...\e[0m" - add_dns_records - echo -e "\e[35mMise à jour de l'enregistrement SOA...\e[0m" - update_soa_record - echo -e "\e[33mVérification des enregistrements DNS...\e[0m" - verify_dns_records - echo -e "\e[36mMise à jour du DNS terminée.\e[0m" - ;; - 4) echo -e "${GREEN}Quitter...${NC}" exit 0 ;; *) - echo -e "${RED}Option invalide.${NC}" + log_message "Option invalide" "ERROR" exit 1 ;; esac