From eaf8e746a03885c7f69b0ab70c59b37f5ce076c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Numbus?= Date: Sun, 29 Mar 2026 13:57:00 +0200 Subject: [PATCH] Get JSON export to work --- deploy.sh | 152 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 79 insertions(+), 73 deletions(-) diff --git a/deploy.sh b/deploy.sh index eca8517..3440216 100644 --- a/deploy.sh +++ b/deploy.sh @@ -63,122 +63,128 @@ ssh_to_host() { } hardware_detection() { - ### --> Get hardware information - local TMPFILE="/tmp/hw_detection.json" - - PASS="${LIVE_TARGET_PASSWD}" ssh_to_host "PASS=\"\$PASS\" bash -s" << 'SSHEND' -TARGET_GRAPHICS="false" -TARGET_GRAPHICS_BRAND=() + ### --> Get hardware information + local TMPFILE="/tmp/nixos-installation-hw-detection" + ssh_to_host 'bash -s' << SSHEND for brand in Intel AMD NVIDIA; do if lspci -nn 2>/dev/null | grep -i "vga" | grep -iq "\${brand}"; then TARGET_GRAPHICS="true" TARGET_GRAPHICS_BRAND+=("\${brand}") + else + TARGET_GRAPHICS="false" fi done -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 "") +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="" -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 - 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"); + 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"); else DISK_TYPE+=("Other") fi # Disk health - if [[ $(echo "$PASS" | sudo -S smartctl -H "/dev/$DISK" 2>/dev/null | grep 'result:' | awk '{print $NF}') == "PASSED" ]]; then + if [[ \$(echo "${LIVE_TARGET_PASSWD}" | sudo -S smartctl -H /dev/\$DISK 2>/dev/null | grep 'self-assessment' | awk '{print \$6}') == "PASSED" ]]; then DISK_HEALTH+=("PASSED") else DISK_HEALTH+=("N/A") fi # Disk ID - 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")") - + 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)") done -# 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]}") +echo "# Hardware detection results on \$(date)" > "${TMPFILE}" +for var in \ + TARGET_GRAPHICS \ + TARGET_GRAPHICS_RENDERER \ + TARGET_USB_CORAL \ + TARGET_PCIE_CORAL \ + TARGET_ZIGBEE_DEVICE \ + TARGET_INTERFACE \ + TARGET_TPM \ + TARGET_TPM_VERSION; do + echo "export \${var}=\${!var}" >> "${TMPFILE}" done -# 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 +for var in \ + TARGET_GRAPHICS_BRAND \ + DISK_DEVPATH \ + DISK_NAME \ + DISK_TYPE \ + DISK_HEALTH \ + DISK_ID \ + DISK_SIZE; do + declare -p \${var} | sed 's/^declare /declare -g /' >> "${TMPFILE}" +done SSHEND ### Get hardware information <-- - scp -i "configuration/home/numbus-admin/.ssh/id_ed25519" "${TARGET_USER}@${LIVE_TARGET_IP}":"${TMPFILE}" "hardware.json" &> /dev/null + scp -i "configuration/home/numbus-admin/.ssh/id_ed25519" "${TARGET_USER}@${LIVE_TARGET_IP}":"${TMPFILE}" "${TMPFILE}" &> /dev/null + source "${TMPFILE}" - # Create YAML for NixOS and JSON for the Configurator Website - yq -P '.' hardware.json > hardware.yaml - yq -o=json '.' hardware.yaml > configurator/hardware.json - rm hardware.json + ### Transform the bash variables into JSON --> + # We prepare the disk data as a flat array to pass to jq + local DISK_FLAT_ARRAY=() + for i in "${!DISK_NAME[@]}"; do + DISK_FLAT_ARRAY+=("${DISK_NAME[$i]}" "${DISK_DEVPATH[$i]}" "${DISK_TYPE[$i]}" "${DISK_HEALTH[$i]}" "${DISK_ID[$i]}" "${DISK_SIZE[$i]}") + done + + # Generate the JSON file for the configurator + jq -n \ + --argjson graphics_enabled "${TARGET_GRAPHICS:-false}" \ + --argjson graphics_renderer "${TARGET_GRAPHICS_RENDERER:-false}" \ + --argjson tpu_usb "${TARGET_USB_CORAL:-false}" \ + --argjson tpu_pcie "${TARGET_PCIE_CORAL:-false}" \ + --argjson tpm_enabled "${TARGET_TPM:-false}" \ + --arg tpm_version "${TARGET_TPM_VERSION:-N/A}" \ + --arg zigbee_device "${TARGET_ZIGBEE_DEVICE:-}" \ + --arg interface "${TARGET_INTERFACE:-}" \ + --argjson brands "$(jq -n '$ARGS.positional' --args ${TARGET_GRAPHICS_BRAND[@]:-})" \ + ' + { + graphics: { enabled: $graphics_enabled, brands: $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: [ + $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] + } + ] + }' --args "${DISK_FLAT_ARRAY[@]:-}" > configurator/hardware.json + ### Transform the bash variables into JSON <-- ### --> Generate hardware-configuration.nix if ssh_to_host "sudo nixos-generate-config --no-filesystems --show-hardware-config" > configuration/etc/nixos/hardware-configuration.nix; then