#!/usr/bin/env bash set -u if [ "$#" -ne 4 ]; then printf "Uso: %s \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