75 lines
2.8 KiB
Bash
Executable File
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"
|