#!/usr/bin/env bash
set -euo pipefail
PORT=6053
NAME="%h"
SERVICE=/etc/avahi/services/esphome-lva.service
# Wait up to ~40s for any global IPv4 (cosmetic: to include ipv4_* TXT)
deadline=$((SECONDS+40))
while [ $SECONDS -lt $deadline ]; do
ip -o -4 addr show up scope global | grep -q . && break || true
sleep 1
done
# Collect all UP, non-loopback ifaces
mapfile -t IFACES < <(ip -o link show up | awk -F': ' '{print $2}' | grep -v '^lo$' | sort -u)
# Detect platform/board from the running system
PLATFORM="LINUX"
ARCH_RAW="$(uname -m)"
case "$ARCH_RAW" in
aarch64|arm64) BOARD="aarch64" ;;
x86_64|amd64) BOARD="x86_64" ;;
*) BOARD="$ARCH_RAW" ;;
esac
TXT=" platform=${PLATFORM}
"
TXT+=" board=${BOARD}
"
LIST=""
for i in "${IFACES[@]}"; do
[ -e "/sys/class/net/$i/address" ] || continue
mac=$(cat "/sys/class/net/$i/address")
mac_nc=${mac//:/} # no colons (ESPHome style)
if [ -d "/sys/class/net/$i/wireless" ] || [[ "$i" == wl* ]]; then net=wifi; else net=ethernet; fi
TXT+=" network=${net}
"
TXT+=" mac=${mac_nc}
"
LIST+="${i},"
done
LIST=${LIST%,}
cat >"$SERVICE" <
${NAME}
_esphomelib._tcp
${PORT}
version=2025.9.0
${TXT}
XML
# Avahi will (re)publish on all active ifaces automatically
systemctl restart avahi-daemon || true