#!/bin/sh

# extract_defaults_from_raspios_img.sh
# 2025-10-17
# by Gernot Walzl

# This script extracts defaults (config files, list of installed packages)
# from a Raspberry Pi OS image file.
# It must be run as root on a Raspberry Pi.
# https://www.raspberrypi.com/software/operating-systems/

CWD=$(pwd)
IMAGE=$1
BASENAME=$(basename "$IMAGE" .img)
MNT_DIR=${MNT_DIR:-'/mnt/raspbian'}

print_usage () {
  echo "Usage: $0 IMAGE"
  echo "Example: $0 2025-10-01-raspios-trixie-arm64.img"
}

mount_image () {
  losetup -P /dev/loop1 "$IMAGE"
  mkdir "$MNT_DIR"
  mount /dev/loop1p2 "$MNT_DIR"
  mount /dev/loop1p1 "$MNT_DIR/boot/firmware"
}

umount_image () {
  umount "$MNT_DIR/boot/firmware"
  umount "$MNT_DIR"
  rmdir "$MNT_DIR"
  losetup -d /dev/loop1
}

extract_config () {
  cat "$MNT_DIR/boot/firmware/config.txt" \
    > "${CWD}/${BASENAME}_config.txt"
}

extract_packagelists () {
  chroot "$MNT_DIR" apt-mark showmanual \
    > "${CWD}/${BASENAME}_apt-mark_showmanual.txt"
  chroot "$MNT_DIR" apt-mark showauto \
    > "${CWD}/${BASENAME}_apt-mark_showauto.txt"
}

extract_etc () {
  cd "$MNT_DIR" || return 1
  tar cfJ "${CWD}/${BASENAME}_etc.tar.xz" --numeric-owner etc
  cd "$CWD"
}

if [ "$(id -u)" != "0" ]; then
  echo "This script must be run as root."
  exit 1
fi
if [ -z "$IMAGE" ]; then
  print_usage
  exit 1
fi
mount_image
extract_config
extract_packagelists
extract_etc
umount_image