#!/usr/bin/env bash

# from github.com/cdown/rebuild-debian-iso

shopt -s globstar

input_iso=$1 output_iso=$2 preseed=$3 input_file_dir=$4

msg() {

printf '>>> %s\n' "$@"

}

if ! [[ -r $input_iso && -r $preseed ]]; then

printf '%s\n' \
    "Usage: ${0##*/} <input-iso> <output-iso> <preseed-file> [file-dir]" \
    "" \
    "input-iso:    the debian iso to modify" \
    "output-iso:   where to store the modified iso" \
    "preseed-file: the location of a preseed file to inject" \
    "file-dir:     an optional directory to be put at extra/ in the iso"
exit 1

fi

iso_dir=$(mktemp -d) initrd_dir=$(mktemp -d)

msg “Extracting source image” # TODO check that bsdtar is installed bsdtar -C “$iso_dir” -xf “$input_iso”

ls $iso_dir/install initrd=$iso_dir/install/initrd.gz

( cd “$initrd_dir” msg “Extracting initrd” gzip -d < “$initrd” | cpio -i –no-absolute-filenames )

msg “Injecting preseed” cp “$preseed” “$initrd_dir/preseed.cfg”

( msg “Rebuilding initrd” cd “$initrd_dir” find . -print0 | cpio -H newc -o -0 | gzip -9 > “$initrd” )

msg “Setting up automatic booting to preseed” sed -i 's/timeout 0/timeout 5/' “$iso_dir/isolinux/isolinux.cfg” sed -i '/^tappend/d' “$iso_dir/isolinux/txt.cfg” printf 'tappend vga=788 initrd=/install.amd/initrd.gz auto textn' >> “$iso_dir/isolinux/txt.cfg”

if [[ $input_file_dir ]]; then

msg "Adding custom files to 'extra' dir on image"
cp -a "$input_file_dir" "$iso_dir/extra"

fi

msg “Generating md5sums” ( cd “$iso_dir” && find . -type f -exec md5sum {} + > md5sum.txt )

msg “Generating output ISO image” mkisofs -quiet \

-o "$output_iso" \
-r -J -no-emul-boot -boot-load-size 4 -boot-info-table \
-b isolinux/isolinux.bin -c isolinux/boot.cat \
"$iso_dir"

msg “Removing temporary directories” rm -rf “$iso_dir” “$initrd_dir”

msg “Output ISO generated: $output_iso”