#!/usr/bin/env bash # ═══════════════════════════════════════════════════════════════════════════════ # detect_dongles.sh v1.1 — source de vérité unique sur les récepteurs ADS-B # Emplacement : /data/adsb/scripts/detect_dongles.sh # # Se source (ne s'exécute pas). Fournit : # SLOTS[] catalogue statique des slots (ports, conteneurs, profile) # MAX_RECEIVERS nombre de slots disponibles # detect_serials() un numéro de série par ligne, ordre d'énumération USB # detect_count() nombre de dongles présents # slot_ports() calcule beast/raw/sbs pour un numéro de slot # # v1.1 (31/07/2026) : SLOTS remonté ici pour être partagé par check_adsb.sh et # watchdog_readsb.sh — la duplication du catalogue entre les deux scripts était # une source de désynchronisation. # # detect_serials fonctionne même si un dongle est déjà « claim » par un # conteneur : rtl_test énumère AVANT de tenter l'ouverture, et l'erreur # usb_claim_interface -6 qui suit n'affecte pas la liste produite. # ═══════════════════════════════════════════════════════════════════════════════ # slot:port_tar1090:ctn_readsb:ctn_tar1090:ctn_adsb2pg:profile SLOTS=( "1:8090:adsb-readsb:adsb-tar1090:adsb-adsb2pg:rx1" "2:8091:adsb-readsb2:adsb-tar10902:adsb-adsb2pg2:rx2" "3:8092:adsb-readsb3:adsb-tar10903:adsb-adsb2pg3:rx3" ) MAX_RECEIVERS=${#SLOTS[@]} detect_serials() { if command -v rtl_test >/dev/null 2>&1; then rtl_test -t 2>&1 \ | sed -n 's/^[[:space:]]*[0-9]\+:.*SN:[[:space:]]*\([0-9A-Za-z]\+\).*/\1/p' else local n i n=$(lsusb 2>/dev/null | grep -ci 'RTL2838\|RTL2832') for ((i = 1; i <= n; i++)); do echo "unknown${i}"; done fi } detect_count() { detect_serials | grep -c . ; } # slot_ports → écrit "beast raw sbs" slot_ports() { local n=$1 echo "$((30005 + (n - 1) * 10)) $((30002 + (n - 1) * 10)) $((30003 + (n - 1) * 10))" } if [ "${BASH_SOURCE[0]}" = "$0" ]; then mapfile -t _s < <(detect_serials) echo "${#_s[@]} dongle(s) RTL-SDR détecté(s)" for i in "${!_s[@]}"; do echo " slot rx$((i + 1)) → SN ${_s[$i]}"; done fi