#!/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”