feat(tooling): mdns-host-setup.sh — pin host avahi to the LAN NIC

Auto-detects the LAN interface from HOST_LAN_IP, sets allow-interfaces in
/etc/avahi/avahi-daemon.conf (idempotent, backs up), restarts avahi. Self-sudos.
Fixes the multi-bridge 'Local name collision' that blocks the mDNS path.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-24 14:11:41 +02:00
parent 3c2ce72c2a
commit d8aefe95c4

48
tooling/mdns-host-setup.sh Executable file
View File

@@ -0,0 +1,48 @@
#!/usr/bin/env bash
# mdns-host-setup.sh — pin the HOST avahi-daemon to the LAN interface so it
# stops self-colliding across docker bridges ("Local name collision"), which
# is what blocks the mDNS (.local) path on a host with many interfaces.
#
# Detects the LAN NIC from HOST_LAN_IP (.env), sets allow-interfaces=<nic> in
# /etc/avahi/avahi-daemon.conf (idempotent, backs up first), restarts avahi.
# Re-execs itself with sudo if not root. Run: tooling/mdns-host-setup.sh
set -euo pipefail
cd "$(dirname "$0")/.."
[ -f .env ] && { set -a; . ./.env; set +a; }
: "${HOST_LAN_IP:?HOST_LAN_IP unset (set in .env)}"
nic="$(ip -o -4 addr show | awk -v ip="$HOST_LAN_IP" 'index($0, " "ip"/"){print $2; exit}')"
[ -n "$nic" ] || { echo "ERROR: no interface found with IP $HOST_LAN_IP" >&2; exit 1; }
echo "LAN interface for ${HOST_LAN_IP}: ${nic}"
conf=/etc/avahi/avahi-daemon.conf
[ -f "$conf" ] || { echo "ERROR: $conf not found — is avahi-daemon installed?" >&2; exit 1; }
# Need root to edit the conf + restart the service.
if [ "$(id -u)" -ne 0 ]; then
echo "escalating with sudo…"
exec sudo "$0" "$@"
fi
# Already pinned to this NIC? nothing to do.
if grep -qE "^allow-interfaces=${nic}([,[:space:]]|$)" "$conf"; then
echo "already set: allow-interfaces=${nic}"
else
cp -a "$conf" "${conf}.bak.$(date +%s)"
if grep -qE '^allow-interfaces=' "$conf"; then
sed -i -E "s/^allow-interfaces=.*/allow-interfaces=${nic}/" "$conf"
elif grep -qE '^#\s*allow-interfaces=' "$conf"; then
sed -i -E "s/^#\s*allow-interfaces=.*/allow-interfaces=${nic}/" "$conf"
else
# insert right after the [server] section header
sed -i -E "/^\[server\]/a allow-interfaces=${nic}" "$conf"
fi
echo "set allow-interfaces=${nic} (backup: ${conf}.bak.*)"
fi
echo "restarting avahi-daemon…"
systemctl restart avahi-daemon
sleep 1
systemctl is-active --quiet avahi-daemon && echo "avahi-daemon active" || { echo "ERROR: avahi-daemon not active" >&2; exit 1; }
grep -E '^allow-interfaces=' "$conf"