197 lines
4.7 KiB
Bash
Executable File
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
|