Files
notes-techniques/scripts/common/setup_mdns.sh
2025-03-23 17:27:49 +01:00

133 lines
4.0 KiB
Bash

#!/bin/bash
# Basé sur un travail de Cédric Abonnel / Cédrix sous licence CC BY-NC 4.0
# Importer les fonctions communes
source "$(dirname "$0")/../common/common_utils.sh"
# Vérifier si le script est exécuté en root
check_root
set -e
echo "=== Détection des interfaces réseau actives ==="
INTERFACES=$(ip -o link show | awk -F': ' '{print $2}' | grep -Ev 'lo|docker|veth|br|vmnet|virbr')
echo "Interfaces détectées : $INTERFACES"
ALLOWED_INTERFACES=$(echo "$INTERFACES" | paste -sd "," -)
echo "=== Installation d'Avahi (mDNS) et des dépendances ==="
apt update
apt install -y avahi-daemon avahi-utils libnss-mdns nscd systemd-resolved
echo "=== Vérification de la présence de libnss_mdns.so.2 ==="
if [[ ! -f /lib/x86_64-linux-gnu/libnss_mdns.so.2 ]]; then
echo "❌ libnss_mdns.so.2 manquante, tentative de réinstallation"
apt install --reinstall -y libnss-mdns
fi
echo "=== Configuration de /etc/nsswitch.conf ==="
if grep -q '^hosts:' /etc/nsswitch.conf; then
sed -i 's/^hosts:.*/hosts: files mdns4 dns/' /etc/nsswitch.conf
else
echo "hosts: files mdns4 dns" >> /etc/nsswitch.conf
fi
grep hosts /etc/nsswitch.conf
echo "=== Redémarrage des caches DNS si présents ==="
systemctl restart nscd || echo "nscd non utilisé"
systemctl restart systemd-resolved || echo "systemd-resolved non utilisé"
echo "=== Vérification d'un éventuel service sur le port 80 ==="
if ss -tuln | grep -q ':80 '; then
echo "❌ Un service écoute déjà sur le port 80. Abandon de la publication HTTP de test."
PUBLISH_HTTP=false
else
PUBLISH_HTTP=true
fi
echo "=== Sauvegarde de la conf avahi ==="
cp /etc/avahi/avahi-daemon.conf /etc/avahi/avahi-daemon.conf.bak.$(date +%F-%H%M)
echo "=== Génération de la configuration avahi-daemon.conf ==="
cat > /etc/avahi/avahi-daemon.conf <<EOF
[server]
host-name=$(hostname)
use-ipv4=yes
use-ipv6=no
allow-interfaces=$ALLOWED_INTERFACES
ratelimit-interval-usec=1000000
ratelimit-burst=10
[wide-area]
enable-wide-area=no
[publish]
publish-addresses=yes
publish-hinfo=yes
publish-workstation=yes
publish-domain=yes
[reflector]
enable-reflector=no
[rlimits]
rlimit-as=0
rlimit-core=0
rlimit-data=4194304
rlimit-fsize=0
rlimit-nofile=300
rlimit-stack=4194304
EOF
if $PUBLISH_HTTP; then
echo "=== Publication temporaire d'un service HTTP de test ==="
mkdir -p /etc/avahi/services
cat > /etc/avahi/services/test-http.service <<EOF
<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">Test HTTP on %h</name>
<service>
<type>_http._tcp</type>
<port>80</port>
</service>
</service-group>
EOF
fi
echo "=== Activation et redémarrage du service Avahi ==="
systemctl enable avahi-daemon
systemctl restart avahi-daemon
echo "=== Vérification du statut du service ==="
systemctl status avahi-daemon --no-pager || { echo "❌ Avahi ne fonctionne pas."; exit 1; }
echo "=== Vérification du multicast sur l'interface ==="
ip a | grep MULTICAST || echo "⚠️ Aucune interface multicast détectée"
echo "=== Vérification de l'écoute sur le port UDP 5353 ==="
ss -uln | grep 5353 || echo "⚠️ Aucun service écoutant sur UDP/5353"
echo "=== Test de la résolution mDNS avec getent (NSS) ==="
LOCAL_HOST="$(hostname).local"
if getent hosts "$LOCAL_HOST"; then
echo "✅ Résolution mDNS de $LOCAL_HOST réussie via getent"
else
echo "❌ La résolution mDNS de $LOCAL_HOST a échoué via getent"
exit 1
fi
echo "=== Scan des services mDNS disponibles ==="
avahi-browse -a -t || echo "⚠️ Aucun service mDNS visible (normal si peu de services publiés)"
echo "✅ mDNS opérationnel sur : $ALLOWED_INTERFACES"
echo "$INTERFACES" > /var/log/mdns_interfaces.log
echo "Interfaces enregistrées dans /var/log/mdns_interfaces.log"
if $PUBLISH_HTTP; then
echo "=== Suppression du service HTTP de test ==="
rm -f /etc/avahi/services/test-http.service
systemctl restart avahi-daemon
echo "✅ Service HTTP de test retiré proprement"
fi
echo "✅ Script terminé avec succès"