From d857e0d4ac99be0c4852926da728df6ba8e1bc43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Numbus?= Date: Sun, 29 Mar 2026 13:42:32 +0200 Subject: [PATCH] Get JSON export to work --- deploy.sh | 104 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 62 insertions(+), 42 deletions(-) diff --git a/deploy.sh b/deploy.sh index 1670989..eca8517 100644 --- a/deploy.sh +++ b/deploy.sh @@ -66,7 +66,7 @@ hardware_detection() { ### --> Get hardware information local TMPFILE="/tmp/hw_detection.json" - ssh_to_host 'bash -s' << SSHEND + PASS="${LIVE_TARGET_PASSWD}" ssh_to_host "PASS=\"\$PASS\" bash -s" << 'SSHEND' TARGET_GRAPHICS="false" TARGET_GRAPHICS_BRAND=() @@ -77,79 +77,99 @@ for brand in Intel AMD NVIDIA; do fi done -ls /dev/dri/ > /dev/null 2>&1 | grep -iq "renderD128" && TARGET_GRAPHICS_RENDERER="true" || TARGET_GRAPHICS_RENDERER="false" -lsusb > /dev/null 2>&1 | grep -iq "google" && TARGET_USB_CORAL="true" || TARGET_USB_CORAL="false" -lspci -nn > /dev/null 2>&1 | grep -iq "089a" && TARGET_PCIE_CORAL="true" || TARGET_PCIE_CORAL="false" -ls /dev/serial/by-id/ > /dev/null 2>&1 | grep -i "zigbee" && TARGET_ZIGBEE_DEVICE=\$(ls /dev/serial/by-id/ > /dev/null 2>&1 | grep -i "zigbee" | head -n 1) || TARGET_ZIGBEE_DEVICE="" +ls /dev/dri/ 2>/dev/null | grep -iq "renderD128" && TARGET_GRAPHICS_RENDERER="true" || TARGET_GRAPHICS_RENDERER="false" +lsusb 2>/dev/null | grep -iq "google" && TARGET_USB_CORAL="true" || TARGET_USB_CORAL="false" +lspci -nn 2>/dev/null | grep -iq "089a" && TARGET_PCIE_CORAL="true" || TARGET_PCIE_CORAL="false" +TARGET_ZIGBEE_DEVICE=$(ls /dev/serial/by-id/ 2>/dev/null | grep -i "zigbee" | head -n 1 || echo "") -TARGET_INTERFACE=\$(ip -4 route show default | awk '{print \$5}' | head -n1) +TARGET_INTERFACE=$(ip -4 route show default | awk '{print $5}' | head -n1) if ls -l /sys/class/tpm/tpm0/ > /dev/null 2>&1; then TARGET_TPM="true" - TARGET_TPM_VERSION=\$(cat /sys/class/tpm/tpm0/tpm_version_major) + TARGET_TPM_VERSION=$(cat /sys/class/tpm/tpm0/tpm_version_major) else TARGET_TPM="false" TARGET_TPM_VERSION="N/A" fi -HDD=1 DISK_DEVPATH=() DISK_NAME=() DISK_TYPE=() DISK_HEALTH=() DISK_ID=() +DISK_SIZE=() -for DISK in \$(lsblk -x SIZE -d -n -e 7,11 -o NAME); do +for DISK in $(lsblk -x SIZE -d -n -e 7,11 -o NAME); do # Disk name and simple path - DISK_DEVPATH+=("/dev/\$DISK") - DISK_NAME+=("\$DISK") + DISK_DEVPATH+=("/dev/$DISK") + DISK_NAME+=("$DISK") # Disk type - HDD=\$(cat /sys/block/\$DISK/queue/rotational) - TRANSPORT_PROTOCOL=\$(lsblk -x SIZE -d -n -e 7,11 -o TRAN /dev/\$DISK) - if [[ "\$DISK" == "nvme*" ]]; then DISK_TYPE+=("NVMe"); - elif [[ "\$HDD" -eq 1 ]]; then DISK_TYPE+=("HDD"); - elif [[ "\$TRANSPORT_PROTOCOL" == "usb" ]]; then DISK_TYPE+=("USB"); - elif [[ "\$HDD" -eq 0 ]]; then DISK_TYPE+=("SSD"); + ROTATIONAL=$(cat "/sys/block/$DISK/queue/rotational") + TRANSPORT=$(lsblk -d -n -o TRAN "/dev/$DISK" 2>/dev/null || echo "sata") + if [[ "$DISK" == nvme* ]]; then DISK_TYPE+=("NVMe"); + elif [[ "$ROTATIONAL" -eq 1 ]]; then DISK_TYPE+=("HDD"); + elif [[ "$TRANSPORT" == "usb" ]]; then DISK_TYPE+=("USB"); + elif [[ "$ROTATIONAL" -eq 0 ]]; then DISK_TYPE+=("SSD"); else DISK_TYPE+=("Other") fi # Disk health - if [[ \$(echo "${LIVE_TARGET_PASSWD}" | sudo -S smartctl -H /dev/\$DISK 2>/dev/null | grep 'self-assessment' | awk '{print \$6}') == "PASSED" ]]; then + if [[ $(echo "$PASS" | sudo -S smartctl -H "/dev/$DISK" 2>/dev/null | grep 'result:' | awk '{print $NF}') == "PASSED" ]]; then DISK_HEALTH+=("PASSED") else DISK_HEALTH+=("N/A") fi # Disk ID - DISK_ID+=("\$(ls -l /dev/disk/by-id | grep -m1 "../../\$DISK" | awk '{print "/dev/disk/by-id/" \$9}')") - DISK_SIZE+=("\$(lsblk -x SIZE -d -n -e 7,11 -o SIZE /dev/\$DISK)") + DISK_ID+=("$(ls -l /dev/disk/by-id 2>/dev/null | grep -m1 "../../$DISK" | awk '{print "/dev/disk/by-id/" $9}')") + DISK_SIZE+=("$(lsblk -d -n -o SIZE "/dev/$DISK")") done -disk_args=() -for i in "\${!DISK_NAME[@]}"; do - disk_args+=("\${DISK_NAME[\$i]}" "\${DISK_DEVPATH[\$i]}" "\${DISK_TYPE[\$i]}" "\${DISK_HEALTH[\$i]}" "\${DISK_ID[\$i]}" "\${DISK_SIZE[\$i]}") +# Prepare disk flat array for jq positional arguments +DISK_ARGS=() +for i in "${!DISK_NAME[@]}"; do + DISK_ARGS+=("${DISK_NAME[$i]}" "${DISK_DEVPATH[$i]}" "${DISK_TYPE[$i]}" "${DISK_HEALTH[$i]}" "${DISK_ID[$i]}" "${DISK_SIZE[$i]}") done -nix-shell -p jq --run "jq -n \\ - --argjson graphics_enabled \"\$TARGET_GRAPHICS\" \\ - --argjson graphics_brands \"\$(nix-shell -p jq --run \"jq -n '\\\$ARGS.positional' --args \\\"\${TARGET_GRAPHICS_BRAND[@]}\\\"\" jq)\" \\ - --argjson graphics_renderer \"\$TARGET_GRAPHICS_RENDERER\" \\ - --argjson tpu_usb \"\$TARGET_USB_CORAL\" \\ - --argjson tpu_pcie \"\$TARGET_PCIE_CORAL\" \\ - --argjson tpm_enabled \"\$TARGET_TPM\" \\ - --arg tpm_version \"\$TARGET_TPM_VERSION\" \\ - --arg zigbee_device \"\$TARGET_ZIGBEE_DEVICE\" \\ - --arg interface \"\$TARGET_INTERFACE\" \\ - --argjson disks \"\$(nix-shell -p jq --run \"jq -n '[range(\\\$ARGS.positional | length / 6) as \\\$i | {name: \\\$ARGS.positional[\\\$i*6], path: \\\$ARGS.positional[\\\$i*6+1], type: \\\$ARGS.positional[\\\$i*6+2], health: \\\$ARGS.positional[\\\$i*6+3], id: \\\$ARGS.positional[\\\$i*6+4], size: \\\$ARGS.positional[\\\$i*6+5]}]' --args \\\"\${disk_args[@]}\\\"\" jq)\" \\ - '{ - graphics: { enabled: \$graphics_enabled, brands: \$graphics_brands, renderer: \$graphics_renderer }, - tpu: { usb: \$tpu_usb, pcie: \$tpu_pcie }, - tpm: { enabled: \$tpm_enabled, version: \$tpm_version }, - zigbee: { device: \$zigbee_device }, - network: { interface: \$interface }, - disks: \$disks - }'" > "${TMPFILE}" +# Export scalars to environment so JQ can access them cleanly via 'env' +export TARGET_GRAPHICS TARGET_GRAPHICS_RENDERER TARGET_USB_CORAL TARGET_PCIE_CORAL TARGET_TPM TARGET_TPM_VERSION TARGET_ZIGBEE_DEVICE TARGET_INTERFACE +export TARGET_GRAPHICS_BRAND_STR="${TARGET_GRAPHICS_BRAND[*]}" + +# Generate JSON using a clean heredoc for the filter to avoid backslash escaping +nix-shell -p jq --run "jq -n -f /dev/stdin --args \"\${DISK_ARGS[@]}\"" << 'JQ_FILTER' > "$TMPFILE" +{ + graphics: { + enabled: (env.TARGET_GRAPHICS == "true"), + brands: (env.TARGET_GRAPHICS_BRAND_STR | split(" ") | map(select(length > 0))), + renderer: (env.TARGET_GRAPHICS_RENDERER == "true") + }, + tpu: { + usb: (env.TARGET_USB_CORAL == "true"), + pcie: (env.TARGET_PCIE_CORAL == "true") + }, + tpm: { + enabled: (env.TARGET_TPM == "true"), + version: (env.TARGET_TPM_VERSION | tonumber? // .) + }, + zigbee: { + device: env.TARGET_ZIGBEE_DEVICE + }, + network: { + interface: env.TARGET_INTERFACE + }, + disks: [ + $ARGS.positional | range(0; length; 6) as $i | { + name: .[$i], + path: .[$i+1], + type: .[$i+2], + health: .[$i+3], + id: .[$i+4], + size: .[$i+5] + } + ] +} +JQ_FILTER SSHEND ### Get hardware information <--