Compare commits

...

4 Commits

4 changed files with 143 additions and 29 deletions

View File

@ -122,7 +122,6 @@ for TARGET_DIR in "${SELECTED_DIRS_ARRAY[@]}"; do
else
echo " ↳ Téléchargement de $FILE_NAME..."
fi
echo "$file"
wget -q -O "$FILE_PATH" "$REPO_URL/$TARGET_DIR/$file"
done < "$LIST_PATH"

View File

@ -25,11 +25,36 @@ IP="$1"
shift # Supprime le premier argument pour ne garder que les hostnames
HOSTNAMES=("$@")
# Fonction pour obtenir le nom de domaine de la machine
get_domain_name() {
local domain=$(dnsdomainname)
echo "$domain"
}
# Fonction pour obtenir le FQDN d'un hostname
get_fqdn() {
local hostname="$1"
local domain_name=$(get_domain_name)
if [[ -n "$domain_name" ]]; then
echo "$hostname.$domain_name"
else
echo "$hostname"
fi
}
# Fonction pour vérifier si un hostname est déjà enregistré
is_hostname_registered() {
local hostname="$1"
grep -q "address=/$hostname/$IP" "$DNSMASQ_CONF"
return $?
}
# Variable pour suivre si un changement a été fait
MODIFIED=0
# Vérifier si l'IP existe déjà dans le fichier
EXISTING_HOSTNAMES=($(grep "address=.*/$IP" "$DNSMASQ_CONF" | sed -E "s/address=\/(.*)\/$IP/\1/"))
EXISTING_HOSTNAMES=($(grep -E "address=/[^ ]+/$IP$" "$DNSMASQ_CONF" | sed -E "s/address=\/([^\/]+)\/$IP/\1/"))
if [[ ${#EXISTING_HOSTNAMES[@]} -gt 0 ]]; then
echo "L'adresse IP $IP existe déjà avec les noms suivants : ${EXISTING_HOSTNAMES[*]}"
@ -39,12 +64,18 @@ fi
# Vérifier et ajouter chaque hostname
for HOSTNAME in "${HOSTNAMES[@]}"; do
if [[ ! " ${EXISTING_HOSTNAMES[*]} " =~ " ${HOSTNAME} " ]]; then
echo "address=/$HOSTNAME/$IP" >> "$DNSMASQ_CONF"
echo "Ajout de : $HOSTNAME -> $IP"
MODIFIED=1
FQDN=$(get_fqdn "$HOSTNAME")
echo "Le FQDN détecté pour $HOSTNAME est : $FQDN"
if is_hostname_registered "$FQDN"; then
echo "L'association $FQDN -> $IP existe déjà."
else
echo "L'association $HOSTNAME -> $IP existe déjà."
read -p "Le FQDN $FQDN n'est pas dans la liste. Voulez-vous l'ajouter ? (o/n) " REPLY
if [[ "$REPLY" =~ ^[Oo]$ ]]; then
echo "address=/$FQDN/$IP" >> "$DNSMASQ_CONF"
echo "Ajout de : $FQDN -> $IP"
MODIFIED=1
fi
fi
done

View File

@ -1,13 +1,32 @@
#!/bin/bash
# Fichier contenant les réservations DHCP (modifier si nécessaire)
# Déterminer l'interface réseau active (exclure loopback)
INTERFACE=$(ip route | awk '/default/ {print $5; exit}')
# Vérifier si une interface est détectée
if [[ -z "$INTERFACE" ]]; then
echo "❌ Aucune interface réseau active détectée."
exit 1
fi
# Déterminer l'adresse IP et le masque réseau de l'interface active
IP_INFO=$(ip -4 addr show "$INTERFACE" | awk '/inet / {print $2}')
NETWORK_IP=$(echo "$IP_INFO" | cut -d'/' -f1)
NETMASK_CIDR=$(echo "$IP_INFO" | cut -d'/' -f2)
# Extraire le préfixe réseau (ex: "192.168.100")
PREFIX=$(echo "$NETWORK_IP" | awk -F. '{print $1"."$2"."$3}')
# Calculer les bornes de la plage d'adresses IP en fonction du masque
NETMASK=$(( 32 - NETMASK_CIDR ))
TOTAL_HOSTS=$(( 2 ** NETMASK ))
IP_RANGE_START="$PREFIX.1"
IP_RANGE_END="$PREFIX.$(( TOTAL_HOSTS - 2 ))" # -2 pour exclure le broadcast
# Fichier contenant les réservations DHCP
RESERVATION_FILE="/etc/dnsmasq.d/custom_hosts"
# Plage d'adresses IP à analyser (exemple : 192.168.1.100-192.168.1.200)
IP_RANGE_START="192.168.1.100"
IP_RANGE_END="192.168.1.200"
# Fonction pour convertir une IP en un entier pour la comparaison
# Fonction pour convertir une IP en un entier
ip_to_int() {
local IFS=.
local ip=($1)
@ -29,23 +48,33 @@ fi
# Lire toutes les IP utilisées dans le fichier de réservation
USED_IPS=($(grep -oE 'address=/[^/]+/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' "$RESERVATION_FILE" | awk -F'/' '{print $3}'))
# Convertir les IP utilisées en entiers pour faciliter la recherche
declare -A USED_IP_MAP
# Si aucune IP n'est réservée, retourner la première adresse disponible
if [[ ${#USED_IPS[@]} -eq 0 ]]; then
echo "✅ Première IP disponible : $IP_RANGE_START"
exit 0
fi
# Trouver la plus grande IP utilisée
MAX_IP_INT=0
for ip in "${USED_IPS[@]}"; do
USED_IP_MAP[$(ip_to_int "$ip")]=1
done
# Trouver la première IP disponible
START_INT=$(ip_to_int "$IP_RANGE_START")
END_INT=$(ip_to_int "$IP_RANGE_END")
for (( ip=START_INT; ip<=END_INT; ip++ )); do
if [[ -z "${USED_IP_MAP[$ip]}" ]]; then
FREE_IP=$(int_to_ip "$ip")
echo "✅ Première IP disponible : $FREE_IP"
exit 0
ip_int=$(ip_to_int "$ip")
if (( ip_int > MAX_IP_INT )); then
MAX_IP_INT=$ip_int
fi
done
echo "❌ Aucune IP libre trouvée dans la plage définie."
exit 1
# Calculer la prochaine IP disponible
NEXT_IP_INT=$((MAX_IP_INT + 1))
NEXT_IP=$(int_to_ip "$NEXT_IP_INT")
# Vérifier que cette IP est bien dans la plage autorisée
START_INT=$(ip_to_int "$IP_RANGE_START")
END_INT=$(ip_to_int "$IP_RANGE_END")
if (( NEXT_IP_INT > END_INT )); then
echo "❌ Plus aucune IP disponible dans la plage définie."
exit 1
fi
echo "✅ Première IP disponible : $NEXT_IP"
exit 0

View File

@ -0,0 +1,55 @@
#!/bin/bash
# Fichier contenant les enregistrements
FILE="/etc/dnsmasq.d/custom_hosts"
# Vérification de l'existence du fichier
if [[ ! -f "$FILE" ]]; then
echo "Erreur: Le fichier $FILE n'existe pas."
exit 1
fi
# Vérification des arguments
if [[ $# -ne 1 ]]; then
echo "Usage: $0 <nom_machine|FQDN|adresse_IP>"
exit 1
fi
SEARCH_TERM="$1"
# Détecter le nom de domaine depuis /etc/resolv.conf
DOMAIN=$(awk '/^search / {print $2; exit} /^domain / {print $2; exit}' /etc/resolv.conf)
# Vérifier qu'on a bien trouvé un domaine
if [[ -z "$DOMAIN" ]]; then
echo "Erreur: Impossible de détecter le nom de domaine depuis /etc/resolv.conf."
exit 1
fi
# Si l'entrée ne contient pas un point (ex: "www" au lieu de "www.domaine.local"), on ajoute le domaine détecté
if [[ ! "$SEARCH_TERM" =~ \. ]]; then
SEARCH_TERM="$SEARCH_TERM.$DOMAIN"
fi
# Vérification si l'entrée est une adresse IP
if [[ "$SEARCH_TERM" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
# Recherche stricte de l'adresse IP en tenant compte du format 'address=/FQDN/IP'
RESULTS=$(grep -E "/$SEARCH_TERM\$" "$FILE")
else
# Vérification que le terme recherché est bien un FQDN valide
if [[ ! "$SEARCH_TERM" =~ ^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; then
echo "Erreur: '$SEARCH_TERM' ne semble pas être un FQDN valide."
exit 1
fi
# Recherche stricte du FQDN en tenant compte du format 'address=/FQDN/IP'
RESULTS=$(grep -E "^address=/$SEARCH_TERM/" "$FILE")
fi
# Vérification et affichage des résultats
if [[ -n "$RESULTS" ]]; then
echo "Résultats trouvés :"
echo "$RESULTS"
else
echo "Aucun résultat trouvé pour '$SEARCH_TERM'."
fi