Improved debugging features. Added quotes to live.yaml. Improving hardware detection.

This commit is contained in:
Raphaël Numbus
2026-05-25 16:54:57 +02:00
parent 5d4b8eb77f
commit 50f624e9e4
2 changed files with 50 additions and 25 deletions
+48 -23
View File
@@ -69,7 +69,7 @@ cleanup() {
rm -${DIR_RM_FLAGS} "/run/user/$(id -u)/numbus-installer" rm -${DIR_RM_FLAGS} "/run/user/$(id -u)/numbus-installer"
if [[ -n "${BRIDGE_PID:-}" ]] && ps -p ${BRIDGE_PID} > /dev/null; then if [[ -n "${BRIDGE_PID:-}" ]] && ps -p ${BRIDGE_PID} > "${STDOUT}" 2> "${STDERR}"; then
kill ${BRIDGE_PID} kill ${BRIDGE_PID}
fi fi
} }
@@ -106,6 +106,31 @@ append_to_report() {
# --- 1. Detect Graphics --- # --- 1. Detect Graphics ---
detect_graphics() { detect_graphics() {
local gpus="[]" local gpus="[]"
local brand
local renderer
local product
for line in lspci | grep VGA; do
local pci_addr
pci_addr="\$(lspci | grep VGA | head -c 7)"
# Brand
for b in Intel AMD NVIDIA; do
if [[ echo "\${line}" | grep -i "\${b}" ]]; then
brand="\${b}"
fi
done
# Renderer info
# Product name
#
done
# Iterate over all VGA and 3D controllers # Iterate over all VGA and 3D controllers
while read -r pci_addr; do while read -r pci_addr; do
@@ -152,7 +177,7 @@ detect_corals() {
local corals="[]" local corals="[]"
# Check PCIe Coral (Google ID 1ac1:089a) # Check PCIe Coral (Google ID 1ac1:089a)
if lspci -nn 2>/dev/null | grep -iq "1ac1:089a"; then if lspci -nn > "${STDOUT}" 2> "${STDERR}" | grep -iq "1ac1:089a"; then
local pcie_count local pcie_count
pcie_count=\$(lspci -nn | grep -ic "1ac1:089a") pcie_count=\$(lspci -nn | grep -ic "1ac1:089a")
for ((i=1; i<=pcie_count; i++)); do for ((i=1; i<=pcie_count; i++)); do
@@ -162,7 +187,7 @@ detect_corals() {
fi fi
# Check USB Coral (Google ID 18d1:9302) # Check USB Coral (Google ID 18d1:9302)
if lsusb 2>/dev/null | grep -iq "18d1:9302"; then if lsusb > "${STDOUT}" 2> "${STDERR}" | grep -iq "18d1:9302"; then
local usb_count local usb_count
usb_count=\$(lsusb | grep -ic "18d1:9302") usb_count=\$(lsusb | grep -ic "18d1:9302")
for ((i=1; i<=usb_count; i++)); do for ((i=1; i<=usb_count; i++)); do
@@ -197,7 +222,7 @@ detect_zigbee() {
detect_network() { detect_network() {
local networks="[]" local networks="[]"
local default_iface local default_iface
default_iface=\$(ip -4 route show default 2>/dev/null | awk '{print \$5}' | head -n1) default_iface=\$(ip -4 route show default > "${STDOUT}" 2> "${STDERR}" | awk '{print \$5}' | head -n1)
for iface_path in /sys/class/net/*; do for iface_path in /sys/class/net/*; do
[[ -e "\$iface_path" ]] || continue [[ -e "\$iface_path" ]] || continue
@@ -255,9 +280,9 @@ detect_disks() {
# Disk Type Mapping # Disk Type Mapping
local disk_type="Other" local disk_type="Other"
local transport local transport
transport=\$(lsblk -d -n -o TRAN "\$dev_path" 2>/dev/null || echo "") transport=\$(lsblk -d -n -o TRAN "\$dev_path" > "${STDOUT}" 2> "${STDERR}" || echo "")
local rotational local rotational
rotational=\$(lsblk -d -n -o ROTA "\$dev_path" 2>/dev/null || echo "1") rotational=\$(lsblk -d -n -o ROTA "\$dev_path" > "${STDOUT}" 2> "${STDERR}" || echo "1")
if [[ "\$disk" == nvme* ]]; then if [[ "\$disk" == nvme* ]]; then
disk_type="NVMe" disk_type="NVMe"
@@ -271,7 +296,7 @@ detect_disks() {
# Size in GB # Size in GB
local size_bytes local size_bytes
size_bytes=\$(lsblk -d -n -b -o SIZE "\$dev_path" 2>/dev/null || echo "0") size_bytes=\$(lsblk -d -n -b -o SIZE "\$dev_path" > "${STDOUT}" 2> "${STDERR}" || echo "0")
local size_gb local size_gb
size_gb=\$(awk "BEGIN {printf \"%.2f\", \$size_bytes/1073741824}") size_gb=\$(awk "BEGIN {printf \"%.2f\", \$size_bytes/1073741824}")
@@ -285,8 +310,8 @@ detect_disks() {
# Health Assessment (Requires smartctl) # Health Assessment (Requires smartctl)
local health="N/A" local health="N/A"
if echo "${LIVE_TARGET_PASSWORD}" | sudo -S smartctl -H "\$dev_path" >/dev/null 2>&1; then if echo "${LIVE_TARGET_PASSWORD}" | sudo -S smartctl -H "\$dev_path" > "${STDOUT}" 2> "${STDERR}"; then
if smartctl -H "\$dev_path" 2>/dev/null | grep -iq "PASSED\|OK"; then if smartctl -H "\$dev_path" > "${STDOUT}" 2> "${STDERR}" | grep -iq "PASSED\|OK"; then
health="PASSED" health="PASSED"
else else
health="FAILED" health="FAILED"
@@ -314,9 +339,9 @@ detect_disks
# --- Output --- # --- Output ---
echo "\$HW_REPORT" | jq '.' > "$TMPFILE" echo "\$HW_REPORT" | jq '.' > "$TMPFILE"
SSHEND SSHEND > "${STDOUT}" 2> "${STDERR}"
scp -i "${TMP_EXTRA_PATH}/home/numbus-admin/.ssh/id_ed25519" "${TARGET_USER}@${LIVE_TARGET_IP}":"${TMPFILE}" "${HW_DATA_FILE}" &> /dev/null scp -i "${TMP_EXTRA_PATH}/home/numbus-admin/.ssh/id_ed25519" "${TARGET_USER}@${LIVE_TARGET_IP}":"${TMPFILE}" "${HW_DATA_FILE}" > "${STDOUT}" 2> "${STDERR}"
if ssh_to_host "sudo nixos-generate-config --no-filesystems --show-hardware-config" > ${TMP_EXTRA_PATH}/etc/nixos/hardware-configuration.nix; then if ssh_to_host "sudo nixos-generate-config --no-filesystems --show-hardware-config" > ${TMP_EXTRA_PATH}/etc/nixos/hardware-configuration.nix; then
echo -e "\n✅ Hardware configuration generated" echo -e "\n✅ Hardware configuration generated"
@@ -334,12 +359,12 @@ launch_gui() {
echo -e "\n 🚀 Launching Numbus Configurator..." echo -e "\n 🚀 Launching Numbus Configurator..."
echo -e " ➡️ You will now proceed to the configuration of your device through your browser" echo -e " ➡️ You will now proceed to the configuration of your device through your browser"
python3 "${BRIDGE_SCRIPT}" > /dev/null 2>&1 & python3 "${BRIDGE_SCRIPT}" > "${STDOUT}" 2> "${STDERR}" &
export BRIDGE_PID=$! export BRIDGE_PID=$!
local START_URL="http://localhost:${WEBSERVER_PORT}/pages/index.html" local START_URL="http://localhost:${WEBSERVER_PORT}/pages/index.html"
xdg-open "${START_URL}" 2>/dev/null || open "${START_URL}" 2>/dev/null || true xdg-open "${START_URL}" > "${STDOUT}" 2> "${STDERR}" || open "${START_URL}" > "${STDOUT}" 2> "${STDERR}" || true
sleep 5 sleep 5
@@ -356,14 +381,10 @@ setup_ssh() {
chmod 700 "${TMP_EXTRA_PATH}/home/numbus-admin/.ssh/" chmod 700 "${TMP_EXTRA_PATH}/home/numbus-admin/.ssh/"
ssh-keygen -t "ed25519" -C "numbus-admin@numbus-${DEVICE_TYPE}" -f "${TMP_EXTRA_PATH}/home/numbus-admin/.ssh/id_ed25519" -N "" -q ssh-keygen -t "ed25519" -C "numbus-admin@numbus-${DEVICE_TYPE}" -f "${TMP_EXTRA_PATH}/home/numbus-admin/.ssh/id_ed25519" -N "" -q
if [[ ${DEBUG} -eq 1 ]]; then echod "\n ➡️ Copying SSH key to target host '${TARGET_USER}@${LIVE_TARGET_IP}'..."
echo -e "\n ➡️ Copying SSH key to target host '${TARGET_USER}@${LIVE_TARGET_IP}'..."
fi
if sshpass -p "${LIVE_TARGET_PASSWORD}" ssh-copy-id -o StrictHostKeyChecking=no -i "${TMP_EXTRA_PATH}/home/numbus-admin/.ssh/id_ed25519" "${TARGET_USER}@${LIVE_TARGET_IP}"; then if sshpass -p "${LIVE_TARGET_PASSWORD}" ssh-copy-id -o StrictHostKeyChecking=no -i "${TMP_EXTRA_PATH}/home/numbus-admin/.ssh/id_ed25519" "${TARGET_USER}@${LIVE_TARGET_IP}" > "${STDOUT}" 2> "${STDERR}"; then
if [[ ${DEBUG} -eq 1 ]]; then echod "\n ✅ SSH key copied successfully"
echo -e "\n ✅ SSH key copied successfully"
fi
else else
echo -e "\n ❌ Failed to copy SSH key. Please check the host IP and password." echo -e "\n ❌ Failed to copy SSH key. Please check the host IP and password."
exit 1 exit 1
@@ -473,7 +494,7 @@ EOF
done done
local SSH_KEYS_FORMATTED="" local SSH_KEYS_FORMATTED=""
if [[ "$(declare -p AUTHORIZED_SSH_PUBLIC_KEY 2>/dev/null)" =~ "declare -a" ]]; then if [[ "$(declare -p AUTHORIZED_SSH_PUBLIC_KEY)" =~ "declare -a" ]]; then
for key in "${AUTHORIZED_SSH_PUBLIC_KEY[@]}"; do for key in "${AUTHORIZED_SSH_PUBLIC_KEY[@]}"; do
SSH_KEYS_FORMATTED+=" $key"$'\n' SSH_KEYS_FORMATTED+=" $key"$'\n'
done done
@@ -539,7 +560,7 @@ cloudflare_dns_setup() {
for id in ${RECORD_IDS}; do for id in ${RECORD_IDS}; do
curl -s -X DELETE "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/dns_records/${id}" \ curl -s -X DELETE "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/dns_records/${id}" \
-H "Authorization: Bearer ${CLOUDFLARE_DNS_API_TOKEN}" \ -H "Authorization: Bearer ${CLOUDFLARE_DNS_API_TOKEN}" \
-H "Content-Type: application/json" > /dev/null 2>&1 -H "Content-Type: application/json" > > "${STDOUT}" 2> "${STDERR}"
done done
create_records "${SUBDOMAIN}" create_records "${SUBDOMAIN}"
@@ -639,7 +660,7 @@ postrun_action() {
FOUND="false" FOUND="false"
i="0" i="0"
while [[ "${FOUND}" == "false" ]]; do while [[ "${FOUND}" == "false" ]]; do
if ping -c1 -W1 $HOME_SERVER_IP >/dev/null 2>&1; then if ping -c1 -W1 $HOME_SERVER_IP > "${STDOUT}" 2> "${STDERR}"; then
FOUND="true" FOUND="true"
echo -e "\n✅ Ping ${HOME_SERVER_IP} successful ! Continuing..." echo -e "\n✅ Ping ${HOME_SERVER_IP} successful ! Continuing..."
else else
@@ -730,6 +751,8 @@ if [[ ${DEBUG-0} -eq 1 ]]; then
DIR_RM_FLAGS="rvf" DIR_RM_FLAGS="rvf"
MKDIR_FLAGS="pv" MKDIR_FLAGS="pv"
MV_FLAGS="vu" MV_FLAGS="vu"
STDOUT="std.log"
STDERR="err.log"
else else
DEBUG=0 DEBUG=0
FILES_CP_FLAGS="au" FILES_CP_FLAGS="au"
@@ -737,6 +760,8 @@ else
DIR_RM_FLAGS="rf" DIR_RM_FLAGS="rf"
MKDIR_FLAGS="p" MKDIR_FLAGS="p"
MV_FLAGS="u" MV_FLAGS="u"
STDOUT="/dev/null"
STDERR="/dev/null"
fi fi
IP_REGEX='^([0-9]{1,3}\.){3}[0-9]{1,3}$' IP_REGEX='^([0-9]{1,3}\.){3}[0-9]{1,3}$'
+1 -1
View File
@@ -77,7 +77,7 @@
const response = await fetch('/discovery', { const response = await fetch('/discovery', {
method: 'POST', method: 'POST',
headers: { 'Content-Type': 'text/yaml' }, headers: { 'Content-Type': 'text/yaml' },
body: jsyaml.dump(payload) body: jsyaml.dump(payload, { quotingType: '"', forceQuotes: true })
}); });
if (response.ok) { if (response.ok) {