Files
Maison/Migration/importDns.sh
2026-02-10 12:12:11 +01:00

267 lines
7.8 KiB
Bash
Executable File

#!/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 "$@"