diff --git a/rebuild.sh b/rebuild.sh new file mode 100755 index 0000000..a862465 --- /dev/null +++ b/rebuild.sh @@ -0,0 +1,66 @@ +#!/usr/bin/env bash +set -euo pipefail + +IMG="$HOME/Documents/toes-image-builder/toes-ubuntu-base.img" +USBBOOT="$HOME/apps/forks/usbboot" + +list_external_disks() { + diskutil list external physical 2>/dev/null | awk '/^\/dev\/disk[0-9]+ / { sub("^/dev/", "", $1); print $1 }' | sort || true +} + +disk_bytes() { + diskutil info "/dev/$1" | awk -F'[()]' '/Disk Size:/ { sub(/ Bytes.*/, "", $2); print $2; exit }' +} + +if [[ "${SKIP_BUILD:-0}" != 1 ]]; then + ssh toes-image-builder 'cd toes-image-builder && ./build.sh && cp build/toes-ubuntu-base.img /mnt/utm/toes-image-builder/' +fi + +[[ -f "$IMG" ]] || { echo "missing $IMG" >&2; exit 1; } + +target="${DISK:-}" +if [[ -n "$target" ]]; then + target="${target#/dev/}" + target="${target#r}" +else + before="$(mktemp)" + after="$(mktemp)" + trap 'rm -f "$before" "$after"' EXIT + list_external_disks >"$before" + sudo "$USBBOOT/rpiboot" -d "$USBBOOT/mass-storage-gadget64" + + for _ in {1..30}; do + list_external_disks >"$after" + new="$(comm -13 "$before" "$after")" + [[ -n "$new" ]] && { sleep 2; list_external_disks >"$after"; new="$(comm -13 "$before" "$after")"; break; } + sleep 1 + done + [[ -n "${new:-}" ]] || { echo "no new disks" >&2; exit 1; } + + echo "New disks:" + target_size=0 + for disk in $new; do + bytes="$(disk_bytes "$disk")" + echo " /dev/$disk ${bytes:-?} bytes" + [[ "$bytes" =~ ^[0-9]+$ ]] && (( bytes > target_size )) && { target="$disk"; target_size="$bytes"; } + done +fi + +[[ "${target:-}" =~ ^disk[0-9]+$ ]] || { echo "bad disk: ${target:-}" >&2; exit 1; } + +target_size="$(disk_bytes "$target")" +image_size="$(stat -f %z "$IMG")" +[[ "$target_size" =~ ^[0-9]+$ ]] || { echo "could not size /dev/$target" >&2; exit 1; } +(( target_size >= image_size )) || { echo "/dev/$target is smaller than $IMG" >&2; exit 1; } + +echo "Selected /dev/$target" +echo "Image: $IMG" +diskutil info "/dev/$target" +printf 'Type FLASH to erase /dev/%s: ' "$target" +read -r answer +[[ "$answer" == FLASH ]] || { echo "aborted"; exit 1; } + +diskutil unmountDisk "/dev/$target" +sudo dd if="$IMG" of="/dev/r$target" bs=16m status=progress conv=fsync +sync +diskutil eject "/dev/$target"