From 06a40910192c98e87100737a088a39040786c8c6 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Mon, 17 Nov 2025 12:23:51 +0100 Subject: [PATCH] Improve container install error handling and logging Enhances reliability of application installation error detection in containers by using an error flag file, improves log copying and user prompts, and updates error handler to create a flag file with the exit code for host-side detection. --- misc/build.func | 43 +++++++++++++++++++++++++++++------------ misc/error_handler.func | 4 ++++ 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/misc/build.func b/misc/build.func index 692b1a95d..17c11fd47 100644 --- a/misc/build.func +++ b/misc/build.func @@ -2577,37 +2577,56 @@ EOF' install_ssh_keys_into_ct # Run application installer - if ! lxc-attach -n "$CTID" -- bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/install/${var_install}.sh)"; then - local install_exit_code=$? + lxc-attach -n "$CTID" -- bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/install/${var_install}.sh)" + local lxc_exit=$? + + # Check for error flag file in container (more reliable than lxc-attach exit code) + local install_exit_code=0 + if [[ -n "${SESSION_ID:-}" ]]; then + local error_flag="/root/.install-${SESSION_ID}.failed" + if pct exec "$CTID" -- test -f "$error_flag" 2>/dev/null; then + install_exit_code=$(pct exec "$CTID" -- cat "$error_flag" 2>/dev/null || echo "1") + pct exec "$CTID" -- rm -f "$error_flag" 2>/dev/null || true + fi + fi + + # Fallback to lxc-attach exit code if no flag file + if [[ $install_exit_code -eq 0 && $lxc_exit -ne 0 ]]; then + install_exit_code=$lxc_exit + fi + + # Installation failed? + if [[ $install_exit_code -ne 0 ]]; then msg_error "Installation failed in container ${CTID} (exit code: ${install_exit_code})" - # Try to copy installation log from container before cleanup prompt + # Try to copy installation log from container (without spinner/msg_info) if [[ -n "$CTID" && -n "${SESSION_ID:-}" ]]; then - pct pull "$CTID" "/root/.install-${SESSION_ID}.log" "/tmp/install-${SESSION_ID}.log" 2>/dev/null || true - msg_info "Installation log copied to /tmp/install-${SESSION_ID}.log" + if pct pull "$CTID" "/root/.install-${SESSION_ID}.log" "/tmp/install-${SESSION_ID}.log" 2>/dev/null; then + echo -e "${GN}✔${CL} Installation log: ${BL}/tmp/install-${SESSION_ID}.log${CL}" + fi fi - # Prompt user for cleanup with 60s timeout - local response + # Prompt user for cleanup with 60s timeout (plain echo - no msg_info to avoid spinner) + echo "" echo -en "${YW}Remove broken container ${CTID}? (Y/n) [auto-remove in 60s]: ${CL}" if read -t 60 -r response; then if [[ -z "$response" || "$response" =~ ^[Yy]$ ]]; then # Remove container - msg_info "Removing container ${CTID}" + echo -e "\n${TAB}${HOLD}${YW}Removing container ${CTID}${CL}" pct stop "$CTID" &>/dev/null || true pct destroy "$CTID" &>/dev/null || true - msg_ok "Container ${CTID} removed" + echo -e "${BFR}${CM}${GN}Container ${CTID} removed${CL}" elif [[ "$response" =~ ^[Nn]$ ]]; then - msg_info "Container ${CTID} kept for debugging" + echo -e "\n${TAB}${YW}Container ${CTID} kept for debugging${CL}" fi else # Timeout - auto-remove echo -e "\n${YW}No response - auto-removing container${CL}" - msg_info "Removing container ${CTID}" + echo -e "${TAB}${HOLD}${YW}Removing container ${CTID}${CL}" pct stop "$CTID" &>/dev/null || true pct destroy "$CTID" &>/dev/null || true - msg_ok "Container ${CTID} removed" + echo -e "${BFR}${CM}${GN}Container ${CTID} removed${CL}" fi exit $install_exit_code diff --git a/misc/error_handler.func b/misc/error_handler.func index 1c56d3264..a4d10e692 100644 --- a/misc/error_handler.func +++ b/misc/error_handler.func @@ -205,6 +205,10 @@ error_handler() { if [[ -d /root ]]; then local container_log="/root/.install-${SESSION_ID:-error}.log" cp "$SILENT_LOGFILE" "$container_log" 2>/dev/null || true + + # Create error flag file with exit code for host detection + echo "$exit_code" > "/root/.install-${SESSION_ID:-error}.failed" 2>/dev/null || true + if declare -f msg_custom >/dev/null 2>&1; then msg_custom "📋" "${YW}" "Log saved to: ${container_log}" else