S03-H3 CLOSED baseline
This commit is contained in:
Executable
+1246
File diff suppressed because it is too large
Load Diff
Executable
+572
@@ -0,0 +1,572 @@
|
||||
#!/usr/bin/env bash
|
||||
set -u
|
||||
|
||||
LAUNCHER_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
CANDIDATE_ROOT="$(cd "$LAUNCHER_DIR/.." && pwd)"
|
||||
|
||||
if [ -n "${MARTE_BENCHMARK_SUITE_ROOT:-}" ]; then
|
||||
SUITE="$(cd "$MARTE_BENCHMARK_SUITE_ROOT" && pwd)"
|
||||
else
|
||||
SUITE="/home/dariodf/Scrivania/MARTE/marte-benchmark-suite"
|
||||
fi
|
||||
|
||||
PATCHER="$CANDIDATE_ROOT/patchers/configuration/build_s03h1_from_s02.sh"
|
||||
VALIDATOR="$CANDIDATE_ROOT/scenarios/S03H1_execution_profiles/validate.sh"
|
||||
CONFIG_VERIFIER="$CANDIDATE_ROOT/scenarios/S03H1_execution_profiles/verify_s03h1_config.py"
|
||||
CSV_EXPORTER="$CANDIDATE_ROOT/scenarios/S03H1_execution_profiles/export_s03_csv.py"
|
||||
TEST_CONFIG="$CANDIDATE_ROOT/configurations/generated/S03H1/from_patcher/smoke_s03h1_execution_profiles_test_from_s02.marte"
|
||||
DIAGNOSTIC_CONFIG="$CANDIDATE_ROOT/configurations/generated/S03H1/from_patcher/smoke_s03h1_execution_profiles_diagnostic_from_s02.marte"
|
||||
|
||||
RUNNER="$SUITE/common/marte_runner.sh"
|
||||
LIVE_PATHS="$SUITE/common/paths.sh"
|
||||
LIVE_ENVIRONMENT="$SUITE/common/environment.sh"
|
||||
LIVE_OPERATIONAL_LAUNCHER="$SUITE/launcher/marte_benchmark_launcher.sh"
|
||||
LIVE_PATCHER_S01="$SUITE/patchers/configuration/build_s01_from_s00.sh"
|
||||
LIVE_PATCHER_S02="$SUITE/patchers/configuration/build_s02_from_s01.sh"
|
||||
LIVE_PATCHER_S03="$SUITE/patchers/configuration/build_s03_from_s02.sh"
|
||||
LIVE_VALIDATOR_S02="$SUITE/scenarios/S02_binary_recording/validate.sh"
|
||||
LIVE_VALIDATOR_S03="$SUITE/scenarios/S03_semantic_sentinels/validate.sh"
|
||||
LIVE_PARSER_S03="$SUITE/scenarios/S03_semantic_sentinels/parse_s03_binary.py"
|
||||
LIVE_S00_CONFIG="$SUITE/configurations/generated/S00/smoke_s0_core.marte"
|
||||
LIVE_S01_CONFIG="$SUITE/configurations/generated/S01/from_patcher/smoke_s1_timing_from_s00.marte"
|
||||
LIVE_S02_CONFIG="$SUITE/configurations/generated/S02/from_patcher/smoke_s2_binary_recording_from_s01.marte"
|
||||
LIVE_S03_CONFIG="$SUITE/configurations/generated/S03/from_patcher/smoke_s3_semantic_sentinels_from_s02.marte"
|
||||
|
||||
EXPECTED_TEST_CONFIG_SHA256="d037561b32760fbd0e2aec9f1eefc5efda27b1918eca4742c89092a8a2f7e92e"
|
||||
EXPECTED_DIAGNOSTIC_CONFIG_SHA256="cd999ff249452298d650a22c8fe5b0b03bf48c0735f4630befdec8209cbb13a3"
|
||||
EXPECTED_PATCHER_SHA256="5db5f71db4ab8f007b2e78230c2506bed4c62a8e502fb1c08ca04eb14b645b82"
|
||||
EXPECTED_VALIDATOR_SHA256="748f403a045f9dbed64910de67e75ba5529c02ab5894417a866225518c10b5e5"
|
||||
EXPECTED_CONFIG_VERIFIER_SHA256="2f1c41b186bd2e79a9fb51fab0461a7a0dce104bf0852c0ec1ade2c55a017443"
|
||||
EXPECTED_CSV_EXPORTER_SHA256="b413ad113e188141891b61b930a607890b8468051e8a61cb0f0454c519a51fb7"
|
||||
|
||||
print_usage() {
|
||||
printf "Uso:\n"
|
||||
printf " %s S03H1 <durata-secondi> TEST\n" "$0"
|
||||
printf " %s S03H1 <durata-secondi> DIAGNOSTIC\n" "$0"
|
||||
printf "\n"
|
||||
printf "La candidata non installa e non modifica la baseline S03 R3.\n"
|
||||
}
|
||||
|
||||
fail() {
|
||||
code="$1"
|
||||
shift
|
||||
printf "S03_H1_LAUNCHER_STATUS=FAIL\n" >&2
|
||||
printf "S03_H1_LAUNCHER_ERROR=%s\n" "$*" >&2
|
||||
exit "$code"
|
||||
}
|
||||
|
||||
validate_duration() {
|
||||
candidate_duration="$1"
|
||||
case "$candidate_duration" in
|
||||
*[!0-9]*|"")
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
[ "$candidate_duration" -gt 0 ]
|
||||
}
|
||||
|
||||
verify_hash() {
|
||||
candidate_file="$1"
|
||||
candidate_expected="$2"
|
||||
candidate_label="$3"
|
||||
if [ ! -f "$candidate_file" ]; then
|
||||
printf "HASH_CHECK=%s STATUS=MISSING FILE=%s\n" \
|
||||
"$candidate_label" "$candidate_file" >&2
|
||||
return 1
|
||||
fi
|
||||
candidate_actual="$(sha256sum -- "$candidate_file" | awk '{print $1}')"
|
||||
printf "HASH_CHECK=%s EXPECTED=%s ACTUAL=%s FILE=%s\n" \
|
||||
"$candidate_label" "$candidate_expected" "$candidate_actual" "$candidate_file"
|
||||
[ "$candidate_actual" = "$candidate_expected" ]
|
||||
}
|
||||
|
||||
verify_candidate_components() {
|
||||
verify_hash "$PATCHER" "$EXPECTED_PATCHER_SHA256" "S03H1_PATCHER" || return 1
|
||||
verify_hash "$VALIDATOR" "$EXPECTED_VALIDATOR_SHA256" "S03H1_VALIDATOR" || return 1
|
||||
verify_hash "$CONFIG_VERIFIER" "$EXPECTED_CONFIG_VERIFIER_SHA256" "S03H1_CONFIG_VERIFIER" || return 1
|
||||
verify_hash "$CSV_EXPORTER" "$EXPECTED_CSV_EXPORTER_SHA256" "S03H1_CSV_EXPORTER" || return 1
|
||||
verify_hash "$CANDIDATE_CONFIG" "$EXPECTED_CANDIDATE_CONFIG_SHA256" "S03H1_${MODE}_CONFIG" || return 1
|
||||
return 0
|
||||
}
|
||||
|
||||
PROTECTED_PATHS=(
|
||||
"$LIVE_OPERATIONAL_LAUNCHER"
|
||||
"$LIVE_S00_CONFIG"
|
||||
"$LIVE_S01_CONFIG"
|
||||
"$LIVE_S02_CONFIG"
|
||||
"$LIVE_S03_CONFIG"
|
||||
"$LIVE_PATCHER_S01"
|
||||
"$LIVE_PATCHER_S02"
|
||||
"$LIVE_PATCHER_S03"
|
||||
"$LIVE_VALIDATOR_S02"
|
||||
"$LIVE_VALIDATOR_S03"
|
||||
"$LIVE_PARSER_S03"
|
||||
"$RUNNER"
|
||||
"$LIVE_PATHS"
|
||||
"$LIVE_ENVIRONMENT"
|
||||
)
|
||||
PROTECTED_EXPECTED_HASHES=(
|
||||
"7ef0419826c85c0364aad2403db4b8340cd815e9d9ce17edfbe5da8e6fbf2683"
|
||||
"49a9b48595aab88cd8fd11d1e58ace4ab11d7d0a649e9b143bdc25c8866253d5"
|
||||
"1513e1ca72eba56d53079ac7328908f12ddc72772456e2d75bcbacb6465d2427"
|
||||
"8ecc8ba55e46e9f6fb8f304404d4070ff4c2ea5b9c783a69113bc08b457859d1"
|
||||
"0f8916735ff67a9be2b167b52f147687fe131a063f410a81bfbf3bf9ff65f1e4"
|
||||
"a8cced1ea1711806863606e27c3ba52a3e72794dbe8c36c253570709ce3f7ccb"
|
||||
"8ac51d09f6f7984af3522e373bab59e2553775c418f69a53ccb93d8d1b893391"
|
||||
"96c778ba6a15353fd969b19960706d7c0ca810c0c6fd61a14b5f88960e4e2b7a"
|
||||
"7cd29b216b5edc3c72750a3326aebe5a9fdfb3b7522f1d7a6e8b0a1a97b3d60a"
|
||||
"95caf207c4d29037c4973d756ff5a7004a3360aad9656d068948e222a4ba0c98"
|
||||
"91c4d66770197e1986ed91eb6a4870e7da7df5a522ffdf4329b6d9250f238307"
|
||||
"9e4f1a6b0dabc244fd0726fd18bf07e86b29a9fc6a76d54fcaf61c79f13c9633"
|
||||
"468d92c3eb048b7137ea52a768f459d2d1f26f83f5a5c174d3333d032c9583c6"
|
||||
"b1faa567e480c326c72107b886f387f108907900804621337524f1f856f056ac"
|
||||
)
|
||||
|
||||
verify_protected_baseline() {
|
||||
candidate_index=0
|
||||
while [ "$candidate_index" -lt "${#PROTECTED_PATHS[@]}" ]; do
|
||||
verify_hash \
|
||||
"${PROTECTED_PATHS[$candidate_index]}" \
|
||||
"${PROTECTED_EXPECTED_HASHES[$candidate_index]}" \
|
||||
"PROTECTED_${candidate_index}" || return 1
|
||||
candidate_index=$((candidate_index + 1))
|
||||
done
|
||||
return 0
|
||||
}
|
||||
|
||||
write_protected_hashes() {
|
||||
candidate_destination="$1"
|
||||
sha256sum -- "${PROTECTED_PATHS[@]}" >"$candidate_destination"
|
||||
}
|
||||
|
||||
parse_contract_field() {
|
||||
candidate_field="$1"
|
||||
candidate_file="$2"
|
||||
PARSED_FIELD_VALUE=""
|
||||
PARSED_FIELD_ERROR=""
|
||||
if [ ! -f "$candidate_file" ]; then
|
||||
PARSED_FIELD_ERROR="NO_FILE"
|
||||
return 1
|
||||
fi
|
||||
candidate_count="$(grep -Ec "^${candidate_field}=[A-Z][A-Z0-9_]*$" "$candidate_file" || true)"
|
||||
candidate_any_count="$(grep -Ec "^${candidate_field}=" "$candidate_file" || true)"
|
||||
if [ "$candidate_any_count" -eq 0 ]; then
|
||||
PARSED_FIELD_ERROR="MISSING"
|
||||
return 1
|
||||
fi
|
||||
if [ "$candidate_any_count" -ne 1 ]; then
|
||||
PARSED_FIELD_ERROR="DUPLICATED"
|
||||
return 1
|
||||
fi
|
||||
if [ "$candidate_count" -ne 1 ]; then
|
||||
PARSED_FIELD_ERROR="MALFORMED"
|
||||
return 1
|
||||
fi
|
||||
PARSED_FIELD_VALUE="$(sed -n "s/^${candidate_field}=//p" "$candidate_file")"
|
||||
return 0
|
||||
}
|
||||
|
||||
classify_s03h1_run() {
|
||||
classify_validator_rc="$1"
|
||||
classify_tee_rc="$2"
|
||||
classify_validation_file="$3"
|
||||
classify_csv_rc="$4"
|
||||
classify_invariance_status="$5"
|
||||
|
||||
FINAL_RC=20
|
||||
FINAL_RESULT="INCONCLUSIVE"
|
||||
BLOCK_REASON="NONE"
|
||||
PARSED_MODE_STATUS="NOT_EVALUATED"
|
||||
PARSED_PROFILE_CONFIG_STATUS="NOT_EVALUATED"
|
||||
PARSED_OBSERVABILITY_STATUS="NOT_EVALUATED"
|
||||
PARSED_FUNCTIONAL_STATUS="NOT_EVALUATED"
|
||||
PARSED_SEMANTIC_STATUS="NOT_EVALUATED"
|
||||
PARSED_TIMING_STATUS="NOT_EVALUATED"
|
||||
PARSED_MEASUREMENT_ELIGIBILITY="NOT_EVALUATED"
|
||||
|
||||
if [ "$classify_tee_rc" -ne 0 ]; then
|
||||
FINAL_RC=67
|
||||
FINAL_RESULT="FAIL_VALIDATION_LOG"
|
||||
BLOCK_REASON="VALIDATION_LOG_NOT_WRITTEN"
|
||||
return 0
|
||||
fi
|
||||
|
||||
CONTRACT_PARSE_ERROR="NONE"
|
||||
for candidate_field in \
|
||||
MODE_STATUS \
|
||||
PROFILE_CONFIG_STATUS \
|
||||
OBSERVABILITY_STATUS \
|
||||
FUNCTIONAL_STATUS \
|
||||
SEMANTIC_STATUS \
|
||||
TIMING_STATUS \
|
||||
MEASUREMENT_ELIGIBILITY
|
||||
do
|
||||
if parse_contract_field "$candidate_field" "$classify_validation_file"; then
|
||||
case "$candidate_field" in
|
||||
MODE_STATUS) PARSED_MODE_STATUS="$PARSED_FIELD_VALUE" ;;
|
||||
PROFILE_CONFIG_STATUS) PARSED_PROFILE_CONFIG_STATUS="$PARSED_FIELD_VALUE" ;;
|
||||
OBSERVABILITY_STATUS) PARSED_OBSERVABILITY_STATUS="$PARSED_FIELD_VALUE" ;;
|
||||
FUNCTIONAL_STATUS) PARSED_FUNCTIONAL_STATUS="$PARSED_FIELD_VALUE" ;;
|
||||
SEMANTIC_STATUS) PARSED_SEMANTIC_STATUS="$PARSED_FIELD_VALUE" ;;
|
||||
TIMING_STATUS) PARSED_TIMING_STATUS="$PARSED_FIELD_VALUE" ;;
|
||||
MEASUREMENT_ELIGIBILITY) PARSED_MEASUREMENT_ELIGIBILITY="$PARSED_FIELD_VALUE" ;;
|
||||
esac
|
||||
elif [ "$CONTRACT_PARSE_ERROR" = "NONE" ]; then
|
||||
CONTRACT_PARSE_ERROR="${candidate_field}_${PARSED_FIELD_ERROR}"
|
||||
fi
|
||||
done
|
||||
|
||||
if [ "$CONTRACT_PARSE_ERROR" != "NONE" ]; then
|
||||
FINAL_RC=22
|
||||
FINAL_RESULT="INCONCLUSIVE_S03H1_CONTRACT"
|
||||
BLOCK_REASON="$CONTRACT_PARSE_ERROR"
|
||||
return 0
|
||||
fi
|
||||
if [ "$PARSED_MEASUREMENT_ELIGIBILITY" != "NO" ]; then
|
||||
FINAL_RC=22
|
||||
FINAL_RESULT="INCONCLUSIVE_S03H1_CONTRACT"
|
||||
BLOCK_REASON="ELIGIBILITY_CONTRACT_VIOLATION_${PARSED_MEASUREMENT_ELIGIBILITY}"
|
||||
return 0
|
||||
fi
|
||||
if [ "$classify_invariance_status" != "PASS" ]; then
|
||||
FINAL_RC=71
|
||||
FINAL_RESULT="FAIL_PROTECTED_BASELINE_CHANGED"
|
||||
BLOCK_REASON="PROTECTED_BASELINE_INVARIANCE_${classify_invariance_status}"
|
||||
return 0
|
||||
fi
|
||||
if [ "$classify_csv_rc" -ne 0 ]; then
|
||||
FINAL_RC=70
|
||||
FINAL_RESULT="FAIL_DERIVED_CSV_EXPORT"
|
||||
BLOCK_REASON="CSV_EXPORT_RC_${classify_csv_rc}"
|
||||
return 0
|
||||
fi
|
||||
|
||||
case "$classify_validator_rc" in
|
||||
0|10|11)
|
||||
;;
|
||||
20|21)
|
||||
FINAL_RC=20
|
||||
FINAL_RESULT="S03H1_VALIDATION_INCONCLUSIVE"
|
||||
BLOCK_REASON="VALIDATOR_RC_${classify_validator_rc}"
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
FINAL_RC=68
|
||||
FINAL_RESULT="FAIL_VALIDATOR_EXIT"
|
||||
BLOCK_REASON="UNRECOGNISED_VALIDATOR_RC_${classify_validator_rc}"
|
||||
return 0
|
||||
;;
|
||||
esac
|
||||
|
||||
for candidate_status in \
|
||||
"$PARSED_MODE_STATUS" \
|
||||
"$PARSED_PROFILE_CONFIG_STATUS" \
|
||||
"$PARSED_OBSERVABILITY_STATUS" \
|
||||
"$PARSED_FUNCTIONAL_STATUS" \
|
||||
"$PARSED_SEMANTIC_STATUS"
|
||||
do
|
||||
if [ "$candidate_status" != "PASS" ]; then
|
||||
FINAL_RC=25
|
||||
FINAL_RESULT="S03H1_CONTRACT_STATUS_NOT_PASS"
|
||||
BLOCK_REASON="REQUIRED_STATUS_${candidate_status}"
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
|
||||
case "$PARSED_TIMING_STATUS" in
|
||||
NOT_VALID_*)
|
||||
FINAL_RC=14
|
||||
FINAL_RESULT="FUNCTIONAL_AND_SEMANTIC_PASS_TIMING_NOT_VALID"
|
||||
BLOCK_REASON="$PARSED_TIMING_STATUS"
|
||||
;;
|
||||
UNASSESSED_*)
|
||||
FINAL_RC=15
|
||||
FINAL_RESULT="FUNCTIONAL_AND_SEMANTIC_PASS_TIMING_UNASSESSED"
|
||||
BLOCK_REASON="$PARSED_TIMING_STATUS"
|
||||
;;
|
||||
*)
|
||||
FINAL_RC=22
|
||||
FINAL_RESULT="INCONCLUSIVE_TIMING_CONTRACT"
|
||||
BLOCK_REASON="TIMING_STATUS_${PARSED_TIMING_STATUS}"
|
||||
;;
|
||||
esac
|
||||
return 0
|
||||
}
|
||||
|
||||
run_s03h1() {
|
||||
duration="$1"
|
||||
MODE="$2"
|
||||
|
||||
case "$MODE" in
|
||||
TEST)
|
||||
CANDIDATE_CONFIG="$TEST_CONFIG"
|
||||
EXPECTED_CANDIDATE_CONFIG_SHA256="$EXPECTED_TEST_CONFIG_SHA256"
|
||||
;;
|
||||
DIAGNOSTIC)
|
||||
CANDIDATE_CONFIG="$DIAGNOSTIC_CONFIG"
|
||||
EXPECTED_CANDIDATE_CONFIG_SHA256="$EXPECTED_DIAGNOSTIC_CONFIG_SHA256"
|
||||
;;
|
||||
*)
|
||||
printf "ERRORE: MODE non riconosciuto: %s\n" "$MODE" >&2
|
||||
return 2
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ ! -d "$SUITE" ]; then
|
||||
printf "ERRORE: suite operativa assente: %s\n" "$SUITE" >&2
|
||||
return 50
|
||||
fi
|
||||
if ! verify_candidate_components; then
|
||||
printf "ERRORE: integrita' candidata non dimostrata.\n" >&2
|
||||
return 51
|
||||
fi
|
||||
if ! verify_protected_baseline; then
|
||||
printf "ERRORE: baseline protetta assente o con hash inatteso.\n" >&2
|
||||
return 52
|
||||
fi
|
||||
|
||||
WORK_ROOT="$(mktemp -d "${TMPDIR:-/tmp}/s03h1_launcher.XXXXXX")" || return 53
|
||||
trap 'rm -rf -- "$WORK_ROOT"' EXIT HUP INT TERM
|
||||
GENERATED_CONFIG="$WORK_ROOT/generated_${MODE}.marte"
|
||||
PATCHER_LOG="$WORK_ROOT/patcher.log"
|
||||
PROTECTED_BEFORE="$WORK_ROOT/protected_baseline_before.sha256"
|
||||
CAPTURE="$WORK_ROOT/runner_capture.log"
|
||||
|
||||
"$PATCHER" "$LIVE_S02_CONFIG" "$GENERATED_CONFIG" "$MODE" >"$PATCHER_LOG" 2>&1
|
||||
PATCHER_RC=$?
|
||||
if [ "$PATCHER_RC" -ne 0 ]; then
|
||||
printf "ERRORE: patcher candidato fallito rc=%s\n" "$PATCHER_RC" >&2
|
||||
cat -- "$PATCHER_LOG" >&2
|
||||
return 54
|
||||
fi
|
||||
if ! cmp -s -- "$GENERATED_CONFIG" "$CANDIDATE_CONFIG"; then
|
||||
printf "ERRORE: build candidato non coincide con config confezionata.\n" >&2
|
||||
return 55
|
||||
fi
|
||||
|
||||
write_protected_hashes "$PROTECTED_BEFORE" || return 56
|
||||
|
||||
if [ ! -f "$LIVE_PATHS" ]; then
|
||||
printf "ERRORE: paths.sh assente: %s\n" "$LIVE_PATHS" >&2
|
||||
return 57
|
||||
fi
|
||||
# shellcheck source=/dev/null
|
||||
source "$LIVE_PATHS"
|
||||
CONSTANT_GAM_LIB_DIR="$MARTE2_COMPONENTS_ROOT/Build/$MARTE_TARGET/Components/GAMs/ConstantGAM"
|
||||
CONSTANT_GAM_LIB="$CONSTANT_GAM_LIB_DIR/ConstantGAM.so"
|
||||
if [ ! -f "$CONSTANT_GAM_LIB" ]; then
|
||||
printf "ERRORE: ConstantGAM assente: %s\n" "$CONSTANT_GAM_LIB" >&2
|
||||
return 58
|
||||
fi
|
||||
case ":${LD_LIBRARY_PATH-}:" in
|
||||
*":${CONSTANT_GAM_LIB_DIR}:"*) ;;
|
||||
*)
|
||||
if [ -n "${LD_LIBRARY_PATH-}" ]; then
|
||||
LD_LIBRARY_PATH="${CONSTANT_GAM_LIB_DIR}:${LD_LIBRARY_PATH}"
|
||||
else
|
||||
LD_LIBRARY_PATH="$CONSTANT_GAM_LIB_DIR"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
export LD_LIBRARY_PATH
|
||||
|
||||
printf "============================================================\n"
|
||||
printf "S03-H1 EXECUTION PROFILES - RUN CANDIDATA\n"
|
||||
printf "============================================================\n"
|
||||
printf "MODE=%s\n" "$MODE"
|
||||
printf "DURATION=%s\n" "$duration"
|
||||
printf "CURRENT_OPERATIONAL_BASELINE=S03_R3_INSTALLED\n"
|
||||
printf "S03_H1_INSTALLATION_AUTHORIZED=NO\n"
|
||||
|
||||
"$RUNNER" \
|
||||
"S03H1_${MODE}_launcher" \
|
||||
"$CANDIDATE_CONFIG" \
|
||||
"State1" \
|
||||
"$duration" \
|
||||
2>&1 | tee "$CAPTURE"
|
||||
RUNNER_CODES=("${PIPESTATUS[@]}")
|
||||
RUNNER_RC="${RUNNER_CODES[0]}"
|
||||
CAPTURE_TEE_RC="${RUNNER_CODES[1]}"
|
||||
if [ "$RUNNER_RC" -ne 0 ]; then
|
||||
printf "ERRORE: common runner fallito rc=%s\n" "$RUNNER_RC" >&2
|
||||
return 60
|
||||
fi
|
||||
if [ "$CAPTURE_TEE_RC" -ne 0 ]; then
|
||||
printf "ERRORE: capture common runner fallita.\n" >&2
|
||||
return 61
|
||||
fi
|
||||
|
||||
RUN_DIR="$(sed -n 's/^RUN_DIR=//p' "$CAPTURE" | tail -n 1)"
|
||||
if [ -z "$RUN_DIR" ] || [ ! -d "$RUN_DIR" ]; then
|
||||
printf "ERRORE: RUN_DIR non individuata o assente: %s\n" "$RUN_DIR" >&2
|
||||
return 62
|
||||
fi
|
||||
|
||||
RUN_LOG="$RUN_DIR/run.log"
|
||||
RUNNER_SUMMARY="$RUN_DIR/runner_summary.txt"
|
||||
RUN_HASHES="$RUN_DIR/hashes.sha256"
|
||||
OUTPUT_FILE="$RUN_DIR/s03_output.bin"
|
||||
CSV_FILE="$RUN_DIR/s03_output.csv"
|
||||
MODE_FILE="$RUN_DIR/s03h1_mode.txt"
|
||||
VALIDATION_LOG="$RUN_DIR/validation.txt"
|
||||
CSV_REPORT="$RUN_DIR/csv_export.txt"
|
||||
LAUNCHER_SUMMARY="$RUN_DIR/launcher_summary.txt"
|
||||
PROTECTED_BEFORE_RUN="$RUN_DIR/protected_baseline_before.sha256"
|
||||
PROTECTED_AFTER_RUN="$RUN_DIR/protected_baseline_after.sha256"
|
||||
INVARIANCE_REPORT="$RUN_DIR/protected_baseline_invariance.txt"
|
||||
|
||||
cp -- "$PROTECTED_BEFORE" "$PROTECTED_BEFORE_RUN"
|
||||
{
|
||||
printf "SCENARIO=S03H1\n"
|
||||
printf "MODE=%s\n" "$MODE"
|
||||
printf "CANDIDATE_CONFIG_SHA256=%s\n" "$EXPECTED_CANDIDATE_CONFIG_SHA256"
|
||||
printf "S03_H1_INSTALLATION_AUTHORIZED=NO\n"
|
||||
} >"$MODE_FILE"
|
||||
|
||||
sha256sum -- \
|
||||
"$MODE_FILE" \
|
||||
"${BASH_SOURCE[0]}" \
|
||||
"$PATCHER" \
|
||||
"$VALIDATOR" \
|
||||
"$CONFIG_VERIFIER" \
|
||||
"$CSV_EXPORTER" \
|
||||
"$LIVE_PARSER_S03" \
|
||||
"$RUN_LOG" \
|
||||
"$RUNNER_SUMMARY" \
|
||||
"$OUTPUT_FILE" \
|
||||
"$PROTECTED_BEFORE_RUN" \
|
||||
"${PROTECTED_PATHS[@]}" \
|
||||
>>"$RUN_HASHES"
|
||||
|
||||
S03_BASELINE_PARSER="$LIVE_PARSER_S03" \
|
||||
timeout 30s "$VALIDATOR" "$MODE" "$RUN_DIR" 2>&1 | tee "$VALIDATION_LOG"
|
||||
VALIDATION_CODES=("${PIPESTATUS[@]}")
|
||||
VALIDATOR_RC="${VALIDATION_CODES[0]}"
|
||||
VALIDATION_TEE_RC="${VALIDATION_CODES[1]}"
|
||||
|
||||
"$CSV_EXPORTER" "$OUTPUT_FILE" "$CSV_FILE" >"$CSV_REPORT" 2>&1
|
||||
CSV_RC=$?
|
||||
|
||||
write_protected_hashes "$PROTECTED_AFTER_RUN"
|
||||
if cmp -s -- "$PROTECTED_BEFORE_RUN" "$PROTECTED_AFTER_RUN"; then
|
||||
PROTECTED_BASELINE_INVARIANCE="PASS"
|
||||
else
|
||||
PROTECTED_BASELINE_INVARIANCE="FAIL"
|
||||
fi
|
||||
{
|
||||
printf "PROTECTED_BASELINE_INVARIANCE=%s\n" "$PROTECTED_BASELINE_INVARIANCE"
|
||||
printf "CURRENT_OPERATIONAL_BASELINE=S03_R3_INSTALLED\n"
|
||||
printf "S03_H1_INSTALLATION_AUTHORIZED=NO\n"
|
||||
} >"$INVARIANCE_REPORT"
|
||||
|
||||
for evidence_file in \
|
||||
"$VALIDATION_LOG" \
|
||||
"$CSV_REPORT" \
|
||||
"$PROTECTED_AFTER_RUN" \
|
||||
"$INVARIANCE_REPORT"
|
||||
do
|
||||
if [ -f "$evidence_file" ]; then
|
||||
sha256sum -- "$evidence_file" >>"$RUN_HASHES"
|
||||
fi
|
||||
done
|
||||
if [ -f "$CSV_FILE" ]; then
|
||||
sha256sum -- "$CSV_FILE" >>"$RUN_HASHES"
|
||||
fi
|
||||
|
||||
classify_s03h1_run \
|
||||
"$VALIDATOR_RC" \
|
||||
"$VALIDATION_TEE_RC" \
|
||||
"$VALIDATION_LOG" \
|
||||
"$CSV_RC" \
|
||||
"$PROTECTED_BASELINE_INVARIANCE"
|
||||
|
||||
{
|
||||
printf "============================================================\n"
|
||||
printf "RIEPILOGO LAUNCHER S03-H1 CANDIDATO\n"
|
||||
printf "============================================================\n"
|
||||
printf "SCENARIO=S03H1\n"
|
||||
printf "MODE=%s\n" "$MODE"
|
||||
printf "DURATION=%s\n" "$duration"
|
||||
printf "RUN_DIR=%s\n" "$RUN_DIR"
|
||||
printf "RUNNER_RC=%s\n" "$RUNNER_RC"
|
||||
printf "VALIDATOR_RC=%s\n" "$VALIDATOR_RC"
|
||||
printf "CSV_EXPORT_RC=%s\n" "$CSV_RC"
|
||||
printf "CSV_STATUS=%s\n" "$( [ "$CSV_RC" -eq 0 ] && printf PASS || printf FAIL )"
|
||||
printf "MODE_STATUS=%s\n" "$PARSED_MODE_STATUS"
|
||||
printf "PROFILE_CONFIG_STATUS=%s\n" "$PARSED_PROFILE_CONFIG_STATUS"
|
||||
printf "OBSERVABILITY_STATUS=%s\n" "$PARSED_OBSERVABILITY_STATUS"
|
||||
printf "FUNCTIONAL_STATUS=%s\n" "$PARSED_FUNCTIONAL_STATUS"
|
||||
printf "SEMANTIC_STATUS=%s\n" "$PARSED_SEMANTIC_STATUS"
|
||||
printf "TIMING_STATUS=%s\n" "$PARSED_TIMING_STATUS"
|
||||
printf "MEASUREMENT_ELIGIBILITY=NO\n"
|
||||
printf "PROTECTED_BASELINE_INVARIANCE=%s\n" "$PROTECTED_BASELINE_INVARIANCE"
|
||||
printf "BLOCK_REASON=%s\n" "$BLOCK_REASON"
|
||||
printf "FINAL_RESULT=%s\n" "$FINAL_RESULT"
|
||||
printf "FINAL_RC=%s\n" "$FINAL_RC"
|
||||
printf "S03_H1_INSTALLATION_AUTHORIZED=NO\n"
|
||||
printf "CURRENT_OPERATIONAL_BASELINE=S03_R3_INSTALLED\n"
|
||||
printf "PERFORMANCE_MEASUREMENT_AUTHORIZED=NO\n"
|
||||
printf "S04_AUTHORIZED=NO\n"
|
||||
printf "MD00_AUTHORIZED=NO\n"
|
||||
} | tee "$LAUNCHER_SUMMARY"
|
||||
SUMMARY_CODES=("${PIPESTATUS[@]}")
|
||||
if [ "${SUMMARY_CODES[1]}" -ne 0 ]; then
|
||||
FINAL_RC=69
|
||||
else
|
||||
sha256sum -- "$LAUNCHER_SUMMARY" >>"$RUN_HASHES"
|
||||
fi
|
||||
|
||||
printf "RUN_DIR=%s\n" "$RUN_DIR"
|
||||
printf "RISULTATO_FINALE=%s\n" "$FINAL_RESULT"
|
||||
printf "FINAL_RC=%s\n" "$FINAL_RC"
|
||||
|
||||
rm -rf -- "$WORK_ROOT"
|
||||
trap - EXIT HUP INT TERM
|
||||
return "$FINAL_RC"
|
||||
}
|
||||
|
||||
if [ "${S03H1_LAUNCHER_LIB_ONLY:-0}" = "1" ]; then
|
||||
if [ "${BASH_SOURCE[0]}" != "$0" ]; then
|
||||
return 0
|
||||
fi
|
||||
printf "ERRORE: S03H1_LAUNCHER_LIB_ONLY=1 e' ammesso solo con source.\n" >&2
|
||||
exit 3
|
||||
fi
|
||||
|
||||
case "$#" in
|
||||
1)
|
||||
case "$1" in
|
||||
-h|--help)
|
||||
print_usage
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
print_usage >&2
|
||||
exit 2
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
3)
|
||||
if [ "$1" != "S03H1" ] && [ "$1" != "s03h1" ]; then
|
||||
print_usage >&2
|
||||
exit 2
|
||||
fi
|
||||
if ! validate_duration "$2"; then
|
||||
printf "ERRORE: durata non valida: %s\n" "$2" >&2
|
||||
exit 2
|
||||
fi
|
||||
case "$3" in
|
||||
TEST|DIAGNOSTIC) ;;
|
||||
*)
|
||||
printf "ERRORE: MODE non riconosciuto: %s\n" "$3" >&2
|
||||
exit 2
|
||||
;;
|
||||
esac
|
||||
run_s03h1 "$2" "$3"
|
||||
exit $?
|
||||
;;
|
||||
*)
|
||||
print_usage >&2
|
||||
exit 2
|
||||
;;
|
||||
esac
|
||||
Executable
+669
@@ -0,0 +1,669 @@
|
||||
#!/usr/bin/env bash
|
||||
set -u
|
||||
set -o pipefail
|
||||
|
||||
LAUNCHER_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)"
|
||||
INSTALLED_SUITE="$(cd -- "$LAUNCHER_DIR/.." && pwd -P)"
|
||||
WORK_ROOT=""
|
||||
|
||||
print_usage() {
|
||||
printf 'Uso:\n'
|
||||
printf ' %s S03H3 <durata-secondi> MINIMAL\n' "$0"
|
||||
printf ' %s S03H3 <durata-secondi> TEST\n' "$0"
|
||||
printf ' %s S03H3 <durata-secondi> DIAGNOSTIC\n' "$0"
|
||||
}
|
||||
|
||||
fail() {
|
||||
local code="$1"
|
||||
local reason="$2"
|
||||
printf 'S03_H3_LAUNCHER_STATUS=FAIL\n' >&2
|
||||
printf 'BLOCK_REASON=%s\n' "$reason" >&2
|
||||
exit "$code"
|
||||
}
|
||||
|
||||
is_positive_decimal() {
|
||||
local value="$1"
|
||||
[[ "$value" =~ ^[0-9]+$ ]] && [[ "$value" =~ [1-9] ]]
|
||||
}
|
||||
|
||||
verify_hash() {
|
||||
local file="$1"
|
||||
local expected="$2"
|
||||
local label="$3"
|
||||
local actual
|
||||
if [ ! -f "$file" ]; then
|
||||
printf 'HASH_CHECK=%s STATUS=MISSING FILE=%s\n' "$label" "$file" >&2
|
||||
return 1
|
||||
fi
|
||||
actual="$(sha256sum -- "$file" | awk '{print $1}')" || return 1
|
||||
printf 'HASH_CHECK=%s EXPECTED=%s ACTUAL=%s FILE=%s\n' \
|
||||
"$label" "$expected" "$actual" "$file"
|
||||
[ "$actual" = "$expected" ]
|
||||
}
|
||||
|
||||
readonly -a HISTORICAL_RELATIVE_PATHS=(
|
||||
"launcher/marte_benchmark_launcher.sh"
|
||||
"configurations/generated/S00/smoke_s0_core.marte"
|
||||
"configurations/generated/S01/from_patcher/smoke_s1_timing_from_s00.marte"
|
||||
"configurations/generated/S02/from_patcher/smoke_s2_binary_recording_from_s01.marte"
|
||||
"configurations/generated/S03/from_patcher/smoke_s3_semantic_sentinels_from_s02.marte"
|
||||
"patchers/configuration/build_s01_from_s00.sh"
|
||||
"patchers/configuration/build_s02_from_s01.sh"
|
||||
"patchers/configuration/build_s03_from_s02.sh"
|
||||
"scenarios/S02_binary_recording/validate.sh"
|
||||
"scenarios/S03_semantic_sentinels/validate.sh"
|
||||
"scenarios/S03_semantic_sentinels/parse_s03_binary.py"
|
||||
"common/marte_runner.sh"
|
||||
"common/paths.sh"
|
||||
"common/environment.sh"
|
||||
"launcher/marte_benchmark_launcher_s03h1.sh"
|
||||
"patchers/configuration/build_s03h1_from_s02.sh"
|
||||
"scenarios/S03H1_execution_profiles/validate.sh"
|
||||
"scenarios/S03H1_execution_profiles/verify_s03h1_config.py"
|
||||
"scenarios/S03H1_execution_profiles/export_s03_csv.py"
|
||||
"configurations/generated/S03H1/from_patcher/smoke_s03h1_execution_profiles_test_from_s02.marte"
|
||||
"configurations/generated/S03H1/from_patcher/smoke_s03h1_execution_profiles_diagnostic_from_s02.marte"
|
||||
)
|
||||
|
||||
readonly -a HISTORICAL_EXPECTED_HASHES=(
|
||||
"7ef0419826c85c0364aad2403db4b8340cd815e9d9ce17edfbe5da8e6fbf2683"
|
||||
"49a9b48595aab88cd8fd11d1e58ace4ab11d7d0a649e9b143bdc25c8866253d5"
|
||||
"1513e1ca72eba56d53079ac7328908f12ddc72772456e2d75bcbacb6465d2427"
|
||||
"8ecc8ba55e46e9f6fb8f304404d4070ff4c2ea5b9c783a69113bc08b457859d1"
|
||||
"0f8916735ff67a9be2b167b52f147687fe131a063f410a81bfbf3bf9ff65f1e4"
|
||||
"a8cced1ea1711806863606e27c3ba52a3e72794dbe8c36c253570709ce3f7ccb"
|
||||
"8ac51d09f6f7984af3522e373bab59e2553775c418f69a53ccb93d8d1b893391"
|
||||
"96c778ba6a15353fd969b19960706d7c0ca810c0c6fd61a14b5f88960e4e2b7a"
|
||||
"7cd29b216b5edc3c72750a3326aebe5a9fdfb3b7522f1d7a6e8b0a1a97b3d60a"
|
||||
"95caf207c4d29037c4973d756ff5a7004a3360aad9656d068948e222a4ba0c98"
|
||||
"91c4d66770197e1986ed91eb6a4870e7da7df5a522ffdf4329b6d9250f238307"
|
||||
"9e4f1a6b0dabc244fd0726fd18bf07e86b29a9fc6a76d54fcaf61c79f13c9633"
|
||||
"468d92c3eb048b7137ea52a768f459d2d1f26f83f5a5c174d3333d032c9583c6"
|
||||
"b1faa567e480c326c72107b886f387f108907900804621337524f1f856f056ac"
|
||||
"f420afdff1f0a96026d14820662a4257c0da4924a491fe00182f838414e06152"
|
||||
"5db5f71db4ab8f007b2e78230c2506bed4c62a8e502fb1c08ca04eb14b645b82"
|
||||
"748f403a045f9dbed64910de67e75ba5529c02ab5894417a866225518c10b5e5"
|
||||
"2f1c41b186bd2e79a9fb51fab0461a7a0dce104bf0852c0ec1ade2c55a017443"
|
||||
"b413ad113e188141891b61b930a607890b8468051e8a61cb0f0454c519a51fb7"
|
||||
"d037561b32760fbd0e2aec9f1eefc5efda27b1918eca4742c89092a8a2f7e92e"
|
||||
"cd999ff249452298d650a22c8fe5b0b03bf48c0735f4630befdec8209cbb13a3"
|
||||
)
|
||||
|
||||
readonly -a S03H3_ADD_RELATIVE_PATHS=(
|
||||
"launcher/marte_benchmark_launcher_s03h3.sh"
|
||||
"patchers/configuration/build_s03h3_minimal_from_s03h1_test.sh"
|
||||
"scenarios/S03H3_execution_profiles/validate.sh"
|
||||
"scenarios/S03H3_execution_profiles/verify_s03h3_minimal_structure.py"
|
||||
"configurations/generated/S03H3/from_patcher/smoke_s03h3_execution_profiles_minimal_from_s03h1_test.marte"
|
||||
)
|
||||
|
||||
readonly EXPECTED_PATCHER_SHA256="b3ba3c195b33a028e7ae21ba92b90a070a5e3526b455f9e3dbcebe023af05e2e"
|
||||
readonly EXPECTED_VALIDATOR_SHA256="8574636315340c785f41dca37eaac097cd3b59958e7fd1160444b9c21768f2d5"
|
||||
readonly EXPECTED_MINIMAL_VERIFIER_SHA256="c8d2d4880ed9cb0e8f23427617e989f5f70e82a990a49489f2863a7b3fc2cb95"
|
||||
readonly EXPECTED_MINIMAL_CONFIG_SHA256="2ee67c48d748e79ec7fdbc748bc4371eb02590d7522b41990d5cb2a3649796ec"
|
||||
readonly EXPECTED_TEST_CONFIG_SHA256="d037561b32760fbd0e2aec9f1eefc5efda27b1918eca4742c89092a8a2f7e92e"
|
||||
readonly EXPECTED_DIAGNOSTIC_CONFIG_SHA256="cd999ff249452298d650a22c8fe5b0b03bf48c0735f4630befdec8209cbb13a3"
|
||||
|
||||
resolve_suite() {
|
||||
if [ -n "${MARTE_BENCHMARK_SUITE_ROOT:-}" ]; then
|
||||
[[ "$MARTE_BENCHMARK_SUITE_ROOT" = /* ]] || \
|
||||
fail 50 "TEST_OVERRIDE_NOT_ABSOLUTE"
|
||||
[ -d "$MARTE_BENCHMARK_SUITE_ROOT" ] || \
|
||||
fail 50 "TEST_OVERRIDE_ROOT_MISSING"
|
||||
SUITE="$(cd -- "$MARTE_BENCHMARK_SUITE_ROOT" && pwd -P)"
|
||||
[ -n "$SUITE" ] && [ "$SUITE" != "/" ] || \
|
||||
fail 50 "TEST_OVERRIDE_ROOT_UNSAFE"
|
||||
if [ "$SUITE" != "$INSTALLED_SUITE" ]; then
|
||||
[ "${S03H3_TEST_ONLY_OVERRIDE:-NO}" = "YES" ] || \
|
||||
fail 50 "TEST_OVERRIDE_NOT_ACKNOWLEDGED"
|
||||
fi
|
||||
elif [ "${S03H3_TEST_ONLY_OVERRIDE:-NO}" = "YES" ]; then
|
||||
fail 50 "TEST_OVERRIDE_ROOT_NOT_PROVIDED"
|
||||
else
|
||||
SUITE="$INSTALLED_SUITE"
|
||||
fi
|
||||
readonly SUITE
|
||||
}
|
||||
|
||||
verify_historical_baseline() {
|
||||
local index=0
|
||||
while [ "$index" -lt "${#HISTORICAL_RELATIVE_PATHS[@]}" ]; do
|
||||
verify_hash \
|
||||
"$SUITE/${HISTORICAL_RELATIVE_PATHS[$index]}" \
|
||||
"${HISTORICAL_EXPECTED_HASHES[$index]}" \
|
||||
"HISTORICAL_${index}" || return 1
|
||||
index=$((index + 1))
|
||||
done
|
||||
}
|
||||
|
||||
verify_candidate_components() {
|
||||
verify_hash "$PATCHER" "$EXPECTED_PATCHER_SHA256" "S03H3_PATCHER" || return 1
|
||||
verify_hash "$VALIDATOR" "$EXPECTED_VALIDATOR_SHA256" "S03H3_VALIDATOR" || return 1
|
||||
verify_hash "$MINIMAL_VERIFIER" "$EXPECTED_MINIMAL_VERIFIER_SHA256" "S03H3_MINIMAL_VERIFIER" || return 1
|
||||
verify_hash "$MINIMAL_CONFIG" "$EXPECTED_MINIMAL_CONFIG_SHA256" "S03H3_MINIMAL_CONFIG" || return 1
|
||||
}
|
||||
|
||||
build_protected_paths() {
|
||||
PROTECTED_PATHS=()
|
||||
local relative
|
||||
for relative in "${HISTORICAL_RELATIVE_PATHS[@]}"; do
|
||||
PROTECTED_PATHS+=("$SUITE/$relative")
|
||||
done
|
||||
for relative in "${S03H3_ADD_RELATIVE_PATHS[@]}"; do
|
||||
PROTECTED_PATHS+=("$SUITE/$relative")
|
||||
done
|
||||
PROTECTED_PATHS+=("$SUITE/launcher/marte_benchmark_menu.sh")
|
||||
}
|
||||
|
||||
write_protected_snapshot() {
|
||||
local destination="$1"
|
||||
[ "${#PROTECTED_PATHS[@]}" -eq 27 ] || return 1
|
||||
sha256sum -- "${PROTECTED_PATHS[@]}" >"$destination"
|
||||
}
|
||||
|
||||
write_protected_path_list() {
|
||||
local destination="$1"
|
||||
printf '%s\n' "${PROTECTED_PATHS[@]}" >"$destination"
|
||||
}
|
||||
|
||||
parse_contract_field() {
|
||||
local field="$1"
|
||||
local file="$2"
|
||||
local count
|
||||
PARSED_FIELD_VALUE=""
|
||||
PARSED_FIELD_ERROR=""
|
||||
count="$(grep -Ec "^${field}=" "$file" || true)"
|
||||
if [ "$count" -eq 0 ]; then
|
||||
PARSED_FIELD_ERROR="MISSING"
|
||||
return 1
|
||||
fi
|
||||
if [ "$count" -ne 1 ]; then
|
||||
PARSED_FIELD_ERROR="DUPLICATED"
|
||||
return 1
|
||||
fi
|
||||
PARSED_FIELD_VALUE="$(sed -n "s/^${field}=//p" "$file")"
|
||||
[ -n "$PARSED_FIELD_VALUE" ] || {
|
||||
PARSED_FIELD_ERROR="MALFORMED"
|
||||
return 1
|
||||
}
|
||||
}
|
||||
|
||||
classify_s03h3_run() {
|
||||
local validator_rc="$1"
|
||||
local validation_tee_rc="$2"
|
||||
local validation_file="$3"
|
||||
local csv_rc="$4"
|
||||
local invariance_status="$5"
|
||||
local dependency_status="$6"
|
||||
local requested_mode="$7"
|
||||
local field
|
||||
|
||||
FINAL_RC=22
|
||||
FINAL_RESULT="INCONCLUSIVE_S03H3_CONTRACT"
|
||||
BLOCK_REASON="NOT_EVALUATED"
|
||||
PARSED_MODE_STATUS="NOT_EVALUATED"
|
||||
PARSED_PROFILE_CONFIG_STATUS="NOT_EVALUATED"
|
||||
PARSED_PROFILE_RUNTIME_STATUS="NOT_EVALUATED"
|
||||
PARSED_OBSERVABILITY_STATUS="NOT_EVALUATED"
|
||||
PARSED_FUNCTIONAL_STATUS="NOT_EVALUATED"
|
||||
PARSED_SEMANTIC_STATUS="NOT_EVALUATED"
|
||||
PARSED_TIMING_STATUS="NOT_EVALUATED"
|
||||
PARSED_MEASUREMENT_ELIGIBILITY="NOT_EVALUATED"
|
||||
PARSED_COMPLETE_SAMPLE_COUNT="NOT_EVALUATED"
|
||||
|
||||
if [ "$dependency_status" != "PASS" ]; then
|
||||
FINAL_RC=51
|
||||
FINAL_RESULT="FAIL_DEPENDENCY_INTEGRITY"
|
||||
BLOCK_REASON="DEPENDENCY_INTEGRITY_NOT_PASS"
|
||||
return 0
|
||||
fi
|
||||
if [ "$validation_tee_rc" -ne 0 ]; then
|
||||
FINAL_RC=67
|
||||
FINAL_RESULT="FAIL_VALIDATION_LOG"
|
||||
BLOCK_REASON="VALIDATION_LOG_NOT_WRITTEN"
|
||||
return 0
|
||||
fi
|
||||
case "$validator_rc" in
|
||||
0|10|11|20|21) ;;
|
||||
*)
|
||||
FINAL_RC=68
|
||||
FINAL_RESULT="FAIL_VALIDATOR_EXIT"
|
||||
BLOCK_REASON="UNRECOGNIZED_VALIDATOR_RC_${validator_rc}"
|
||||
return 0
|
||||
;;
|
||||
esac
|
||||
if [ "$csv_rc" -ne 0 ]; then
|
||||
FINAL_RC=70
|
||||
FINAL_RESULT="FAIL_DERIVED_CSV_EXPORT"
|
||||
BLOCK_REASON="CSV_EXPORT_RC_${csv_rc}"
|
||||
return 0
|
||||
fi
|
||||
if [ "$invariance_status" != "PASS" ]; then
|
||||
FINAL_RC=71
|
||||
FINAL_RESULT="FAIL_PROTECTED_BASELINE_CHANGED"
|
||||
BLOCK_REASON="PROTECTED_BASELINE_INVARIANCE_${invariance_status}"
|
||||
return 0
|
||||
fi
|
||||
|
||||
CONTRACT_PARSE_ERROR="NONE"
|
||||
for field in \
|
||||
MODE \
|
||||
MODE_STATUS \
|
||||
PROFILE_CONFIG_STATUS \
|
||||
PROFILE_RUNTIME_STATUS \
|
||||
OBSERVABILITY_STATUS \
|
||||
OBSERVABILITY_REASON \
|
||||
FUNCTIONAL_STATUS \
|
||||
SEMANTIC_STATUS \
|
||||
TIMING_STATUS \
|
||||
MEASUREMENT_ELIGIBILITY \
|
||||
COMPLETE_SAMPLE_COUNT \
|
||||
VALIDATION_RESULT
|
||||
do
|
||||
if parse_contract_field "$field" "$validation_file"; then
|
||||
case "$field" in
|
||||
MODE) PARSED_MODE="$PARSED_FIELD_VALUE" ;;
|
||||
MODE_STATUS) PARSED_MODE_STATUS="$PARSED_FIELD_VALUE" ;;
|
||||
PROFILE_CONFIG_STATUS) PARSED_PROFILE_CONFIG_STATUS="$PARSED_FIELD_VALUE" ;;
|
||||
PROFILE_RUNTIME_STATUS) PARSED_PROFILE_RUNTIME_STATUS="$PARSED_FIELD_VALUE" ;;
|
||||
OBSERVABILITY_STATUS) PARSED_OBSERVABILITY_STATUS="$PARSED_FIELD_VALUE" ;;
|
||||
OBSERVABILITY_REASON) PARSED_OBSERVABILITY_REASON="$PARSED_FIELD_VALUE" ;;
|
||||
FUNCTIONAL_STATUS) PARSED_FUNCTIONAL_STATUS="$PARSED_FIELD_VALUE" ;;
|
||||
SEMANTIC_STATUS) PARSED_SEMANTIC_STATUS="$PARSED_FIELD_VALUE" ;;
|
||||
TIMING_STATUS) PARSED_TIMING_STATUS="$PARSED_FIELD_VALUE" ;;
|
||||
MEASUREMENT_ELIGIBILITY) PARSED_MEASUREMENT_ELIGIBILITY="$PARSED_FIELD_VALUE" ;;
|
||||
COMPLETE_SAMPLE_COUNT) PARSED_COMPLETE_SAMPLE_COUNT="$PARSED_FIELD_VALUE" ;;
|
||||
VALIDATION_RESULT) PARSED_VALIDATION_RESULT="$PARSED_FIELD_VALUE" ;;
|
||||
esac
|
||||
elif [ "$CONTRACT_PARSE_ERROR" = "NONE" ]; then
|
||||
CONTRACT_PARSE_ERROR="${field}_${PARSED_FIELD_ERROR}"
|
||||
fi
|
||||
done
|
||||
|
||||
if [ "$CONTRACT_PARSE_ERROR" = "NONE" ]; then
|
||||
[ "$PARSED_MODE" = "$requested_mode" ] || CONTRACT_PARSE_ERROR="MODE_MISMATCH"
|
||||
for field in \
|
||||
"$PARSED_MODE_STATUS" \
|
||||
"$PARSED_PROFILE_CONFIG_STATUS" \
|
||||
"$PARSED_PROFILE_RUNTIME_STATUS" \
|
||||
"$PARSED_OBSERVABILITY_STATUS" \
|
||||
"$PARSED_FUNCTIONAL_STATUS" \
|
||||
"$PARSED_SEMANTIC_STATUS"
|
||||
do
|
||||
case "$field" in
|
||||
PASS|FAIL|NOT_DEMONSTRATED) ;;
|
||||
*) CONTRACT_PARSE_ERROR="STATUS_VOCABULARY_INVALID"; break ;;
|
||||
esac
|
||||
done
|
||||
fi
|
||||
if [ "$CONTRACT_PARSE_ERROR" = "NONE" ]; then
|
||||
[[ "$PARSED_OBSERVABILITY_REASON" =~ ^[A-Z][A-Z0-9_]*$ ]] || \
|
||||
CONTRACT_PARSE_ERROR="OBSERVABILITY_REASON_MALFORMED"
|
||||
[[ "$PARSED_TIMING_STATUS" =~ ^(NOT_VALID_|UNASSESSED_)[A-Z0-9_]+$ ]] || \
|
||||
CONTRACT_PARSE_ERROR="TIMING_STATUS_UNRECOGNIZED"
|
||||
[ "$PARSED_MEASUREMENT_ELIGIBILITY" = "NO" ] || \
|
||||
CONTRACT_PARSE_ERROR="ELIGIBILITY_CONTRACT_VIOLATION"
|
||||
[[ "$PARSED_COMPLETE_SAMPLE_COUNT" =~ ^[0-9]+$ ]] || \
|
||||
CONTRACT_PARSE_ERROR="COMPLETE_SAMPLE_COUNT_MALFORMED"
|
||||
[[ "$PARSED_VALIDATION_RESULT" =~ ^[A-Z][A-Z0-9_]*$ ]] || \
|
||||
CONTRACT_PARSE_ERROR="VALIDATION_RESULT_MALFORMED"
|
||||
if [ "$PARSED_OBSERVABILITY_STATUS" = "PASS" ]; then
|
||||
[ "$PARSED_OBSERVABILITY_REASON" = "NONE" ] || \
|
||||
CONTRACT_PARSE_ERROR="OBSERVABILITY_REASON_CONFLICT"
|
||||
else
|
||||
[ "$PARSED_OBSERVABILITY_REASON" != "NONE" ] || \
|
||||
CONTRACT_PARSE_ERROR="OBSERVABILITY_REASON_MISSING"
|
||||
fi
|
||||
case "$validator_rc:$PARSED_VALIDATION_RESULT" in
|
||||
0:PASS_CLEAN_SHUTDOWN|\
|
||||
10:PASS_KNOWN_SHUTDOWN_ANOMALY|\
|
||||
11:PASS_UNCLASSIFIED_SHUTDOWN_ANOMALY|\
|
||||
20:FUNCTIONAL_OR_SEMANTIC_NOT_DEMONSTRATED|\
|
||||
21:FAIL_REQUIRED_INPUT)
|
||||
;;
|
||||
*)
|
||||
CONTRACT_PARSE_ERROR="VALIDATION_RESULT_RC_CONFLICT"
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
if [ "$requested_mode" = "MINIMAL" ]; then
|
||||
for field in \
|
||||
CANONICAL_STRUCTURAL_COMPLETENESS_STATUS \
|
||||
MINIMAL_RUNTIME_CONFIG_STATUS
|
||||
do
|
||||
if parse_contract_field "$field" "$validation_file"; then
|
||||
[ "$PARSED_FIELD_VALUE" = "PASS" ] || \
|
||||
CONTRACT_PARSE_ERROR="${field}_NOT_PASS"
|
||||
else
|
||||
CONTRACT_PARSE_ERROR="${field}_${PARSED_FIELD_ERROR}"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
if [ "$CONTRACT_PARSE_ERROR" != "NONE" ]; then
|
||||
FINAL_RC=22
|
||||
FINAL_RESULT="INCONCLUSIVE_S03H3_CONTRACT"
|
||||
BLOCK_REASON="$CONTRACT_PARSE_ERROR"
|
||||
return 0
|
||||
fi
|
||||
|
||||
case "$validator_rc" in
|
||||
11|20|21)
|
||||
FINAL_RC=20
|
||||
FINAL_RESULT="S03H3_VALIDATION_INCONCLUSIVE"
|
||||
BLOCK_REASON="VALIDATOR_RC_${validator_rc}"
|
||||
return 0
|
||||
;;
|
||||
esac
|
||||
|
||||
for field in \
|
||||
"$PARSED_MODE_STATUS" \
|
||||
"$PARSED_PROFILE_CONFIG_STATUS" \
|
||||
"$PARSED_PROFILE_RUNTIME_STATUS" \
|
||||
"$PARSED_OBSERVABILITY_STATUS" \
|
||||
"$PARSED_FUNCTIONAL_STATUS" \
|
||||
"$PARSED_SEMANTIC_STATUS"
|
||||
do
|
||||
if [ "$field" != "PASS" ]; then
|
||||
FINAL_RC=25
|
||||
FINAL_RESULT="S03H3_CONTRACT_STATUS_NOT_PASS"
|
||||
BLOCK_REASON="MANDATORY_STATUS_NOT_PASS"
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
|
||||
case "$PARSED_TIMING_STATUS" in
|
||||
NOT_VALID_*)
|
||||
FINAL_RC=14
|
||||
FINAL_RESULT="FUNCTIONAL_AND_SEMANTIC_PASS_TIMING_NOT_VALID"
|
||||
BLOCK_REASON="$PARSED_TIMING_STATUS"
|
||||
;;
|
||||
UNASSESSED_*)
|
||||
FINAL_RC=15
|
||||
FINAL_RESULT="FUNCTIONAL_AND_SEMANTIC_PASS_TIMING_UNASSESSED"
|
||||
BLOCK_REASON="$PARSED_TIMING_STATUS"
|
||||
;;
|
||||
*)
|
||||
FINAL_RC=22
|
||||
FINAL_RESULT="INCONCLUSIVE_S03H3_CONTRACT"
|
||||
BLOCK_REASON="TIMING_STATUS_UNRECOGNIZED"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
run_s03h3() {
|
||||
local duration="$1"
|
||||
MODE="$2"
|
||||
local expected_selected_hash
|
||||
local patcher_log
|
||||
local protected_before
|
||||
local capture
|
||||
local run_dir
|
||||
local validation_log
|
||||
local csv_report
|
||||
local launcher_summary
|
||||
local protected_after
|
||||
local invariance_report
|
||||
local protected_path_list
|
||||
|
||||
resolve_suite
|
||||
[ -d "$SUITE" ] || return 50
|
||||
|
||||
PATCHER="$SUITE/patchers/configuration/build_s03h3_minimal_from_s03h1_test.sh"
|
||||
VALIDATOR="$SUITE/scenarios/S03H3_execution_profiles/validate.sh"
|
||||
MINIMAL_VERIFIER="$SUITE/scenarios/S03H3_execution_profiles/verify_s03h3_minimal_structure.py"
|
||||
MINIMAL_CONFIG="$SUITE/configurations/generated/S03H3/from_patcher/smoke_s03h3_execution_profiles_minimal_from_s03h1_test.marte"
|
||||
TEST_CONFIG="$SUITE/configurations/generated/S03H1/from_patcher/smoke_s03h1_execution_profiles_test_from_s02.marte"
|
||||
DIAGNOSTIC_CONFIG="$SUITE/configurations/generated/S03H1/from_patcher/smoke_s03h1_execution_profiles_diagnostic_from_s02.marte"
|
||||
RUNNER="$SUITE/common/marte_runner.sh"
|
||||
LIVE_PATHS="$SUITE/common/paths.sh"
|
||||
CSV_EXPORTER="$SUITE/scenarios/S03H1_execution_profiles/export_s03_csv.py"
|
||||
PARSER="$SUITE/scenarios/S03_semantic_sentinels/parse_s03_binary.py"
|
||||
|
||||
case "$MODE" in
|
||||
MINIMAL)
|
||||
SELECTED_CONFIG="$MINIMAL_CONFIG"
|
||||
expected_selected_hash="$EXPECTED_MINIMAL_CONFIG_SHA256"
|
||||
;;
|
||||
TEST)
|
||||
SELECTED_CONFIG="$TEST_CONFIG"
|
||||
expected_selected_hash="$EXPECTED_TEST_CONFIG_SHA256"
|
||||
;;
|
||||
DIAGNOSTIC)
|
||||
SELECTED_CONFIG="$DIAGNOSTIC_CONFIG"
|
||||
expected_selected_hash="$EXPECTED_DIAGNOSTIC_CONFIG_SHA256"
|
||||
;;
|
||||
*) return 2 ;;
|
||||
esac
|
||||
|
||||
verify_historical_baseline || return 52
|
||||
verify_candidate_components || return 51
|
||||
verify_hash "$SELECTED_CONFIG" "$expected_selected_hash" "SELECTED_${MODE}_CONFIG" || return 51
|
||||
build_protected_paths
|
||||
local protected_path
|
||||
for protected_path in "${PROTECTED_PATHS[@]}"; do
|
||||
[ -f "$protected_path" ] || return 51
|
||||
done
|
||||
|
||||
WORK_ROOT="$(mktemp -d "${TMPDIR:-/tmp}/s03h3_launcher.XXXXXX")" || return 53
|
||||
trap 'rm -rf -- "$WORK_ROOT"' EXIT HUP INT TERM
|
||||
patcher_log="$WORK_ROOT/patcher.log"
|
||||
protected_before="$WORK_ROOT/protected_before.sha256"
|
||||
capture="$WORK_ROOT/runner_capture.log"
|
||||
|
||||
"$PATCHER" >"$patcher_log" 2>&1
|
||||
PATCHER_RC=$?
|
||||
[ "$PATCHER_RC" -eq 0 ] || return 54
|
||||
verify_hash "$MINIMAL_CONFIG" "$EXPECTED_MINIMAL_CONFIG_SHA256" "MINIMAL_REGENERATION" || return 55
|
||||
python3 "$MINIMAL_VERIFIER" CANONICAL "$TEST_CONFIG" "$MINIMAL_CONFIG" >/dev/null 2>&1 || return 55
|
||||
write_protected_snapshot "$protected_before" || return 56
|
||||
|
||||
[ -f "$LIVE_PATHS" ] || return 57
|
||||
# shellcheck source=/dev/null
|
||||
source "$LIVE_PATHS" || return 57
|
||||
CONSTANT_GAM_LIB_DIR="$MARTE2_COMPONENTS_ROOT/Build/$MARTE_TARGET/Components/GAMs/ConstantGAM"
|
||||
CONSTANT_GAM_LIB="$CONSTANT_GAM_LIB_DIR/ConstantGAM.so"
|
||||
[ -f "$CONSTANT_GAM_LIB" ] || return 58
|
||||
case ":${LD_LIBRARY_PATH-}:" in
|
||||
*":${CONSTANT_GAM_LIB_DIR}:"*) ;;
|
||||
*) LD_LIBRARY_PATH="${CONSTANT_GAM_LIB_DIR}${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}" ;;
|
||||
esac
|
||||
export LD_LIBRARY_PATH
|
||||
|
||||
printf '============================================================\n'
|
||||
printf 'S03-H3 EXECUTION PROFILES\n'
|
||||
printf '============================================================\n'
|
||||
printf 'MODE=%s\n' "$MODE"
|
||||
printf 'DURATION=%s\n' "$duration"
|
||||
printf 'DEPENDENCY_INTEGRITY_STATUS=PASS\n'
|
||||
|
||||
"$RUNNER" "S03H3_${MODE}_launcher" "$SELECTED_CONFIG" "State1" "$duration" \
|
||||
2>&1 | tee "$capture"
|
||||
RUNNER_CODES=("${PIPESTATUS[@]}")
|
||||
RUNNER_RC="${RUNNER_CODES[0]}"
|
||||
CAPTURE_TEE_RC="${RUNNER_CODES[1]}"
|
||||
[ "$RUNNER_RC" -eq 0 ] || return 60
|
||||
[ "$CAPTURE_TEE_RC" -eq 0 ] || return 61
|
||||
|
||||
run_dir="$(sed -n 's/^RUN_DIR=//p' "$capture" | tail -n 1)"
|
||||
case "$run_dir" in
|
||||
"$SUITE"/runs/*_S03H3_${MODE}_launcher) ;;
|
||||
*) return 62 ;;
|
||||
esac
|
||||
[ -d "$run_dir" ] || return 62
|
||||
|
||||
RUN_LOG="$run_dir/run.log"
|
||||
RUN_CONFIG="$run_dir/configuration.marte"
|
||||
RUNNER_SUMMARY="$run_dir/runner_summary.txt"
|
||||
RUN_HASHES="$run_dir/hashes.sha256"
|
||||
OUTPUT_FILE="$run_dir/s03_output.bin"
|
||||
CSV_FILE="$run_dir/s03_output.csv"
|
||||
MODE_FILE="$run_dir/s03h3_mode.txt"
|
||||
validation_log="$run_dir/validation.txt"
|
||||
csv_report="$run_dir/csv_export.txt"
|
||||
launcher_summary="$run_dir/launcher_summary.txt"
|
||||
PROTECTED_BEFORE_RUN="$run_dir/protected_baseline_before.sha256"
|
||||
protected_after="$run_dir/protected_baseline_after.sha256"
|
||||
invariance_report="$run_dir/protected_baseline_invariance.txt"
|
||||
protected_path_list="$run_dir/protected_successor_paths.txt"
|
||||
|
||||
for protected_path in "$RUN_LOG" "$RUN_CONFIG" "$RUNNER_SUMMARY" "$RUN_HASHES" "$OUTPUT_FILE"; do
|
||||
[ -f "$protected_path" ] || return 63
|
||||
done
|
||||
|
||||
cp -- "$protected_before" "$PROTECTED_BEFORE_RUN" || return 64
|
||||
write_protected_path_list "$protected_path_list" || return 64
|
||||
{
|
||||
printf 'SCENARIO=S03H3\n'
|
||||
printf 'MODE=%s\n' "$MODE"
|
||||
printf 'SELECTED_CONFIG_SHA256=%s\n' "$expected_selected_hash"
|
||||
} >"$MODE_FILE" || return 64
|
||||
|
||||
sha256sum -- \
|
||||
"$MODE_FILE" \
|
||||
"${BASH_SOURCE[0]}" \
|
||||
"$PATCHER" \
|
||||
"$VALIDATOR" \
|
||||
"$MINIMAL_VERIFIER" \
|
||||
"$CSV_EXPORTER" \
|
||||
"$PARSER" \
|
||||
"$RUN_LOG" \
|
||||
"$RUNNER_SUMMARY" \
|
||||
"$OUTPUT_FILE" \
|
||||
"$PROTECTED_BEFORE_RUN" \
|
||||
"$protected_path_list" \
|
||||
"${PROTECTED_PATHS[@]}" \
|
||||
>>"$RUN_HASHES" || return 64
|
||||
|
||||
timeout 30s "$VALIDATOR" "$MODE" "$run_dir" 2>&1 | tee "$validation_log"
|
||||
VALIDATION_CODES=("${PIPESTATUS[@]}")
|
||||
VALIDATOR_RC="${VALIDATION_CODES[0]}"
|
||||
VALIDATION_TEE_RC="${VALIDATION_CODES[1]}"
|
||||
|
||||
"$CSV_EXPORTER" "$OUTPUT_FILE" "$CSV_FILE" >"$csv_report" 2>&1
|
||||
CSV_EXPORT_RC=$?
|
||||
if [ "$CSV_EXPORT_RC" -eq 0 ]; then
|
||||
CSV_EXPORT_STATUS="PASS"
|
||||
else
|
||||
CSV_EXPORT_STATUS="FAIL"
|
||||
fi
|
||||
|
||||
if write_protected_snapshot "$protected_after" && \
|
||||
cmp -s -- "$PROTECTED_BEFORE_RUN" "$protected_after"; then
|
||||
PROTECTED_BASELINE_INVARIANCE="PASS"
|
||||
else
|
||||
PROTECTED_BASELINE_INVARIANCE="FAIL"
|
||||
fi
|
||||
{
|
||||
printf 'PROTECTED_BASELINE_INVARIANCE=%s\n' "$PROTECTED_BASELINE_INVARIANCE"
|
||||
printf 'PROTECTED_SUCCESSOR_BASELINE_COUNT=27\n'
|
||||
} >"$invariance_report"
|
||||
|
||||
for protected_path in "$validation_log" "$csv_report" "$protected_after" "$invariance_report"; do
|
||||
[ -f "$protected_path" ] && sha256sum -- "$protected_path" >>"$RUN_HASHES"
|
||||
done
|
||||
[ -f "$CSV_FILE" ] && sha256sum -- "$CSV_FILE" >>"$RUN_HASHES"
|
||||
|
||||
classify_s03h3_run \
|
||||
"$VALIDATOR_RC" \
|
||||
"$VALIDATION_TEE_RC" \
|
||||
"$validation_log" \
|
||||
"$CSV_EXPORT_RC" \
|
||||
"$PROTECTED_BASELINE_INVARIANCE" \
|
||||
"PASS" \
|
||||
"$MODE"
|
||||
|
||||
{
|
||||
printf '============================================================\n'
|
||||
printf 'RIEPILOGO LAUNCHER S03-H3\n'
|
||||
printf '============================================================\n'
|
||||
printf 'SCENARIO=S03H3\n'
|
||||
printf 'MODE=%s\n' "$MODE"
|
||||
printf 'DURATION=%s\n' "$duration"
|
||||
printf 'RUN_DIR=%s\n' "$run_dir"
|
||||
printf 'RUNNER_RC=%s\n' "$RUNNER_RC"
|
||||
printf 'VALIDATOR_RC=%s\n' "$VALIDATOR_RC"
|
||||
printf 'CSV_EXPORT_RC=%s\n' "$CSV_EXPORT_RC"
|
||||
printf 'DEPENDENCY_INTEGRITY_STATUS=PASS\n'
|
||||
printf 'PROTECTED_BASELINE_INVARIANCE=%s\n' "$PROTECTED_BASELINE_INVARIANCE"
|
||||
printf 'CSV_EXPORT_STATUS=%s\n' "$CSV_EXPORT_STATUS"
|
||||
printf 'MODE_STATUS=%s\n' "$PARSED_MODE_STATUS"
|
||||
printf 'PROFILE_CONFIG_STATUS=%s\n' "$PARSED_PROFILE_CONFIG_STATUS"
|
||||
printf 'PROFILE_RUNTIME_STATUS=%s\n' "$PARSED_PROFILE_RUNTIME_STATUS"
|
||||
printf 'OBSERVABILITY_STATUS=%s\n' "$PARSED_OBSERVABILITY_STATUS"
|
||||
printf 'FUNCTIONAL_STATUS=%s\n' "$PARSED_FUNCTIONAL_STATUS"
|
||||
printf 'SEMANTIC_STATUS=%s\n' "$PARSED_SEMANTIC_STATUS"
|
||||
printf 'TIMING_STATUS=%s\n' "$PARSED_TIMING_STATUS"
|
||||
printf 'MEASUREMENT_ELIGIBILITY=NO\n'
|
||||
printf 'BLOCK_REASON=%s\n' "$BLOCK_REASON"
|
||||
printf 'FINAL_RESULT=%s\n' "$FINAL_RESULT"
|
||||
printf 'FINAL_RC=%s\n' "$FINAL_RC"
|
||||
printf 'PERFORMANCE_MEASUREMENT_AUTHORIZED=NO\n'
|
||||
printf 'S04_AUTHORIZED=NO\n'
|
||||
printf 'MD00_AUTHORIZED=NO\n'
|
||||
} | tee "$launcher_summary"
|
||||
SUMMARY_CODES=("${PIPESTATUS[@]}")
|
||||
if [ "${SUMMARY_CODES[1]}" -ne 0 ]; then
|
||||
FINAL_RC=69
|
||||
FINAL_RESULT="FAIL_LAUNCHER_SUMMARY"
|
||||
BLOCK_REASON="LAUNCHER_SUMMARY_NOT_WRITTEN"
|
||||
else
|
||||
sha256sum -- "$launcher_summary" >>"$RUN_HASHES"
|
||||
fi
|
||||
|
||||
printf 'RUN_DIR=%s\n' "$run_dir"
|
||||
printf 'FINAL_RESULT=%s\n' "$FINAL_RESULT"
|
||||
printf 'FINAL_RC=%s\n' "$FINAL_RC"
|
||||
|
||||
rm -rf -- "$WORK_ROOT"
|
||||
WORK_ROOT=""
|
||||
trap - EXIT HUP INT TERM
|
||||
return "$FINAL_RC"
|
||||
}
|
||||
|
||||
if [ "${S03H3_LAUNCHER_LIB_ONLY:-0}" = "1" ]; then
|
||||
if [ "${BASH_SOURCE[0]}" != "$0" ]; then
|
||||
return 0
|
||||
fi
|
||||
printf 'S03H3_LAUNCHER_LIB_ONLY=1 richiede source.\n' >&2
|
||||
exit 3
|
||||
fi
|
||||
|
||||
case "$#" in
|
||||
1)
|
||||
case "$1" in
|
||||
-h|--help)
|
||||
print_usage
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
print_usage >&2
|
||||
exit 2
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
3)
|
||||
[ "$1" = "S03H3" ] || {
|
||||
print_usage >&2
|
||||
exit 2
|
||||
}
|
||||
is_positive_decimal "$2" || {
|
||||
printf 'Durata non valida: %s\n' "$2" >&2
|
||||
exit 2
|
||||
}
|
||||
case "$3" in
|
||||
MINIMAL|TEST|DIAGNOSTIC) ;;
|
||||
*)
|
||||
printf 'Profilo non riconosciuto: %s\n' "$3" >&2
|
||||
exit 2
|
||||
;;
|
||||
esac
|
||||
run_s03h3 "$2" "$3"
|
||||
exit $?
|
||||
;;
|
||||
*)
|
||||
print_usage >&2
|
||||
exit 2
|
||||
;;
|
||||
esac
|
||||
Executable
+512
@@ -0,0 +1,512 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -u
|
||||
set -o pipefail
|
||||
|
||||
readonly DEFAULT_DURATION_SECONDS="8"
|
||||
readonly TEST_OVERRIDE_ACK_VALUE="YES"
|
||||
|
||||
CAPTURE=""
|
||||
STATUS_DIR=""
|
||||
LAUNCH_ACTIVE="NO"
|
||||
INTERRUPT_PENDING="NO"
|
||||
|
||||
SELECTED_SCENARIO=""
|
||||
DISPLAY_SCENARIO=""
|
||||
SELECTED_PROFILE="N/A"
|
||||
SELECTED_DURATION=""
|
||||
|
||||
LAST_LAUNCHER_RC="NOT_AVAILABLE"
|
||||
LAST_RUN_DIR="NOT_AVAILABLE"
|
||||
LAST_RUN_DIR_STATUS="NOT_AVAILABLE"
|
||||
|
||||
cleanup_temporary_files() {
|
||||
if [ -n "$CAPTURE" ]; then
|
||||
rm -f -- "$CAPTURE"
|
||||
CAPTURE=""
|
||||
fi
|
||||
|
||||
if [ -n "$STATUS_DIR" ]; then
|
||||
rm -f -- \
|
||||
"$STATUS_DIR/launcher_rc" \
|
||||
"$STATUS_DIR/tee_rc"
|
||||
rmdir -- "$STATUS_DIR" 2>/dev/null || true
|
||||
STATUS_DIR=""
|
||||
fi
|
||||
}
|
||||
|
||||
fatal_wrapper_error() {
|
||||
local exit_code="$1"
|
||||
local status="$2"
|
||||
local message="$3"
|
||||
|
||||
printf 'ERRORE S03-H3: %s\n' "$message" >&2
|
||||
if [ "$exit_code" -eq 70 ]; then
|
||||
printf 'S03_H3_STARTUP_STATUS=%s\n' "$status" >&2
|
||||
else
|
||||
printf 'S03_H3_MENU_LIFECYCLE_STATUS=%s\n' "$status" >&2
|
||||
fi
|
||||
exit "$exit_code"
|
||||
}
|
||||
|
||||
handle_int() {
|
||||
if [ "$LAUNCH_ACTIVE" = "YES" ]; then
|
||||
INTERRUPT_PENDING="YES"
|
||||
return 0
|
||||
fi
|
||||
|
||||
printf '\nInterruzione richiesta: nessun nuovo benchmark verra avviato.\n' >&2
|
||||
printf 'LAUNCHER_EXECUTED=NO\n' >&2
|
||||
exit 130
|
||||
}
|
||||
|
||||
handle_hup() {
|
||||
printf '\nS03-H3 terminato da SIGHUP.\n' >&2
|
||||
exit 129
|
||||
}
|
||||
|
||||
handle_term() {
|
||||
printf '\nS03-H3 terminato da SIGTERM.\n' >&2
|
||||
exit 143
|
||||
}
|
||||
|
||||
trap cleanup_temporary_files EXIT
|
||||
trap handle_hup HUP
|
||||
trap handle_int INT
|
||||
trap handle_term TERM
|
||||
|
||||
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)"
|
||||
if [ -z "$SCRIPT_DIR" ]; then
|
||||
fatal_wrapper_error 70 "FAIL_SUITE_ROOT" \
|
||||
"impossibile determinare la directory del menu"
|
||||
fi
|
||||
|
||||
INSTALLED_SUITE="$(cd -- "$SCRIPT_DIR/.." && pwd -P)"
|
||||
if [ -z "$INSTALLED_SUITE" ]; then
|
||||
fatal_wrapper_error 70 "FAIL_SUITE_ROOT" \
|
||||
"impossibile determinare la radice della suite"
|
||||
fi
|
||||
|
||||
readonly -a COMPLETE_OVERRIDE_PATHS=(
|
||||
"launcher/marte_benchmark_launcher.sh"
|
||||
"configurations/generated/S00/smoke_s0_core.marte"
|
||||
"configurations/generated/S01/from_patcher/smoke_s1_timing_from_s00.marte"
|
||||
"configurations/generated/S02/from_patcher/smoke_s2_binary_recording_from_s01.marte"
|
||||
"configurations/generated/S03/from_patcher/smoke_s3_semantic_sentinels_from_s02.marte"
|
||||
"patchers/configuration/build_s01_from_s00.sh"
|
||||
"patchers/configuration/build_s02_from_s01.sh"
|
||||
"patchers/configuration/build_s03_from_s02.sh"
|
||||
"scenarios/S02_binary_recording/validate.sh"
|
||||
"scenarios/S03_semantic_sentinels/validate.sh"
|
||||
"scenarios/S03_semantic_sentinels/parse_s03_binary.py"
|
||||
"common/marte_runner.sh"
|
||||
"common/paths.sh"
|
||||
"common/environment.sh"
|
||||
"launcher/marte_benchmark_launcher_s03h1.sh"
|
||||
"patchers/configuration/build_s03h1_from_s02.sh"
|
||||
"scenarios/S03H1_execution_profiles/validate.sh"
|
||||
"scenarios/S03H1_execution_profiles/verify_s03h1_config.py"
|
||||
"scenarios/S03H1_execution_profiles/export_s03_csv.py"
|
||||
"configurations/generated/S03H1/from_patcher/smoke_s03h1_execution_profiles_test_from_s02.marte"
|
||||
"configurations/generated/S03H1/from_patcher/smoke_s03h1_execution_profiles_diagnostic_from_s02.marte"
|
||||
"launcher/marte_benchmark_launcher_s03h3.sh"
|
||||
"patchers/configuration/build_s03h3_minimal_from_s03h1_test.sh"
|
||||
"scenarios/S03H3_execution_profiles/validate.sh"
|
||||
"scenarios/S03H3_execution_profiles/verify_s03h3_minimal_structure.py"
|
||||
"configurations/generated/S03H3/from_patcher/smoke_s03h3_execution_profiles_minimal_from_s03h1_test.marte"
|
||||
"launcher/marte_benchmark_menu.sh"
|
||||
)
|
||||
|
||||
verify_complete_override_root() {
|
||||
local relative_path
|
||||
local missing_count=0
|
||||
|
||||
for relative_path in "${COMPLETE_OVERRIDE_PATHS[@]}"; do
|
||||
if [ ! -f "$SUITE/$relative_path" ]; then
|
||||
printf 'ERRORE S03-H3: fixture incompleta, manca %s\n' \
|
||||
"$relative_path" >&2
|
||||
missing_count=$((missing_count + 1))
|
||||
fi
|
||||
done
|
||||
|
||||
[ "$missing_count" -eq 0 ]
|
||||
}
|
||||
|
||||
OVERRIDE_ACTIVE="NO"
|
||||
if [ -n "${MARTE_BENCHMARK_SUITE_ROOT:-}" ]; then
|
||||
if [ "${S03H3_TEST_ONLY_OVERRIDE:-NO}" != "$TEST_OVERRIDE_ACK_VALUE" ]; then
|
||||
fatal_wrapper_error 70 "FAIL_TEST_OVERRIDE_NOT_ACKNOWLEDGED" \
|
||||
"MARTE_BENCHMARK_SUITE_ROOT richiede S03H3_TEST_ONLY_OVERRIDE=YES"
|
||||
fi
|
||||
if [[ "$MARTE_BENCHMARK_SUITE_ROOT" != /* ]]; then
|
||||
fatal_wrapper_error 70 "FAIL_TEST_OVERRIDE_NOT_ABSOLUTE" \
|
||||
"la radice di override deve essere un percorso assoluto"
|
||||
fi
|
||||
if [ ! -d "$MARTE_BENCHMARK_SUITE_ROOT" ]; then
|
||||
fatal_wrapper_error 70 "FAIL_TEST_OVERRIDE_ROOT" \
|
||||
"la radice di override non esiste"
|
||||
fi
|
||||
|
||||
SUITE="$(cd -- "$MARTE_BENCHMARK_SUITE_ROOT" && pwd -P)"
|
||||
if [ -z "$SUITE" ] || [ "$SUITE" = "/" ]; then
|
||||
fatal_wrapper_error 70 "FAIL_TEST_OVERRIDE_ROOT" \
|
||||
"la radice di override non e sicura"
|
||||
fi
|
||||
OVERRIDE_ACTIVE="YES"
|
||||
|
||||
if ! verify_complete_override_root; then
|
||||
fatal_wrapper_error 70 "FAIL_INCOMPLETE_TEST_SUITE" \
|
||||
"l'override e ammesso soltanto per una suite completa di 27 elementi"
|
||||
fi
|
||||
elif [ "${S03H3_TEST_ONLY_OVERRIDE:-NO}" = "$TEST_OVERRIDE_ACK_VALUE" ]; then
|
||||
fatal_wrapper_error 70 "FAIL_TEST_OVERRIDE_ROOT_MISSING" \
|
||||
"S03H3_TEST_ONLY_OVERRIDE=YES richiede MARTE_BENCHMARK_SUITE_ROOT"
|
||||
else
|
||||
SUITE="$INSTALLED_SUITE"
|
||||
fi
|
||||
|
||||
readonly SUITE
|
||||
readonly OVERRIDE_ACTIVE
|
||||
|
||||
STANDARD_LAUNCHER="$SUITE/launcher/marte_benchmark_launcher.sh"
|
||||
S03H3_LAUNCHER="$SUITE/launcher/marte_benchmark_launcher_s03h3.sh"
|
||||
readonly STANDARD_LAUNCHER
|
||||
readonly S03H3_LAUNCHER
|
||||
|
||||
if [ ! -x "$STANDARD_LAUNCHER" ]; then
|
||||
fatal_wrapper_error 70 "FAIL_REQUIRED_LAUNCHER" \
|
||||
"launcher standard assente o non eseguibile: $STANDARD_LAUNCHER"
|
||||
fi
|
||||
if [ ! -x "$S03H3_LAUNCHER" ]; then
|
||||
fatal_wrapper_error 70 "FAIL_REQUIRED_LAUNCHER" \
|
||||
"launcher S03-H3 assente o non eseguibile: $S03H3_LAUNCHER"
|
||||
fi
|
||||
|
||||
export MARTE_BENCHMARK_SUITE_ROOT="$SUITE"
|
||||
|
||||
is_positive_decimal() {
|
||||
local value="$1"
|
||||
|
||||
[[ "$value" =~ ^[0-9]+$ ]] && [[ "$value" =~ [1-9] ]]
|
||||
}
|
||||
|
||||
normalize_decimal() {
|
||||
local value="$1"
|
||||
|
||||
while [ "${#value}" -gt 1 ] && [ "${value:0:1}" = "0" ]; do
|
||||
value="${value#0}"
|
||||
done
|
||||
printf '%s' "$value"
|
||||
}
|
||||
|
||||
print_main_menu() {
|
||||
printf '\n============================================================\n'
|
||||
printf 'MARTe2 Benchmark Suite — menu S03-H3\n'
|
||||
printf '============================================================\n'
|
||||
printf '1) S01\n'
|
||||
printf '2) S02\n'
|
||||
printf '3) S03\n'
|
||||
printf '4) S03-H3\n'
|
||||
printf '0) Exit\n'
|
||||
printf 'Selection: '
|
||||
}
|
||||
|
||||
read_duration() {
|
||||
local value
|
||||
|
||||
printf 'Simulation duration [seconds] (default: %s): ' \
|
||||
"$DEFAULT_DURATION_SECONDS"
|
||||
if ! IFS= read -r value; then
|
||||
return 1
|
||||
fi
|
||||
if [ -z "$value" ]; then
|
||||
SELECTED_DURATION="$DEFAULT_DURATION_SECONDS"
|
||||
return 0
|
||||
fi
|
||||
if ! is_positive_decimal "$value"; then
|
||||
printf 'Durata non valida: usare solo un intero decimale positivo.\n' >&2
|
||||
printf 'LAUNCHER_EXECUTED=NO\n'
|
||||
return 2
|
||||
fi
|
||||
|
||||
SELECTED_DURATION="$(normalize_decimal "$value")"
|
||||
return 0
|
||||
}
|
||||
|
||||
read_s03h3_profile() {
|
||||
local value
|
||||
|
||||
printf '1) MINIMAL\n'
|
||||
printf '2) TEST\n'
|
||||
printf '3) DIAGNOSTIC\n'
|
||||
printf 'Profile: '
|
||||
if ! IFS= read -r value; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
case "$value" in
|
||||
1)
|
||||
SELECTED_PROFILE="MINIMAL"
|
||||
;;
|
||||
2)
|
||||
SELECTED_PROFILE="TEST"
|
||||
;;
|
||||
3)
|
||||
SELECTED_PROFILE="DIAGNOSTIC"
|
||||
;;
|
||||
*)
|
||||
printf 'Profilo non valido. Nessun launcher eseguito.\n' >&2
|
||||
printf 'LAUNCHER_EXECUTED=NO\n'
|
||||
return 2
|
||||
;;
|
||||
esac
|
||||
return 0
|
||||
}
|
||||
|
||||
confirm_execution() {
|
||||
local answer
|
||||
|
||||
printf '\nScenario: %s\n' "$DISPLAY_SCENARIO"
|
||||
printf 'Profile: %s\n' "$SELECTED_PROFILE"
|
||||
printf 'Duration: %s s\n\n' "$SELECTED_DURATION"
|
||||
printf 'Start execution? [y/N]: '
|
||||
if ! IFS= read -r answer; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
case "$answer" in
|
||||
y|Y)
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
printf 'Esecuzione annullata.\n'
|
||||
printf 'LAUNCHER_EXECUTED=NO\n'
|
||||
return 2
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
delegate_launcher() {
|
||||
case "$SELECTED_SCENARIO" in
|
||||
S01)
|
||||
"$STANDARD_LAUNCHER" S01 "$SELECTED_DURATION"
|
||||
;;
|
||||
S02)
|
||||
"$STANDARD_LAUNCHER" S02 "$SELECTED_DURATION"
|
||||
;;
|
||||
S03)
|
||||
"$STANDARD_LAUNCHER" S03 "$SELECTED_DURATION"
|
||||
;;
|
||||
S03H3)
|
||||
"$S03H3_LAUNCHER" S03H3 "$SELECTED_DURATION" "$SELECTED_PROFILE"
|
||||
;;
|
||||
*)
|
||||
return 125
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
read_recorded_status() {
|
||||
local status_file="$1"
|
||||
local fallback="$2"
|
||||
local value=""
|
||||
|
||||
if [ -s "$status_file" ]; then
|
||||
IFS= read -r value <"$status_file" || value=""
|
||||
fi
|
||||
if [[ "$value" =~ ^[0-9]+$ ]]; then
|
||||
printf '%s' "$value"
|
||||
else
|
||||
printf '%s' "$fallback"
|
||||
fi
|
||||
}
|
||||
|
||||
observe_run_dir() {
|
||||
local observed=""
|
||||
local observed_resolved=""
|
||||
local observed_parent=""
|
||||
local observed_name=""
|
||||
|
||||
observed="$(sed -n 's/^RUN_DIR=//p' "$CAPTURE" | tail -n 1)"
|
||||
if [ -z "$observed" ]; then
|
||||
LAST_RUN_DIR="NOT_AVAILABLE"
|
||||
LAST_RUN_DIR_STATUS="NOT_AVAILABLE"
|
||||
elif [[ "$observed" != /* ]]; then
|
||||
LAST_RUN_DIR="$observed"
|
||||
LAST_RUN_DIR_STATUS="REPORTED_BUT_INVALID"
|
||||
elif [ ! -d "$observed" ]; then
|
||||
LAST_RUN_DIR="$observed"
|
||||
LAST_RUN_DIR_STATUS="REPORTED_BUT_NOT_FOUND"
|
||||
elif [ "$SELECTED_SCENARIO" = "S03H3" ]; then
|
||||
observed_resolved="$(cd -- "$observed" && pwd -P)" || observed_resolved=""
|
||||
observed_parent="$(dirname -- "$observed_resolved")"
|
||||
observed_name="$(basename -- "$observed_resolved")"
|
||||
if [ "$observed_parent" = "$SUITE/runs" ] &&
|
||||
[[ "$observed_name" = *_S03H3_${SELECTED_PROFILE}_launcher ]]; then
|
||||
LAST_RUN_DIR="$observed_resolved"
|
||||
LAST_RUN_DIR_STATUS="FOUND"
|
||||
else
|
||||
LAST_RUN_DIR="$observed"
|
||||
LAST_RUN_DIR_STATUS="REPORTED_BUT_INVALID"
|
||||
fi
|
||||
else
|
||||
LAST_RUN_DIR="$observed"
|
||||
LAST_RUN_DIR_STATUS="FOUND"
|
||||
fi
|
||||
}
|
||||
|
||||
print_execution_summary() {
|
||||
printf '\n============================================================\n'
|
||||
printf 'Riepilogo esecuzione S03-H3\n'
|
||||
printf '============================================================\n'
|
||||
printf 'Scenario: %s\n' "$DISPLAY_SCENARIO"
|
||||
printf 'Profile: %s\n' "$SELECTED_PROFILE"
|
||||
printf 'Duration: %s s\n' "$SELECTED_DURATION"
|
||||
printf 'Launcher RC: %s\n' "$LAST_LAUNCHER_RC"
|
||||
printf 'RUN_DIR: %s\n' "$LAST_RUN_DIR"
|
||||
printf 'RUN_DIR status: %s\n' "$LAST_RUN_DIR_STATUS"
|
||||
printf 'LAST_LAUNCHER_RC=%s\n' "$LAST_LAUNCHER_RC"
|
||||
printf 'RUN_DIR_STATUS=%s\n' "$LAST_RUN_DIR_STATUS"
|
||||
printf 'RUN_DIR=%s\n' "$LAST_RUN_DIR"
|
||||
printf 'MENU_RECLASSIFIES_LAUNCHER_RESULT=NO\n'
|
||||
}
|
||||
|
||||
invoke_selected_launcher() {
|
||||
local -a pipeline_status
|
||||
local launcher_rc
|
||||
local tee_rc
|
||||
|
||||
cleanup_temporary_files
|
||||
CAPTURE="$(mktemp "${TMPDIR:-/tmp}/marte_benchmark_menu.capture.XXXXXX")" ||
|
||||
fatal_wrapper_error 71 "FAIL_CAPTURE_CREATION" \
|
||||
"impossibile creare il file temporaneo di cattura"
|
||||
STATUS_DIR="$(mktemp -d "${TMPDIR:-/tmp}/marte_benchmark_menu.status.XXXXXX")" || {
|
||||
cleanup_temporary_files
|
||||
fatal_wrapper_error 71 "FAIL_CAPTURE_CREATION" \
|
||||
"impossibile creare lo stato temporaneo della cattura"
|
||||
}
|
||||
|
||||
INTERRUPT_PENDING="NO"
|
||||
LAUNCH_ACTIVE="YES"
|
||||
(
|
||||
delegate_launcher
|
||||
launcher_rc=$?
|
||||
printf '%s\n' "$launcher_rc" >"$STATUS_DIR/launcher_rc"
|
||||
exit "$launcher_rc"
|
||||
) 2>&1 | (
|
||||
tee "$CAPTURE"
|
||||
tee_rc=$?
|
||||
printf '%s\n' "$tee_rc" >"$STATUS_DIR/tee_rc"
|
||||
exit "$tee_rc"
|
||||
)
|
||||
pipeline_status=("${PIPESTATUS[@]}")
|
||||
LAUNCH_ACTIVE="NO"
|
||||
|
||||
launcher_rc="$(read_recorded_status \
|
||||
"$STATUS_DIR/launcher_rc" "${pipeline_status[0]:-125}")"
|
||||
tee_rc="$(read_recorded_status \
|
||||
"$STATUS_DIR/tee_rc" "${pipeline_status[1]:-125}")"
|
||||
LAST_LAUNCHER_RC="$launcher_rc"
|
||||
observe_run_dir
|
||||
print_execution_summary
|
||||
|
||||
if [ "$INTERRUPT_PENDING" = "YES" ]; then
|
||||
printf 'S03_H3_MENU_LIFECYCLE_STATUS=INTERRUPTED\n' >&2
|
||||
printf 'LAUNCHER_RC_RECLASSIFIED=NO\n' >&2
|
||||
cleanup_temporary_files
|
||||
exit 130
|
||||
fi
|
||||
|
||||
if [ "$tee_rc" -ne 0 ]; then
|
||||
printf 'CAPTURE_TEE_STATUS=FAIL\n' >&2
|
||||
printf 'CAPTURE_TEE_RC=%s\n' "$tee_rc" >&2
|
||||
printf 'S03_H3_MENU_LIFECYCLE_STATUS=FAIL_CAPTURE_TEE\n' >&2
|
||||
cleanup_temporary_files
|
||||
exit 72
|
||||
fi
|
||||
|
||||
printf 'CAPTURE_TEE_STATUS=PASS\n'
|
||||
printf 'S03_H3_MENU_LIFECYCLE_STATUS=CONTINUE\n'
|
||||
cleanup_temporary_files
|
||||
}
|
||||
|
||||
printf 'S03_H3_STARTUP_STATUS=PASS\n'
|
||||
printf 'S03_H3_SUITE_ROOT=%s\n' "$SUITE"
|
||||
printf 'S03_H3_TEST_OVERRIDE_ACTIVE=%s\n' "$OVERRIDE_ACTIVE"
|
||||
|
||||
while true; do
|
||||
print_main_menu
|
||||
if ! IFS= read -r menu_choice; then
|
||||
printf '\nEOF: uscita pulita dal menu.\n'
|
||||
printf 'S03_H3_MENU_LIFECYCLE_STATUS=EXIT_EOF\n'
|
||||
exit 0
|
||||
fi
|
||||
|
||||
SELECTED_PROFILE="N/A"
|
||||
case "$menu_choice" in
|
||||
0)
|
||||
printf 'Uscita dal menu S03-H3.\n'
|
||||
printf 'S03_H3_MENU_LIFECYCLE_STATUS=EXIT_USER\n'
|
||||
exit 0
|
||||
;;
|
||||
1)
|
||||
SELECTED_SCENARIO="S01"
|
||||
DISPLAY_SCENARIO="S01"
|
||||
;;
|
||||
2)
|
||||
SELECTED_SCENARIO="S02"
|
||||
DISPLAY_SCENARIO="S02"
|
||||
;;
|
||||
3)
|
||||
SELECTED_SCENARIO="S03"
|
||||
DISPLAY_SCENARIO="S03"
|
||||
;;
|
||||
4)
|
||||
SELECTED_SCENARIO="S03H3"
|
||||
DISPLAY_SCENARIO="S03-H3"
|
||||
;;
|
||||
*)
|
||||
printf 'Selezione non valida. Nessun launcher eseguito.\n' >&2
|
||||
printf 'LAUNCHER_EXECUTED=NO\n'
|
||||
continue
|
||||
;;
|
||||
esac
|
||||
|
||||
read_duration
|
||||
duration_status=$?
|
||||
if [ "$duration_status" -eq 1 ]; then
|
||||
printf '\nEOF prima dell esecuzione: azione annullata.\n'
|
||||
printf 'LAUNCHER_EXECUTED=NO\n'
|
||||
printf 'S03_H3_MENU_LIFECYCLE_STATUS=EXIT_EOF\n'
|
||||
exit 0
|
||||
elif [ "$duration_status" -ne 0 ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
if [ "$SELECTED_SCENARIO" = "S03H3" ]; then
|
||||
read_s03h3_profile
|
||||
profile_status=$?
|
||||
if [ "$profile_status" -eq 1 ]; then
|
||||
printf '\nEOF prima dell esecuzione: azione annullata.\n'
|
||||
printf 'LAUNCHER_EXECUTED=NO\n'
|
||||
printf 'S03_H3_MENU_LIFECYCLE_STATUS=EXIT_EOF\n'
|
||||
exit 0
|
||||
elif [ "$profile_status" -ne 0 ]; then
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
|
||||
confirm_execution
|
||||
confirmation_status=$?
|
||||
if [ "$confirmation_status" -eq 1 ]; then
|
||||
printf '\nEOF prima della conferma: azione annullata.\n'
|
||||
printf 'LAUNCHER_EXECUTED=NO\n'
|
||||
printf 'S03_H3_MENU_LIFECYCLE_STATUS=EXIT_EOF\n'
|
||||
exit 0
|
||||
elif [ "$confirmation_status" -ne 0 ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
printf 'LAUNCHER_EXECUTED=YES\n'
|
||||
invoke_selected_launcher
|
||||
done
|
||||
Reference in New Issue
Block a user