Files
2026-08-27 11:12:22 +02:00

197 lines
4.7 KiB
Bash
Executable File

#!/usr/bin/env bash
set -u
if [ "$#" -ne 4 ]; then
printf "Uso: %s <scenario-id> <configurazione> <stato> <durata-secondi>\n" \
"$0" >&2
exit 2
fi
SCENARIO_ID="$1"
CONFIG_FILE="$2"
REQUESTED_STATE="$3"
DURATION_SECONDS="$4"
COMMON_DIR="$(
cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 &&
pwd
)"
ENV_FILE="$COMMON_DIR/environment.sh"
PATHS_FILE="$COMMON_DIR/paths.sh"
if [ ! -f "$ENV_FILE" ]; then
printf "FILE AMBIENTE ASSENTE: %s\n" "$ENV_FILE" >&2
exit 3
fi
source "$ENV_FILE"
if [ ! -x "$MARTE_APP" ]; then
printf "MARTeApp ASSENTE O NON ESEGUIBILE: %s\n" "$MARTE_APP" >&2
exit 4
fi
if [ ! -f "$CONFIG_FILE" ]; then
printf "CONFIGURAZIONE ASSENTE: %s\n" "$CONFIG_FILE" >&2
exit 5
fi
case "$SCENARIO_ID" in
*[!A-Za-z0-9_-]*|"")
printf "IDENTIFICATORE SCENARIO NON VALIDO: %s\n" "$SCENARIO_ID" >&2
exit 6
;;
esac
case "$REQUESTED_STATE" in
*[!A-Za-z0-9_-]*|"")
printf "NOME STATO NON VALIDO: %s\n" "$REQUESTED_STATE" >&2
exit 7
;;
esac
case "$DURATION_SECONDS" in
*[!0-9]*|"")
printf "DURATA NON VALIDA: %s\n" "$DURATION_SECONDS" >&2
exit 8
;;
esac
if [ "$DURATION_SECONDS" -le 0 ]; then
printf "LA DURATA DEVE ESSERE MAGGIORE DI ZERO.\n" >&2
exit 8
fi
STAMP="$(date +%Y%m%d_%H%M%S)"
RUN_DIR="$RUNS_ROOT/${STAMP}_${SCENARIO_ID}"
RUN_CONFIG="$RUN_DIR/configuration.marte"
RUN_LOG="$RUN_DIR/run.log"
RUN_SUMMARY="$RUN_DIR/runner_summary.txt"
RUN_HASHES="$RUN_DIR/hashes.sha256"
RUN_COMMAND="$RUN_DIR/command.txt"
mkdir -p -- "$RUN_DIR"
cp --preserve=mode,timestamps -- "$CONFIG_FILE" "$RUN_CONFIG"
RUN_DIR_PLACEHOLDER="__MARTE_RUN_DIR__"
PLACEHOLDER_COUNT="$(
python3 - "$RUN_CONFIG" "$RUN_DIR_PLACEHOLDER" "$RUN_DIR" <<'PYRUNNER'
import sys
from pathlib import Path
config_path = Path(sys.argv[1])
placeholder = sys.argv[2]
run_dir = sys.argv[3]
text = config_path.read_text(encoding="utf-8")
count = text.count(placeholder)
if count > 0:
config_path.write_text(
text.replace(placeholder, run_dir),
encoding="utf-8"
)
remaining = config_path.read_text(
encoding="utf-8"
).count(placeholder)
if remaining != 0:
print(
f"PLACEHOLDER_RESIDUI={remaining}",
file=sys.stderr
)
sys.exit(1)
print(count)
PYRUNNER
)"
PLACEHOLDER_RC=$?
if [ "$PLACEHOLDER_RC" -ne 0 ]; then
printf "ERRORE DURANTE LA SOSTITUZIONE DEL PERCORSO RUN.\n" >&2
exit 9
fi
{
printf "%q " \
timeout \
--signal=INT \
--kill-after=2s \
"${DURATION_SECONDS}s" \
"$MARTE_APP" \
-l RealTimeLoader \
-f "$RUN_CONFIG" \
-s "$REQUESTED_STATE"
printf "\n"
} > "$RUN_COMMAND"
{
sha256sum -- "$CONFIG_FILE"
sha256sum -- "$RUN_CONFIG"
sha256sum -- "$PATHS_FILE"
sha256sum -- "$ENV_FILE"
sha256sum -- "${BASH_SOURCE[0]}"
} > "$RUN_HASHES"
printf "============================================================\n"
printf "MARTe2 COMMON RUNNER\n"
printf "============================================================\n"
printf "Scenario: %s\n" "$SCENARIO_ID"
printf "Configurazione: %s\n" "$RUN_CONFIG"
printf "Stato: %s\n" "$REQUESTED_STATE"
printf "Durata: %s secondi\n" "$DURATION_SECONDS"
printf "Run directory: %s\n" "$RUN_DIR"
printf "Placeholder: %s sostituzioni\n" "$PLACEHOLDER_COUNT"
printf "\n"
set +e
timeout \
--signal=INT \
--kill-after=2s \
"${DURATION_SECONDS}s" \
"$MARTE_APP" \
-l RealTimeLoader \
-f "$RUN_CONFIG" \
-s "$REQUESTED_STATE" \
2>&1 |
tee "$RUN_LOG"
PIPE_CODES=("${PIPESTATUS[@]}")
set -e
MARTE_EXIT_CODE="${PIPE_CODES[0]}"
TEE_EXIT_CODE="${PIPE_CODES[1]}"
{
printf "============================================================\n"
printf "RIEPILOGO COMMON RUNNER\n"
printf "============================================================\n"
printf "Data: %s\n" "$(date --iso-8601=seconds)"
printf "Scenario: %s\n" "$SCENARIO_ID"
printf "Configurazione fonte: %s\n" "$CONFIG_FILE"
printf "Configurazione usata: %s\n" "$RUN_CONFIG"
printf "Stato richiesto: %s\n" "$REQUESTED_STATE"
printf "Durata richiesta: %s secondi\n" "$DURATION_SECONDS"
printf "Placeholder sostituiti: %s\n" "$PLACEHOLDER_COUNT"
printf "Exit code MARTe: %s\n" "$MARTE_EXIT_CODE"
printf "Exit code tee: %s\n" "$TEE_EXIT_CODE"
printf "Run log: %s\n" "$RUN_LOG"
printf "Hash: %s\n" "$RUN_HASHES"
printf "Comando: %s\n" "$RUN_COMMAND"
} | tee "$RUN_SUMMARY"
printf "\nRUN_DIR=%s\n" "$RUN_DIR"
if [ "$TEE_EXIT_CODE" -ne 0 ]; then
printf "ERRORE DURANTE LA SCRITTURA DEL LOG.\n" >&2
exit 30
fi
exit 0