267 lines
7.8 KiB
Bash
Executable File
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 "$@" |