adsb-1090/scripts/gen_env.sh

75 lines
2.8 KiB
Bash
Executable File

#!/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<n>_SERIAL numéro de série affecté au slot n
# RX<n>_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"