Get JSON export to work
This commit is contained in:
@@ -63,122 +63,128 @@ ssh_to_host() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
hardware_detection() {
|
hardware_detection() {
|
||||||
### --> Get hardware information
|
### --> Get hardware information
|
||||||
local TMPFILE="/tmp/hw_detection.json"
|
local TMPFILE="/tmp/nixos-installation-hw-detection"
|
||||||
|
|
||||||
PASS="${LIVE_TARGET_PASSWD}" ssh_to_host "PASS=\"\$PASS\" bash -s" << 'SSHEND'
|
|
||||||
TARGET_GRAPHICS="false"
|
|
||||||
TARGET_GRAPHICS_BRAND=()
|
|
||||||
|
|
||||||
|
ssh_to_host 'bash -s' << SSHEND
|
||||||
for brand in Intel AMD NVIDIA; do
|
for brand in Intel AMD NVIDIA; do
|
||||||
if lspci -nn 2>/dev/null | grep -i "vga" | grep -iq "\${brand}"; then
|
if lspci -nn 2>/dev/null | grep -i "vga" | grep -iq "\${brand}"; then
|
||||||
TARGET_GRAPHICS="true"
|
TARGET_GRAPHICS="true"
|
||||||
TARGET_GRAPHICS_BRAND+=("\${brand}")
|
TARGET_GRAPHICS_BRAND+=("\${brand}")
|
||||||
|
else
|
||||||
|
TARGET_GRAPHICS="false"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
ls /dev/dri/ 2>/dev/null | grep -iq "renderD128" && TARGET_GRAPHICS_RENDERER="true" || TARGET_GRAPHICS_RENDERER="false"
|
ls /dev/dri/ > /dev/null 2>&1 | 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"
|
lsusb > /dev/null 2>&1 | 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"
|
lspci -nn > /dev/null 2>&1 | 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/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
|
if ls -l /sys/class/tpm/tpm0/ > /dev/null 2>&1; then
|
||||||
TARGET_TPM="true"
|
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
|
else
|
||||||
TARGET_TPM="false"
|
TARGET_TPM="false"
|
||||||
TARGET_TPM_VERSION="N/A"
|
TARGET_TPM_VERSION="N/A"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
HDD=1
|
||||||
DISK_DEVPATH=()
|
DISK_DEVPATH=()
|
||||||
DISK_NAME=()
|
DISK_NAME=()
|
||||||
DISK_TYPE=()
|
DISK_TYPE=()
|
||||||
DISK_HEALTH=()
|
DISK_HEALTH=()
|
||||||
DISK_ID=()
|
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 name and simple path
|
||||||
DISK_DEVPATH+=("/dev/$DISK")
|
DISK_DEVPATH+=("/dev/\$DISK")
|
||||||
DISK_NAME+=("$DISK")
|
DISK_NAME+=("\$DISK")
|
||||||
# Disk type
|
# Disk type
|
||||||
ROTATIONAL=$(cat "/sys/block/$DISK/queue/rotational")
|
HDD=\$(cat /sys/block/\$DISK/queue/rotational)
|
||||||
TRANSPORT=$(lsblk -d -n -o TRAN "/dev/$DISK" 2>/dev/null || echo "sata")
|
TRANSPORT_PROTOCOL=\$(lsblk -x SIZE -d -n -e 7,11 -o TRAN /dev/\$DISK)
|
||||||
if [[ "$DISK" == nvme* ]]; then DISK_TYPE+=("NVMe");
|
if [[ "\$DISK" == "nvme*" ]]; then DISK_TYPE+=("NVMe");
|
||||||
elif [[ "$ROTATIONAL" -eq 1 ]]; then DISK_TYPE+=("HDD");
|
elif [[ "\$HDD" -eq 1 ]]; then DISK_TYPE+=("HDD");
|
||||||
elif [[ "$TRANSPORT" == "usb" ]]; then DISK_TYPE+=("USB");
|
elif [[ "\$TRANSPORT_PROTOCOL" == "usb" ]]; then DISK_TYPE+=("USB");
|
||||||
elif [[ "$ROTATIONAL" -eq 0 ]]; then DISK_TYPE+=("SSD");
|
elif [[ "\$HDD" -eq 0 ]]; then DISK_TYPE+=("SSD");
|
||||||
else DISK_TYPE+=("Other")
|
else DISK_TYPE+=("Other")
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Disk health
|
# 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")
|
DISK_HEALTH+=("PASSED")
|
||||||
else
|
else
|
||||||
DISK_HEALTH+=("N/A")
|
DISK_HEALTH+=("N/A")
|
||||||
fi
|
fi
|
||||||
# Disk ID
|
# Disk ID
|
||||||
DISK_ID+=("$(ls -l /dev/disk/by-id 2>/dev/null | grep -m1 "../../$DISK" | awk '{print "/dev/disk/by-id/" $9}')")
|
DISK_ID+=("\$(ls -l /dev/disk/by-id | grep -m1 "../../\$DISK" | awk '{print "/dev/disk/by-id/" \$9}')")
|
||||||
DISK_SIZE+=("$(lsblk -d -n -o SIZE "/dev/$DISK")")
|
DISK_SIZE+=("\$(lsblk -x SIZE -d -n -e 7,11 -o SIZE /dev/\$DISK)")
|
||||||
|
|
||||||
done
|
done
|
||||||
|
|
||||||
# Prepare disk flat array for jq positional arguments
|
echo "# Hardware detection results on \$(date)" > "${TMPFILE}"
|
||||||
DISK_ARGS=()
|
for var in \
|
||||||
for i in "${!DISK_NAME[@]}"; do
|
TARGET_GRAPHICS \
|
||||||
DISK_ARGS+=("${DISK_NAME[$i]}" "${DISK_DEVPATH[$i]}" "${DISK_TYPE[$i]}" "${DISK_HEALTH[$i]}" "${DISK_ID[$i]}" "${DISK_SIZE[$i]}")
|
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
|
done
|
||||||
|
|
||||||
# Export scalars to environment so JQ can access them cleanly via 'env'
|
for var in \
|
||||||
export TARGET_GRAPHICS TARGET_GRAPHICS_RENDERER TARGET_USB_CORAL TARGET_PCIE_CORAL TARGET_TPM TARGET_TPM_VERSION TARGET_ZIGBEE_DEVICE TARGET_INTERFACE
|
TARGET_GRAPHICS_BRAND \
|
||||||
export TARGET_GRAPHICS_BRAND_STR="${TARGET_GRAPHICS_BRAND[*]}"
|
DISK_DEVPATH \
|
||||||
|
DISK_NAME \
|
||||||
# Generate JSON using a clean heredoc for the filter to avoid backslash escaping
|
DISK_TYPE \
|
||||||
nix-shell -p jq --run "jq -n -f /dev/stdin --args \"\${DISK_ARGS[@]}\"" << 'JQ_FILTER' > "$TMPFILE"
|
DISK_HEALTH \
|
||||||
{
|
DISK_ID \
|
||||||
graphics: {
|
DISK_SIZE; do
|
||||||
enabled: (env.TARGET_GRAPHICS == "true"),
|
declare -p \${var} | sed 's/^declare /declare -g /' >> "${TMPFILE}"
|
||||||
brands: (env.TARGET_GRAPHICS_BRAND_STR | split(" ") | map(select(length > 0))),
|
done
|
||||||
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
|
SSHEND
|
||||||
### Get hardware information <--
|
### 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
|
### Transform the bash variables into JSON -->
|
||||||
yq -P '.' hardware.json > hardware.yaml
|
# We prepare the disk data as a flat array to pass to jq
|
||||||
yq -o=json '.' hardware.yaml > configurator/hardware.json
|
local DISK_FLAT_ARRAY=()
|
||||||
rm hardware.json
|
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
|
### --> Generate hardware-configuration.nix
|
||||||
if ssh_to_host "sudo nixos-generate-config --no-filesystems --show-hardware-config" > configuration/etc/nixos/hardware-configuration.nix; then
|
if ssh_to_host "sudo nixos-generate-config --no-filesystems --show-hardware-config" > configuration/etc/nixos/hardware-configuration.nix; then
|
||||||
|
|||||||
Reference in New Issue
Block a user