diff --git a/misc/api.func b/misc/api.func index aedbf93ae..a2cc42e07 100644 --- a/misc/api.func +++ b/misc/api.func @@ -350,6 +350,55 @@ get_error_text() { fi } +# ------------------------------------------------------------------------------ +# get_full_log() +# +# - Returns the FULL installation log (build + install combined) +# - Calls ensure_log_on_host() to pull container log if needed +# - Strips ANSI escape codes and carriage returns +# - Truncates to max_bytes (default: 120KB) to stay within API limits +# - Used for the error telemetry field (full trace instead of 20 lines) +# ------------------------------------------------------------------------------ +get_full_log() { + local max_bytes="${1:-122880}" # 120KB default + local logfile="" + + # Ensure logs are available on host (pulls from container if needed) + if declare -f ensure_log_on_host >/dev/null 2>&1; then + ensure_log_on_host + fi + + # Try combined log first (most complete) + if [[ -n "${CTID:-}" && -n "${SESSION_ID:-}" ]]; then + local combined_log="/tmp/${NSAPP:-lxc}-${CTID}-${SESSION_ID}.log" + if [[ -s "$combined_log" ]]; then + logfile="$combined_log" + fi + fi + + # Fall back to INSTALL_LOG + if [[ -z "$logfile" || ! -s "$logfile" ]]; then + if [[ -n "${INSTALL_LOG:-}" && -s "${INSTALL_LOG}" ]]; then + logfile="$INSTALL_LOG" + fi + fi + + # Fall back to BUILD_LOG + if [[ -z "$logfile" || ! -s "$logfile" ]]; then + if [[ -n "${BUILD_LOG:-}" && -s "${BUILD_LOG}" ]]; then + logfile="$BUILD_LOG" + fi + fi + + if [[ -n "$logfile" && -s "$logfile" ]]; then + # Strip ANSI codes, carriage returns, and anonymize IP addresses (GDPR) + sed 's/\r$//' "$logfile" 2>/dev/null | + sed 's/\x1b\[[0-9;]*[a-zA-Z]//g' | + sed -E 's/([0-9]{1,3}\.)[0-9]{1,3}\.[0-9]{1,3}/\1x.x/g' | + head -c "$max_bytes" + fi +} + # ------------------------------------------------------------------------------ # build_error_string() # @@ -782,11 +831,15 @@ post_update_to_api() { else exit_code=1 fi - # Get log lines and build structured error string - local error_text="" - error_text=$(get_error_text) + # Get full installation log for error field + local log_text="" + log_text=$(get_full_log 122880) || true # 120KB max + if [[ -z "$log_text" ]]; then + # Fallback to last 20 lines + log_text=$(get_error_text) + fi local full_error - full_error=$(build_error_string "$exit_code" "$error_text") + full_error=$(build_error_string "$exit_code" "$log_text") error=$(json_escape "$full_error") short_error=$(json_escape "$(explain_exit_code "$exit_code")") error_category=$(categorize_error "$exit_code") @@ -807,7 +860,7 @@ post_update_to_api() { local http_code="" - # ── Attempt 1: Full payload with complete error text ── + # ── Attempt 1: Full payload with complete error text (includes full log) ── local JSON_PAYLOAD JSON_PAYLOAD=$( cat </dev/null || true - # Best-effort log collection with timeout (non-critical after telemetry is sent) + # Best-effort log collection (non-critical after telemetry is sent) if declare -f ensure_log_on_host >/dev/null 2>&1; then - timeout 10 bash -c 'ensure_log_on_host' 2>/dev/null || true + ensure_log_on_host 2>/dev/null || true + fi + # Stop orphaned container if we're in the install phase + if [[ "${CONTAINER_INSTALLING:-}" == "true" && -n "${CTID:-}" ]] && command -v pct &>/dev/null; then + pct stop "$CTID" 2>/dev/null || true fi elif [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then # Script exited with 0 but never sent a completion status @@ -5580,7 +5591,7 @@ api_exit_script() { if command -v pveversion >/dev/null 2>&1; then trap 'api_exit_script' EXIT fi -trap 'local _ec=$?; if [[ $_ec -ne 0 ]]; then post_update_to_api "failed" "$_ec" 2>/dev/null || true; timeout 10 bash -c "ensure_log_on_host" 2>/dev/null || true; fi' ERR -trap 'post_update_to_api "failed" "129" 2>/dev/null || true; timeout 10 bash -c "ensure_log_on_host" 2>/dev/null || true; exit 129' SIGHUP -trap 'post_update_to_api "failed" "130" 2>/dev/null || true; timeout 10 bash -c "ensure_log_on_host" 2>/dev/null || true; exit 130' SIGINT -trap 'post_update_to_api "failed" "143" 2>/dev/null || true; timeout 10 bash -c "ensure_log_on_host" 2>/dev/null || true; exit 143' SIGTERM +trap 'local _ec=$?; if [[ $_ec -ne 0 ]]; then post_update_to_api "failed" "$_ec" 2>/dev/null || true; if declare -f ensure_log_on_host &>/dev/null; then ensure_log_on_host 2>/dev/null || true; fi; fi' ERR +trap 'post_update_to_api "failed" "129" 2>/dev/null || true; if [[ -n "${CTID:-}" ]] && command -v pct &>/dev/null; then pct stop "$CTID" 2>/dev/null || true; fi; exit 129' SIGHUP +trap 'post_update_to_api "failed" "130" 2>/dev/null || true; if [[ -n "${CTID:-}" ]] && command -v pct &>/dev/null; then pct stop "$CTID" 2>/dev/null || true; fi; exit 130' SIGINT +trap 'post_update_to_api "failed" "143" 2>/dev/null || true; if [[ -n "${CTID:-}" ]] && command -v pct &>/dev/null; then pct stop "$CTID" 2>/dev/null || true; fi; exit 143' SIGTERM diff --git a/misc/error_handler.func b/misc/error_handler.func index 4b586e085..cea4639a1 100644 --- a/misc/error_handler.func +++ b/misc/error_handler.func @@ -208,6 +208,10 @@ error_handler() { # This ensures we capture failures that occur before/after container exists if declare -f post_update_to_api &>/dev/null; then post_update_to_api "failed" "$exit_code" 2>/dev/null || true + else + # Container context: post_update_to_api not available (api.func not sourced) + # Send status directly via curl so container failures are never lost + _send_abort_telemetry "$exit_code" 2>/dev/null || true fi # Use msg_error if available, fallback to echo @@ -329,40 +333,97 @@ error_handler() { } # ============================================================================== -# SECTION 3: SIGNAL HANDLERS +# SECTION 3: TELEMETRY & CLEANUP HELPERS FOR SIGNAL HANDLERS +# ============================================================================== + +# ------------------------------------------------------------------------------ +# _send_abort_telemetry() +# +# - Sends failure/abort status to telemetry API +# - Works in BOTH host context (post_update_to_api available) and +# container context (only curl available, api.func not sourced) +# - Container context is critical: without this, container-side failures +# and signal exits are never reported, leaving records stuck in +# "installing" or "configuring" forever +# - Arguments: $1 = exit_code +# ------------------------------------------------------------------------------ +_send_abort_telemetry() { + local exit_code="${1:-1}" + # Try full API function first (host context - api.func sourced) + if declare -f post_update_to_api &>/dev/null; then + post_update_to_api "failed" "$exit_code" 2>/dev/null || true + return + fi + # Fallback: direct curl (container context - api.func NOT sourced) + # This is the ONLY way containers can report failures to telemetry + command -v curl &>/dev/null || return 0 + [[ "${DIAGNOSTICS:-no}" == "no" ]] && return 0 + [[ -z "${RANDOM_UUID:-}" ]] && return 0 + curl -fsS -m 5 -X POST "${TELEMETRY_URL:-https://telemetry.community-scripts.org/telemetry}" \ + -H "Content-Type: application/json" \ + -d "{\"random_id\":\"${RANDOM_UUID}\",\"execution_id\":\"${EXECUTION_ID:-${RANDOM_UUID}}\",\"type\":\"${TELEMETRY_TYPE:-lxc}\",\"nsapp\":\"${NSAPP:-${app:-unknown}}\",\"status\":\"failed\",\"exit_code\":${exit_code}}" &>/dev/null || true +} + +# ------------------------------------------------------------------------------ +# _stop_container_if_installing() +# +# - Stops the LXC container if we're in the install phase +# - Prevents orphaned container processes when the host exits due to a signal +# (SSH disconnect, Ctrl+C, SIGTERM) — without this, the container keeps +# running and may send "configuring" status AFTER the host already sent +# "failed", leaving records permanently stuck in "configuring" +# - Only acts when: +# * CONTAINER_INSTALLING flag is set (during lxc-attach in build_container) +# * CTID is set (container was created) +# * pct command is available (we're on the Proxmox host, not inside a container) +# - Does NOT destroy the container — just stops it for potential debugging +# ------------------------------------------------------------------------------ +_stop_container_if_installing() { + [[ "${CONTAINER_INSTALLING:-}" == "true" ]] || return 0 + [[ -n "${CTID:-}" ]] || return 0 + command -v pct &>/dev/null || return 0 + pct stop "$CTID" 2>/dev/null || true +} + +# ============================================================================== +# SECTION 4: SIGNAL HANDLERS # ============================================================================== # ------------------------------------------------------------------------------ # on_exit() # -# - EXIT trap handler -# - Cleans up lock files if lockfile variable is set -# - Exits with captured exit code -# - Always runs on script termination (success or failure) -# - For signal exits (>128): sends telemetry FIRST before log collection -# to prevent pct pull hangs from blocking status updates +# - EXIT trap handler — runs on EVERY script termination +# - Catches orphaned "installing"/"configuring" records: +# * If post_to_api sent "installing" but post_update_to_api never ran +# * Reports final status to prevent records stuck forever +# - Best-effort log collection for failed installs +# - Stops orphaned container processes on failure +# - Cleans up lock files # ------------------------------------------------------------------------------ on_exit() { local exit_code=$? + # Report orphaned "installing" records to telemetry API - # Catches ALL exit paths: errors (non-zero), signals, AND clean exits where - # post_to_api was called ("installing" sent) but post_update_to_api was never called + # Catches ALL exit paths: errors, signals, AND clean exits where + # post_to_api was called but post_update_to_api was never called if [[ "${POST_TO_API_DONE:-}" == "true" && "${POST_UPDATE_DONE:-}" != "true" ]]; then - if declare -f post_update_to_api >/dev/null 2>&1; then - # ALWAYS send telemetry FIRST - ensure status is reported even if - # ensure_log_on_host hangs (e.g. pct pull on dead/unresponsive container) - if [[ $exit_code -ne 0 ]]; then - post_update_to_api "failed" "$exit_code" 2>/dev/null || true - else - # exit_code=0 is never an error — report as success - post_update_to_api "done" "0" 2>/dev/null || true - fi - # Best-effort log collection with timeout (non-critical after telemetry is sent) - if declare -f ensure_log_on_host >/dev/null 2>&1; then - timeout 10 bash -c 'ensure_log_on_host' 2>/dev/null || true - fi + if [[ $exit_code -ne 0 ]]; then + _send_abort_telemetry "$exit_code" + elif declare -f post_update_to_api >/dev/null 2>&1; then + post_update_to_api "done" "0" 2>/dev/null || true fi fi + + # Best-effort log collection on failure (non-critical, telemetry already sent) + if [[ $exit_code -ne 0 ]] && declare -f ensure_log_on_host >/dev/null 2>&1; then + ensure_log_on_host 2>/dev/null || true + fi + + # Stop orphaned container if we're in the install phase and exiting with error + if [[ $exit_code -ne 0 ]]; then + _stop_container_if_installing + fi + [[ -n "${lockfile:-}" && -e "$lockfile" ]] && rm -f "$lockfile" exit "$exit_code" } @@ -371,22 +432,13 @@ on_exit() { # on_interrupt() # # - SIGINT (Ctrl+C) trap handler -# - Reports to telemetry FIRST (time-critical: container may be dying) -# - Displays "Interrupted by user" message +# - Reports status FIRST (time-critical: container may be dying) +# - Stops orphaned container to prevent "configuring" ghost records # - Exits with code 130 (128 + SIGINT=2) -# - Output redirected to /dev/null fallback to prevent SIGPIPE on closed terminals # ------------------------------------------------------------------------------ on_interrupt() { - # CRITICAL: Send telemetry FIRST before any cleanup or output - # If ensure_log_on_host hangs (e.g. pct pull on dying container), - # the status update would never be sent, leaving records stuck in "installing" - if declare -f post_update_to_api >/dev/null 2>&1; then - post_update_to_api "failed" "130" 2>/dev/null || true - fi - # Best-effort log collection with timeout (non-critical after telemetry is sent) - if declare -f ensure_log_on_host >/dev/null 2>&1; then - timeout 10 bash -c 'ensure_log_on_host' 2>/dev/null || true - fi + _send_abort_telemetry "130" + _stop_container_if_installing if declare -f msg_error >/dev/null 2>&1; then msg_error "Interrupted by user (SIGINT)" 2>/dev/null || true else @@ -399,23 +451,13 @@ on_interrupt() { # on_terminate() # # - SIGTERM trap handler -# - Reports to telemetry FIRST (time-critical: process being killed) -# - Displays "Terminated by signal" message +# - Reports status FIRST (time-critical: process being killed) +# - Stops orphaned container to prevent "configuring" ghost records # - Exits with code 143 (128 + SIGTERM=15) -# - Triggered by external process termination -# - Output redirected to /dev/null fallback to prevent SIGPIPE on closed terminals # ------------------------------------------------------------------------------ on_terminate() { - # CRITICAL: Send telemetry FIRST before any cleanup or output - # Same rationale as on_interrupt: ensure status gets reported even if - # ensure_log_on_host hangs or terminal is already closed - if declare -f post_update_to_api >/dev/null 2>&1; then - post_update_to_api "failed" "143" 2>/dev/null || true - fi - # Best-effort log collection with timeout (non-critical after telemetry is sent) - if declare -f ensure_log_on_host >/dev/null 2>&1; then - timeout 10 bash -c 'ensure_log_on_host' 2>/dev/null || true - fi + _send_abort_telemetry "143" + _stop_container_if_installing if declare -f msg_error >/dev/null 2>&1; then msg_error "Terminated by signal (SIGTERM)" 2>/dev/null || true else @@ -424,8 +466,25 @@ on_terminate() { exit 143 } +# ------------------------------------------------------------------------------ +# on_hangup() +# +# - SIGHUP trap handler (SSH disconnect, terminal closed) +# - CRITICAL: This was previously MISSING from catch_errors(), causing +# container processes to become orphans on SSH disconnect — the #1 cause +# of records stuck in "installing" and "configuring" states +# - Reports status via direct curl (terminal is already closed, no output) +# - Stops orphaned container to prevent ghost records +# - Exits with code 129 (128 + SIGHUP=1) +# ------------------------------------------------------------------------------ +on_hangup() { + _send_abort_telemetry "129" + _stop_container_if_installing + exit 129 +} + # ============================================================================== -# SECTION 4: INITIALIZATION +# SECTION 5: INITIALIZATION # ============================================================================== # ------------------------------------------------------------------------------ @@ -437,10 +496,11 @@ on_terminate() { # * set -o pipefail: Pipeline fails if any command fails # * set -u: (optional) Exit on undefined variable (if STRICT_UNSET=1) # - Sets up traps: -# * ERR → error_handler -# * EXIT → on_exit -# * INT → on_interrupt -# * TERM → on_terminate +# * ERR → error_handler (script errors) +# * EXIT → on_exit (any termination — cleanup + orphan detection) +# * INT → on_interrupt (Ctrl+C) +# * TERM → on_terminate (kill / systemd stop) +# * HUP → on_hangup (SSH disconnect / terminal closed) # - Call this function early in every script # ------------------------------------------------------------------------------ catch_errors() { @@ -453,4 +513,5 @@ catch_errors() { trap on_exit EXIT trap on_interrupt INT trap on_terminate TERM + trap on_hangup HUP } diff --git a/vm/archlinux-vm.sh b/vm/archlinux-vm.sh index 8eb0e15ab..f177536ad 100644 --- a/vm/archlinux-vm.sh +++ b/vm/archlinux-vm.sh @@ -63,8 +63,9 @@ THIN="discard=on,ssd=1," set -e trap 'error_handler $LINENO "$BASH_COMMAND"' ERR trap cleanup EXIT -trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT -trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM +trap 'post_update_to_api "failed" "130"' SIGINT +trap 'post_update_to_api "failed" "143"' SIGTERM +trap 'post_update_to_api "failed" "129"; exit 129' SIGHUP function error_handler() { local exit_code="$?" local line_number="$1" diff --git a/vm/debian-13-vm.sh b/vm/debian-13-vm.sh index 7be0c8cce..6c69aa555 100644 --- a/vm/debian-13-vm.sh +++ b/vm/debian-13-vm.sh @@ -63,8 +63,9 @@ THIN="discard=on,ssd=1," set -e trap 'error_handler $LINENO "$BASH_COMMAND"' ERR trap cleanup EXIT -trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT -trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM +trap 'post_update_to_api "failed" "130"' SIGINT +trap 'post_update_to_api "failed" "143"' SIGTERM +trap 'post_update_to_api "failed" "129"; exit 129' SIGHUP function error_handler() { local exit_code="$?" local line_number="$1" diff --git a/vm/debian-vm.sh b/vm/debian-vm.sh index 3fbac27ce..a916cdb7c 100644 --- a/vm/debian-vm.sh +++ b/vm/debian-vm.sh @@ -63,8 +63,9 @@ THIN="discard=on,ssd=1," set -e trap 'error_handler $LINENO "$BASH_COMMAND"' ERR trap cleanup EXIT -trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT -trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM +trap 'post_update_to_api "failed" "130"' SIGINT +trap 'post_update_to_api "failed" "143"' SIGTERM +trap 'post_update_to_api "failed" "129"; exit 129' SIGHUP function error_handler() { local exit_code="$?" local line_number="$1" diff --git a/vm/docker-vm.sh b/vm/docker-vm.sh index 63a9f289e..503925121 100644 --- a/vm/docker-vm.sh +++ b/vm/docker-vm.sh @@ -37,8 +37,9 @@ THIN="discard=on,ssd=1," set -e trap 'error_handler $LINENO "$BASH_COMMAND"' ERR trap cleanup EXIT -trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT -trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM +trap 'post_update_to_api "failed" "130"' SIGINT +trap 'post_update_to_api "failed" "143"' SIGTERM +trap 'post_update_to_api "failed" "129"; exit 129' SIGHUP function error_handler() { local exit_code="$?" diff --git a/vm/haos-vm.sh b/vm/haos-vm.sh index f4d2239c2..624458164 100644 --- a/vm/haos-vm.sh +++ b/vm/haos-vm.sh @@ -67,8 +67,9 @@ THIN="discard=on,ssd=1," set -e trap 'error_handler $LINENO "$BASH_COMMAND"' ERR trap cleanup EXIT -trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT -trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM +trap 'post_update_to_api "failed" "130"' SIGINT +trap 'post_update_to_api "failed" "143"' SIGTERM +trap 'post_update_to_api "failed" "129"; exit 129' SIGHUP function error_handler() { local exit_code="$?" local line_number="$1" diff --git a/vm/mikrotik-routeros.sh b/vm/mikrotik-routeros.sh index efaff65f9..c66ec5011 100644 --- a/vm/mikrotik-routeros.sh +++ b/vm/mikrotik-routeros.sh @@ -64,8 +64,9 @@ THIN="discard=on,ssd=1," set -e trap 'error_handler $LINENO "$BASH_COMMAND"' ERR trap cleanup EXIT -trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT -trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM +trap 'post_update_to_api "failed" "130"' SIGINT +trap 'post_update_to_api "failed" "143"' SIGTERM +trap 'post_update_to_api "failed" "129"; exit 129' SIGHUP function error_handler() { local exit_code="$?" local line_number="$1" diff --git a/vm/nextcloud-vm.sh b/vm/nextcloud-vm.sh index 7e4f1329d..32f2e90e3 100644 --- a/vm/nextcloud-vm.sh +++ b/vm/nextcloud-vm.sh @@ -63,8 +63,9 @@ THIN="discard=on,ssd=1," set -e trap 'error_handler $LINENO "$BASH_COMMAND"' ERR trap cleanup EXIT -trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT -trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM +trap 'post_update_to_api "failed" "130"' SIGINT +trap 'post_update_to_api "failed" "143"' SIGTERM +trap 'post_update_to_api "failed" "129"; exit 129' SIGHUP function error_handler() { local exit_code="$?" local line_number="$1" diff --git a/vm/openwrt-vm.sh b/vm/openwrt-vm.sh index b68dd5845..751635b2b 100644 --- a/vm/openwrt-vm.sh +++ b/vm/openwrt-vm.sh @@ -68,8 +68,9 @@ CLOUD="${TAB}☁️${TAB}${CL}" set -Eeo pipefail trap 'error_handler $LINENO "$BASH_COMMAND"' ERR trap cleanup EXIT -trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT -trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM +trap 'post_update_to_api "failed" "130"' SIGINT +trap 'post_update_to_api "failed" "143"' SIGTERM +trap 'post_update_to_api "failed" "129"; exit 129' SIGHUP function error_handler() { local exit_code="$?" local line_number="$1" diff --git a/vm/opnsense-vm.sh b/vm/opnsense-vm.sh index 47a161ce1..b1443be7e 100644 --- a/vm/opnsense-vm.sh +++ b/vm/opnsense-vm.sh @@ -44,6 +44,9 @@ CROSS="${RD}✗${CL}" set -Eeo pipefail trap 'error_handler $LINENO "$BASH_COMMAND"' ERR trap cleanup EXIT +trap 'post_update_to_api "failed" "130"' SIGINT +trap 'post_update_to_api "failed" "143"' SIGTERM +trap 'post_update_to_api "failed" "129"; exit 129' SIGHUP function error_handler() { local exit_code="$?" local line_number="$1" diff --git a/vm/owncloud-vm.sh b/vm/owncloud-vm.sh index 07cfddd15..fdc3a2dc8 100644 --- a/vm/owncloud-vm.sh +++ b/vm/owncloud-vm.sh @@ -64,8 +64,9 @@ THIN="discard=on,ssd=1," set -e trap 'error_handler $LINENO "$BASH_COMMAND"' ERR trap cleanup EXIT -trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT -trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM +trap 'post_update_to_api "failed" "130"' SIGINT +trap 'post_update_to_api "failed" "143"' SIGTERM +trap 'post_update_to_api "failed" "129"; exit 129' SIGHUP function error_handler() { local exit_code="$?" local line_number="$1" diff --git a/vm/pimox-haos-vm.sh b/vm/pimox-haos-vm.sh index 9d61ae08c..7f0f5e929 100644 --- a/vm/pimox-haos-vm.sh +++ b/vm/pimox-haos-vm.sh @@ -72,8 +72,9 @@ THIN="discard=on,ssd=1," set -e trap 'error_handler $LINENO "$BASH_COMMAND"' ERR trap cleanup EXIT -trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT -trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM +trap 'post_update_to_api "failed" "130"' SIGINT +trap 'post_update_to_api "failed" "143"' SIGTERM +trap 'post_update_to_api "failed" "129"; exit 129' SIGHUP function error_handler() { local exit_code="$?" local line_number="$1" diff --git a/vm/truenas-vm.sh b/vm/truenas-vm.sh index 35f560b3a..1437e6e8d 100644 --- a/vm/truenas-vm.sh +++ b/vm/truenas-vm.sh @@ -62,8 +62,9 @@ CLOUD="${TAB}☁️${TAB}${CL}" set -e trap 'error_handler $LINENO "$BASH_COMMAND"' ERR trap cleanup EXIT -trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT -trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM +trap 'post_update_to_api "failed" "130"' SIGINT +trap 'post_update_to_api "failed" "143"' SIGTERM +trap 'post_update_to_api "failed" "129"; exit 129' SIGHUP function error_handler() { local exit_code="$?" local line_number="$1" diff --git a/vm/ubuntu2204-vm.sh b/vm/ubuntu2204-vm.sh index dd9b2872a..953f6cbbd 100644 --- a/vm/ubuntu2204-vm.sh +++ b/vm/ubuntu2204-vm.sh @@ -60,8 +60,9 @@ THIN="discard=on,ssd=1," set -e trap 'error_handler $LINENO "$BASH_COMMAND"' ERR trap cleanup EXIT -trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT -trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM +trap 'post_update_to_api "failed" "130"' SIGINT +trap 'post_update_to_api "failed" "143"' SIGTERM +trap 'post_update_to_api "failed" "129"; exit 129' SIGHUP function error_handler() { local exit_code="$?" local line_number="$1" diff --git a/vm/ubuntu2404-vm.sh b/vm/ubuntu2404-vm.sh index 67f7a3bd2..7c5d010c1 100644 --- a/vm/ubuntu2404-vm.sh +++ b/vm/ubuntu2404-vm.sh @@ -63,8 +63,9 @@ THIN="discard=on,ssd=1," set -e trap 'error_handler $LINENO "$BASH_COMMAND"' ERR trap cleanup EXIT -trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT -trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM +trap 'post_update_to_api "failed" "130"' SIGINT +trap 'post_update_to_api "failed" "143"' SIGTERM +trap 'post_update_to_api "failed" "129"; exit 129' SIGHUP function error_handler() { local exit_code="$?" local line_number="$1" diff --git a/vm/ubuntu2504-vm.sh b/vm/ubuntu2504-vm.sh index a285f7218..4bbe513ec 100644 --- a/vm/ubuntu2504-vm.sh +++ b/vm/ubuntu2504-vm.sh @@ -62,8 +62,9 @@ THIN="discard=on,ssd=1," set -e trap 'error_handler $LINENO "$BASH_COMMAND"' ERR trap cleanup EXIT -trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT -trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM +trap 'post_update_to_api "failed" "130"' SIGINT +trap 'post_update_to_api "failed" "143"' SIGTERM +trap 'post_update_to_api "failed" "129"; exit 129' SIGHUP function error_handler() { local exit_code="$?" local line_number="$1" diff --git a/vm/umbrel-os-vm.sh b/vm/umbrel-os-vm.sh index 4d71d0732..01491e41d 100644 --- a/vm/umbrel-os-vm.sh +++ b/vm/umbrel-os-vm.sh @@ -62,8 +62,9 @@ THIN="discard=on,ssd=1," set -e trap 'error_handler $LINENO "$BASH_COMMAND"' ERR trap cleanup EXIT -trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT -trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM +trap 'post_update_to_api "failed" "130"' SIGINT +trap 'post_update_to_api "failed" "143"' SIGTERM +trap 'post_update_to_api "failed" "129"; exit 129' SIGHUP function error_handler() { local exit_code="$?" local line_number="$1"