#!/usr/bin/env bash # check-pi-platform.sh: confirm, without the Pi, that Ubuntu 24.04's Raspberry Pi kernel ships the # drivers and overlays the robot needs. It downloads the current linux-modules-*-raspi package for # arm64 (about 50 MB) and inspects it. Nothing is installed; everything happens in a temp folder. # # Needs: curl, gzip, awk, ar (binutils), zstd, tar # NixOS: nix-shell -p curl binutils zstd gnutar gawk --run ./check-pi-platform.sh # Omarchy: sudo pacman -S --needed binutils zstd && ./check-pi-platform.sh # # Usage: ./check-pi-platform.sh [suite] (default suite: noble-updates) # MIRROR= overrides http://ports.ubuntu.com/ubuntu-ports set -euo pipefail SUITE="${1:-noble-updates}" MIRROR="${MIRROR:-http://ports.ubuntu.com/ubuntu-ports}" for tool in curl gzip awk ar zstd tar; do command -v "$tool" >/dev/null || { echo "Missing tool: $tool (see the header of this script)" >&2; exit 2; } done work="$(mktemp -d)" trap 'rm -rf "$work"' EXIT cd "$work" echo "==> Reading the arm64 package index for $SUITE" curl -fsSL "$MIRROR/dists/$SUITE/main/binary-arm64/Packages.gz" | gzip -dc > Packages # field : the value of Field in that package's stanza (last stanza wins) field() { awk -v p="$1" -v f="$2" ' /^Package: / { inpkg = ($2 == p) } inpkg && index($0, f ": ") == 1 { v = substr($0, length(f) + 3) } END { if (v != "") print v }' Packages } meta_deps="$(field linux-image-raspi Depends)" [[ -n "$meta_deps" ]] || { echo "linux-image-raspi not found in $SUITE" >&2; exit 1; } abi="$(grep -oE 'linux-image-[0-9][^ ,(]*-raspi' <<<"$meta_deps" | head -1 | sed 's/^linux-image-//')" modpkg="linux-modules-$abi" debpath="$(field "$modpkg" Filename)" [[ -n "$debpath" ]] || { echo "$modpkg not found in $SUITE" >&2; exit 1; } echo "==> Current Pi kernel for Ubuntu 24.04: $abi" echo "==> Downloading $modpkg" curl -fsSL "$MIRROR/$debpath" -o modules.deb member="$(ar t modules.deb | grep '^data\.tar' | head -1)" case "$member" in *.zst) decomp=(zstd -dc) ;; *.xz) decomp=(xz -dc) ;; *.gz) decomp=(gzip -dc) ;; *) echo "Unexpected package layout: $member" >&2; exit 1 ;; esac ar p modules.deb "$member" | "${decomp[@]}" | tar -t > files ar p modules.deb "$member" | "${decomp[@]}" | tar -xO "./boot/config-$abi" > config 2>/dev/null || : > config missing=0 # check