diff --git a/raspberrypi/toaster b/raspberrypi/toaster new file mode 100755 index 0000000..1881a08 --- /dev/null +++ b/raspberrypi/toaster @@ -0,0 +1,94 @@ +#!/bin/sh +set -e + +export LC_ALL=C + +usage() { + echo "Usage: $0 input.img(.xz|.gz|) output.img recipes/recipe.sh" +} + +# Usage check: +in="$1" +out="$2" +recipe="$3" +if [ -z "$in" ] || [ -z "$out" ] || [ -z "$recipe" ]; then + echo "E: missing parameters" + usage + exit 1 +fi + +if [ ! -f "$in" ]; then + echo "E: specified input file cannot be found" + usage + exit 1 +fi + +if [ ! -f "$recipe" ]; then + echo "E: specified recipe file cannot be found" + usage + exit 1 +fi + +# Environment check: +if [ "$(id -u)" != 0 ]; then + echo "E: must run as root" + exit 1 +fi + +# Duplicate input into output: +echo "🍞 Duplicating" +case "$in" in + *.img) cp "$in" "$out";; + *.img.gz) zcat "$in" > "$out";; + *.img.xz) xzcat "$in" > "$out";; + *) echo "E: unsupported extension for specified input file"; usage; exit 1;; +esac + +# Load recipe, then use functions: +. "$recipe" + +# Possible resizing (image and partition table first, filesystem later): +resize=$(resize_me 2>/dev/null || echo 0) +if [ "$resize" != 0 ]; then + echo "🍞 Resizing" + size=$(stat -c %s "$out") + fallocate -l $((size + resize)) "$out" + + kpartx -asv "$out" + loop=$(losetup -j "$out" | sed 's,:.*$,,;s,^/dev/,,') + echo ', +' | sfdisk --force -N 2 "/dev/$loop" + kpartx -dsv "$out" +fi + +# Map: +kpartx -asv "$out" +loop=$(losetup -j "$out" | sed 's,:.*$,,;s,^/dev/,,') + +# Resize root filesystem: +if [ "$resize" != 0 ]; then + resize2fs "/dev/mapper/${loop}p2" +fi + +# Mount filesystems: +echo "🍞 Mounting" +MNT=$(mktemp -d -t toaster.XXXX) +mount "/dev/mapper/${loop}p2" "$MNT"/ +for mountpoint in /boot/firmware /boot/efi; do + if [ -e "$MNT/$mountpoint" ]; then + mount "/dev/mapper/${loop}p1" "$MNT/$mountpoint" + fi +done + +# Toast! +echo "🍞 Modifying" +export MNT +toast_me + +# Free all resources: +echo "🍞 Cleaning up" +umount -R "$MNT" +kpartx -dsv "$out" +rmdir "$MNT" + +echo "🍞 Toasted!" +echo " → $out"