#!/usr/bin/env bash # ═══════════════════════════════════════════════════════════════════════════════ # gen_env.sh — génère /data/adsb/.env.receivers à partir des dongles présents # Emplacement : /data/adsb/scripts/gen_env.sh # # Produit : # RX_SERIAL numéro de série affecté au slot n # RX_GAIN gain du slot n (repris de .env.gains si présent, sinon autogain) # COMPOSE_PROFILES liste des profiles à activer (rx1[,rx2[,rx3]]) # # Usage : # /data/adsb/scripts/gen_env.sh # docker compose --env-file .env.receivers up -d --remove-orphans # # Le --remove-orphans est OBLIGATOIRE : Compose ne supprime pas de lui-même les # conteneurs d'un profile devenu inactif. Sans lui, un readsb dont le dongle a # été débranché continue de tourner à vide et de disputer le bus USB. # ═══════════════════════════════════════════════════════════════════════════════ set -euo pipefail BASE_DIR="/data/adsb" ENV_FILE="${BASE_DIR}/.env.receivers" GAINS_FILE="${BASE_DIR}/.env.gains" # optionnel : RX1_GAIN=49.6 etc. MAX_RECEIVERS=3 # shellcheck source=/dev/null source "${BASE_DIR}/scripts/detect_dongles.sh" mapfile -t SERIALS < <(detect_serials) # Gains persistants par slot (facultatif) declare -A GAINS=() if [ -r "$GAINS_FILE" ]; then while IFS='=' read -r k v; do [[ "$k" =~ ^RX[0-9]+_GAIN$ ]] && GAINS["$k"]="$v" done < "$GAINS_FILE" fi TMP=$(mktemp) trap 'rm -f "$TMP"' EXIT { echo "# Généré par gen_env.sh le $(date '+%Y-%m-%d %H:%M:%S') — NE PAS ÉDITER" echo "# Dongles détectés : ${#SERIALS[@]}" } > "$TMP" PROFILES=() for i in "${!SERIALS[@]}"; do n=$((i + 1)) if [ "$n" -gt "$MAX_RECEIVERS" ]; then echo "AVERTISSEMENT : ${#SERIALS[@]} dongles détectés, seuls $MAX_RECEIVERS slots existent — ${SERIALS[$i]} ignoré" >&2 break fi echo "RX${n}_SERIAL=${SERIALS[$i]}" >> "$TMP" echo "RX${n}_GAIN=${GAINS[RX${n}_GAIN]:-autogain}" >> "$TMP" PROFILES+=("rx${n}") done # Les slots non pourvus doivent quand même exister comme variables, sinon # Compose émet un warning à l'interpolation même pour un service désactivé. for ((n = ${#PROFILES[@]} + 1; n <= MAX_RECEIVERS; n++)); do echo "RX${n}_SERIAL=" >> "$TMP" echo "RX${n}_GAIN=autogain" >> "$TMP" done if [ ${#PROFILES[@]} -eq 0 ]; then echo "COMPOSE_PROFILES=" >> "$TMP" echo "ERREUR : aucun dongle RTL-SDR détecté — aucun récepteur ne sera démarré" >&2 else printf 'COMPOSE_PROFILES=%s\n' "$(IFS=,; echo "${PROFILES[*]}")" >> "$TMP" fi install -m 0640 "$TMP" "$ENV_FILE" cat "$ENV_FILE"