#!/bin/bash # importDns.sh - Import DNS zones and records from CSV files to Samba4 # Utilise les fichiers CSV générés par exportDns.ps1 set -euo pipefail # Configuration DNS_DIR="Transfert/Dns" ZONES_CSV="$DNS_DIR/dns_zones.csv" # Couleurs pour l'affichage RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Fonction d'affichage avec couleurs log_info() { echo -e "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[OK]${NC} $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } log_error() { echo -e "${RED}[ERREUR]${NC} $1" } # Vérifications préalables check_prerequisites() { log_info "Vérification des prérequis..." # Vérifier que samba-tool est disponible if ! command -v samba-tool &> /dev/null; then log_error "samba-tool non trouvé. Assurez-vous que Samba4 est installé." exit 1 fi # Vérifier que le répertoire DNS existe if [[ ! -d "$DNS_DIR" ]]; then log_error "Répertoire DNS non trouvé: $DNS_DIR" exit 1 fi # Vérifier que le fichier des zones existe if [[ ! -f "$ZONES_CSV" ]]; then log_error "Fichier des zones non trouvé: $ZONES_CSV" exit 1 fi log_success "Prérequis validés" } # Demander les credentials get_credentials() { log_info "Configuration des credentials Samba4" echo read -p "Nom d'utilisateur administrateur Samba [Administrator]: " SAMBA_USER SAMBA_USER=${SAMBA_USER:-Administrator} echo -n "Mot de passe pour $SAMBA_USER: " read -s SAMBA_PASSWORD echo echo # Vérifier les credentials log_info "Test des credentials..." if ! samba-tool user show "$SAMBA_USER" --username="$SAMBA_USER" --password="$SAMBA_PASSWORD" &>/dev/null; then log_error "Credentials invalides ou utilisateur non autorisé" exit 1 fi log_success "Credentials validés pour $SAMBA_USER" echo } # Demander le mode d'exécution get_execution_mode() { echo "Modes d'exécution disponibles:" echo " 1. Dry-run (afficher les commandes sans les exécuter)" echo " 2. Import réel (exécuter les commandes)" echo while true; do read -p "Choisissez le mode [1/2]: " MODE_CHOICE case $MODE_CHOICE in 1) DRY_RUN=true log_info "Mode dry-run activé - aucune modification ne sera effectuée" break ;; 2) DRY_RUN=false log_info "Mode import réel activé" break ;; *) echo "Choix invalide. Entrez 1 ou 2." ;; esac done echo } # Fonction pour exécuter les commandes samba-tool execute_samba_cmd() { local cmd="$1" local description="$2" if [[ "$DRY_RUN" == "true" ]]; then echo " [DRY-RUN] $description" echo " → $cmd" else if eval "$cmd" &>/dev/null; then log_success "$description" else log_error "$description" return 1 fi fi } # Créer une zone DNS si elle n'existe pas create_zone_if_not_exists() { local zone_name="$1" if [[ "$DRY_RUN" == "true" ]]; then echo " [DRY-RUN] Vérification/création de la zone: $zone_name" return 0 fi # Vérifier si la zone existe déjà if samba-tool dns query localhost "$zone_name" @ SOA --username="$SAMBA_USER" --password="$SAMBA_PASSWORD" &>/dev/null; then log_info "Zone $zone_name existe déjà" else log_info "Création de la zone: $zone_name" if samba-tool dns zonecreate localhost "$zone_name" --username="$SAMBA_USER" --password="$SAMBA_PASSWORD" &>/dev/null; then log_success "Zone $zone_name créée avec succès" else log_error "Impossible de créer la zone $zone_name" return 1 fi fi } # Traiter les enregistrements d'une zone process_zone_records() { local zone_name="$1" local records_file="$DNS_DIR/dns_records_${zone_name}.csv" if [[ ! -f "$records_file" ]]; then log_warning "Fichier d'enregistrements non trouvé: $records_file" return 0 fi log_info "Traitement des enregistrements pour la zone: $zone_name" local record_count=0 local success_count=0 # Lire le fichier CSV ligne par ligne (en sautant l'en-tête) while IFS=',' read -r name type ttl value timestamp; do # Supprimer les guillemets name=$(echo "$name" | tr -d '"') type=$(echo "$type" | tr -d '"') ttl=$(echo "$ttl" | tr -d '"') value=$(echo "$value" | tr -d '"') # Ignorer l'en-tête if [[ "$name" == "Name" ]]; then continue fi # Ignorer les enregistrements système et spéciaux if [[ "$name" == "@" ]] || [[ "$name" =~ ^_.*$ ]] || [[ "$type" == "SOA" ]] || [[ "$type" == "NS" ]]; then continue fi # Construire la commande samba-tool local cmd="samba-tool dns add localhost \"$zone_name\" \"$name\" $type \"$value\" --username=\"$SAMBA_USER\" --password=\"$SAMBA_PASSWORD\"" local description="Ajout enregistrement: $name ($type) → $value" ((record_count++)) if execute_samba_cmd "$cmd" "$description"; then ((success_count++)) fi done < "$records_file" if [[ "$DRY_RUN" == "false" ]]; then log_info "Zone $zone_name: $success_count/$record_count enregistrements traités avec succès" fi echo } # Fonction principale d'import import_dns_zones() { log_info "Début de l'import DNS depuis les fichiers CSV" echo local total_zones=0 local processed_zones=0 # Lire le fichier des zones (en sautant l'en-tête) while IFS=',' read -r zone_name zone_type is_reverse is_primary dynamic_update record_count; do # Supprimer les guillemets zone_name=$(echo "$zone_name" | tr -d '"') zone_type=$(echo "$zone_type" | tr -d '"') is_primary=$(echo "$is_primary" | tr -d '"') # Ignorer l'en-tête if [[ "$zone_name" == "ZoneName" ]]; then continue fi # Traiter seulement les zones Forward Primary (pas les reverse) if [[ "$zone_type" != "Forward" ]] || [[ "$is_primary" != "True" ]]; then log_info "Ignorer la zone: $zone_name (Type: $zone_type, Primary: $is_primary)" continue fi ((total_zones++)) echo "===================================================================================" log_info "Traitement de la zone: $zone_name" echo # Créer la zone si nécessaire if create_zone_if_not_exists "$zone_name"; then # Traiter les enregistrements de la zone process_zone_records "$zone_name" ((processed_zones++)) else log_error "Échec de la création/vérification de la zone: $zone_name" fi done < "$ZONES_CSV" echo "===================================================================================" log_success "Import terminé: $processed_zones/$total_zones zones traitées" } # Fonction principale main() { echo "===================================================================================" echo " IMPORT DNS VERS SAMBA4" echo "===================================================================================" echo check_prerequisites get_credentials get_execution_mode import_dns_zones echo log_success "Script d'import DNS terminé avec succès !" } # Exécution du script principal main "$@"