| #!/bin/bash | |
| # Function to check if eMMC is available | |
| # Returns "true" or "false" string to stdout | |
| get_emmc_status() { | |
| local target="emmc-available.target" | |
| local output | |
| # Run systemctl status and capture output | |
| output=$(systemctl status "$target" 2>&1) | |
| # Parse output for "Active: active" | |
| if echo "$output" | grep -q "Active: active"; then | |
| echo "true" | |
| else | |
| echo "false" | |
| fi | |
| } | |
| # Function to get related logs for eMMC services | |
| get_emmc_logs() { | |
| # Run journalctl for both services and combine output | |
| { | |
| echo "--- xyz.openbmc_project.eStoraged.service ---" | |
| journalctl -u xyz.openbmc_project.eStoraged.service -b | |
| echo "" | |
| echo "--- psdmd ---" | |
| journalctl -u psdmd -b | |
| echo "" | |
| echo "--- bmc_crypto ---" | |
| journalctl -u bmc_crypto -b | |
| } | |
| } | |
| # Function to format input text into a JSON array of strings | |
| format_log_array() { | |
| awk ' | |
| BEGIN { printf "[\n" } | |
| { | |
| # Escape backslashes and double quotes inside the content | |
| gsub(/\\/, "\\\\"); | |
| gsub(/"/, "\\\""); | |
| # If this is not the first line processed, print a comma and newline | |
| # to separate the previous element | |
| if (NR > 1) { printf ",\n" } | |
| # Print the current line wrapped in quotes with 4-space indent | |
| printf " \"%s\"", $0 | |
| } | |
| END { printf "\n ]" } | |
| ' | |
| } | |
| # Function to format input text into a mixed JSON array | |
| # Detects if a line is already JSON and inserts it directly (unquoted) | |
| # Otherwise escapes it as a string | |
| format_json_or_text_array() { | |
| awk ' | |
| BEGIN { printf "[\n" } | |
| { | |
| # Create a clean version of the line for checking (trim whitespace) | |
| clean = $0 | |
| gsub(/^[ \t]+|[ \t]+$/, "", clean) | |
| # Separator | |
| if (NR > 1) { printf ",\n" } | |
| # Heuristic: if line starts with { and ends with }, treat as raw JSON object | |
| if (clean ~ /^\{.*\}$/) { | |
| printf " %s", $0 | |
| } else { | |
| # Otherwise treat as string: escape and quote | |
| gsub(/\\/, "\\\\", $0); | |
| gsub(/"/, "\\\"", $0); | |
| printf " \"%s\"", $0 | |
| } | |
| } | |
| END { printf "\n ]" } | |
| ' | |
| } | |
| # --- Main Logic --- | |
| # 1. Get eMMC availability | |
| emmc_val=$(get_emmc_status) | |
| # 2. Get eMMC related logs and format them as a JSON array | |
| raw_emmc_logs=$(get_emmc_logs) | |
| emmc_json_logs=$(echo "$raw_emmc_logs" | format_log_array) | |
| # 3. Get Disk Usage and format as a JSON array | |
| raw_disk_usage=$(df -h) | |
| disk_usage_json=$(echo "$raw_disk_usage" | format_log_array) | |
| # 4. Get LUKS Status and format as a JSON array | |
| # We capture stderr (2>&1) as well, in case the device doesn't exist or command fails | |
| raw_luks_status=$(cryptsetup status luks-mmcblk0 2>&1) | |
| luks_status_json=$(echo "$raw_luks_status" | format_log_array) | |
| # 5. Get Install Service Logs and format as a JSON array | |
| raw_install_logs=$(journalctl -u install-service -b) | |
| install_logs_json=$(echo "$raw_install_logs" | format_log_array) | |
| # 6. Get Activation Check Logs and format as a JSON array | |
| raw_activation_logs=$(journalctl -u activation-check -b) | |
| activation_logs_json=$(echo "$raw_activation_logs" | format_log_array) | |
| # 7. Get Installer Internal Logs. Preserve JSON object structure | |
| raw_internal_logs=$(cat /run/install/progress_internal.log 2>&1) | |
| internal_logs_json=$(echo "$raw_internal_logs" | format_json_or_text_array) | |
| # 8. Generate Final JSON and save to file | |
| # Note: The json variables already contain brackets [ ] and quotes, so we don't add quotes here | |
| # Ensure the directory exists | |
| mkdir -p /run/install | |
| cat <<EOF > /run/install/debug_log.json.tmp | |
| { | |
| "EmmcAvailable": $emmc_val, | |
| "EmmcRelatedLogs": $emmc_json_logs, | |
| "DiskUsage": $disk_usage_json, | |
| "LuksStatus": $luks_status_json, | |
| "InstallServiceLogs": $install_logs_json, | |
| "ActivationCheckLogs": $activation_logs_json, | |
| "InstallerInternalLogs": $internal_logs_json | |
| } | |
| EOF | |
| mv /run/install/debug_log.json.tmp /run/install/debug_log.json |