48 lines
1.8 KiB
Bash
Executable File
48 lines
1.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Populate /srv/tftpboot with Raspberry Pi 4 / CM4 boot files from the official firmware repo.
|
|
# Run inside the LXC (as root), or from your machine: ./populate-tftpboot-from-git.sh root@10.130.60.141
|
|
# Requires: curl or wget, tar; the LXC must have internet (eth0).
|
|
|
|
set -e
|
|
TARGET="${1:-}"
|
|
FIRMWARE_URL="https://github.com/raspberrypi/firmware/archive/refs/heads/master.tar.gz"
|
|
TFTP_ROOT="${TFTP_ROOT:-/srv/tftpboot}"
|
|
|
|
do_populate() {
|
|
echo "Populating $TFTP_ROOT from Raspberry Pi firmware (GitHub) ..."
|
|
mkdir -p "$TFTP_ROOT"
|
|
if [[ -f "$TFTP_ROOT/start4cd.elf" ]]; then
|
|
echo "start4cd.elf already present; skipping download (remove it to re-fetch)."
|
|
return 0
|
|
fi
|
|
if ! command -v curl >/dev/null 2>&1 && ! command -v wget >/dev/null 2>&1; then
|
|
echo "Installing curl ..."
|
|
apt-get update -qq && DEBIAN_FRONTEND=noninteractive apt-get install -y -qq curl
|
|
fi
|
|
local tmpdir
|
|
tmpdir=$(mktemp -d)
|
|
trap "rm -rf $tmpdir" EXIT
|
|
if command -v curl >/dev/null 2>&1; then
|
|
curl -sL "$FIRMWARE_URL" -o "$tmpdir/firmware.tar.gz"
|
|
else
|
|
wget -q -O "$tmpdir/firmware.tar.gz" "$FIRMWARE_URL"
|
|
fi
|
|
tar xzf "$tmpdir/firmware.tar.gz" -C "$tmpdir"
|
|
if [[ ! -d "$tmpdir/firmware-master/boot" ]]; then
|
|
echo "Error: boot folder not found in archive"
|
|
exit 1
|
|
fi
|
|
cp -a "$tmpdir/firmware-master/boot/." "$TFTP_ROOT/"
|
|
echo "Copied boot files to $TFTP_ROOT ($(ls "$TFTP_ROOT" | wc -l) items)."
|
|
ls -la "$TFTP_ROOT"/start4*.elf "$TFTP_ROOT"/fixup4*.dat "$TFTP_ROOT"/config.txt 2>/dev/null || true
|
|
}
|
|
|
|
if [[ -n "$TARGET" ]]; then
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
scp "$SCRIPT_DIR/populate-tftpboot-from-git.sh" "$TARGET:/tmp/populate-tftpboot.sh"
|
|
ssh "$TARGET" "bash /tmp/populate-tftpboot.sh"
|
|
exit 0
|
|
fi
|
|
|
|
do_populate
|