#!/bin/bash # checkSuccess "message" — report on the exit status of the PRECEDING command. # # IMPORTANT for callers: $? must still be the command's exit when this is called. # `local VAR=$(cmd); checkSuccess ...` is a BUG — the `local`/`declare` builtin # resets $? to 0, masking the command's real failure. Use `local VAR; VAR=$(cmd)` # (split declaration from assignment) so $? survives. # # On failure this ALWAYS records the failure to a greppable error report # ($logs_dir/error_report.log) with the caller's script:line + exit code, so a # failure can never hide behind a green check again. Then it either continues # (CFG_REQUIREMENT_CONTINUE_ON_ERROR=true, the default — surface every issue in a # single pass) or falls back to the strict abort/prompt behaviour when that's off. function checkSuccess() { local rc=$? local msg="$1" if [ "$rc" -eq 0 ]; then isSuccessful "$msg" if [ -f "$logs_dir/$docker_log_file" ]; then echo "✓ Success $msg" | runInstallWrite -a "$logs_dir/$docker_log_file" >/dev/null fi return 0 fi # ---- failure ---- isError "$msg" # Record EVERY failure to a dedicated, greppable report (manager-owned logs), # tagged with the caller's script:line + exit code. Best-effort; never aborts. local _where="${BASH_SOURCE[1]##*/}:${BASH_LINENO[0]}" local _stamp; _stamp="$(date '+%F %T' 2>/dev/null || echo now)" printf '%s\t[exit %s]\t%s\t(%s)\n' "$_stamp" "$rc" "$msg" "$_where" \ | runInstallWrite -a "$logs_dir/error_report.log" 2>/dev/null || true if [ -f "$logs_dir/$docker_log_file" ]; then isError " $msg (exit $rc, $_where)" | runInstallWrite -a "$logs_dir/$docker_log_file" >/dev/null 2>&1 || true fi # Continue-on-error (default true): log and carry on so a single failure # doesn't abort the whole run and we surface EVERY issue in one pass. Turn # CFG_REQUIREMENT_CONTINUE_ON_ERROR off for strict abort once things are clean. if [[ "${CFG_REQUIREMENT_CONTINUE_ON_ERROR:-true}" == "true" ]]; then isNotice "continue-on-error: logged to $logs_dir/error_report.log — continuing." return 0 fi # ---- strict mode (continue-on-error off) ---- # Non-interactive (task processor / cron / piped): bail instead of blocking. if [[ "$LIBREPORTAL_NONINTERACTIVE" == "1" ]] || [ ! -t 0 ]; then isNotice "Non-interactive mode: aborting on error." exit 1 fi while true; do isQuestion "An error has occurred. Do you want to continue, exit or go to back to the Menu? (c/x/m) " read -rp "" error_occurred [[ -n "$error_occurred" ]] && break isNotice "Please provide a valid input." done [[ "$error_occurred" == [cC] ]] && isNotice "Continuing after error has occurred." [[ "$error_occurred" == [xX] ]] && exit 1 if [[ "$error_occurred" == [mM] && "$initial_command2" == "terminal" ]]; then resetToMenu fi }