#!/bin/bash # Fonction pour convertir une adresse IP en entier function ip_to_int() { local ip=$1 local a b c d IFS=. read -r a b c d <<< "$ip" echo "$((a * 256 ** 3 + b * 256 ** 2 + c * 256 + d))" } # Fonction pour convertir un entier en adresse IP function int_to_ip() { local int=$1 echo "$((int >> 24 & 255)).$((int >> 16 & 255)).$((int >> 8 & 255)).$((int & 255))" } # Fonction pour générer une adresse MAC unique (incrémenter tous les octets) function int_to_mac() { local base_mac="00:22:33" # Préfixe de base pour la MAC (4 premiers octets) local incr=$1 # Incrément global pour les derniers octets local byte1=$(( (incr >> 16) & 0xFF )) # Incrémenter le premier octet des 2 derniers octets local byte2=$(( (incr >> 8) & 0xFF )) # Incrémenter le second octet local byte3=$(( incr & 0xFF )) # Incrémenter le troisième octet printf "%s:%02X:%02X:%02X\n" "$base_mac" "$byte1" "$byte2" "$byte3" } function generate_dhcp_file { # CIDR de départ (ex: "10.10.10.0/24") cidr="${1}" gateway_cidr=${3} gateway="$(echo "${gateway_cidr}" | cut -d\/ -f1)" subnet="$(echo "${cidr}" | cut -d\/ -f1)" output_file="/etc/dnsmasq.d/${2}.conf" # Extraire l'adresse de réseau et le masque IFS='/' read -r network mask <<< "$cidr" network_int=$(ip_to_int "$network") # Calcul du masque netmask=$(( 0xFFFFFFFF ^ ((1 << (32 - mask)) - 1) )) # Calcul de l'adresse de fin end_ip=$((network_int + ( ( 0xFFFFFFFF ^ netmask )))) # Calcul du nombre d'IP dans la plage num_ips=$((end_ip - network_int + 1)) # Vérifier si le nombre d'adresses est correct if [ "$num_ips" -le 0 ]; then echo "Erreur dans le calcul de la plage IP. Le CIDR est probablement mal formé." exit 1 fi # Si trop d'adresses, éviter de les générer toutes à la fois if [ "$num_ips" -gt 1000000 ]; then echo "La plage d'adresses est trop grande pour être générée en une seule fois. Essayez avec un plus petit sous-réseau." exit 1 fi # Vider le fichier de sortie avant d'écrire > "$output_file" echo "no-resolv" >> "$output_file" echo "dhcp-range=${subnet},static,255.255.255.0,12h" >> "$output_file" echo "dhcp-option=3,${gateway}" >> "$output_file" echo "dhcp-option=6,1.1.1.1,8.8.8.8" >> "$output_file" # Variables pour l'incrémentation des MAC et IP mac_incr=0 ip_incr=$network_int # Générer les réservations for i in $(seq 0 $((num_ips - 1))) do # Calculer l'adresse IP ip=$(int_to_ip "$ip_incr") # Calculer l'adresse MAC valide (incrémenter tous les octets) mac=$(int_to_mac $mac_incr) # Ajouter la ligne dans le fichier de configuration echo "dhcp-host=$mac,$ip" >> "$output_file" # Incrémenter les variables mac_incr=$((mac_incr + 1)) # Incrémenter l'adresse MAC ip_incr=$((ip_incr + 1)) # Incrémenter l'adresse IP done }