blob: 30211f05c86b551eb5dc17e942e2e1a52b1311b1 [file] [log] [blame] [edit]
#!/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
{
"EmmcAvaiable": $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