#!/bin/bash set -Eeuo pipefail function cleanup() { trap - SIGINT SIGTERM ERR EXIT if [ -n "${tmpdir+x}" ]; then rm -rf "$tmpdir" log "🚽 Deleted temporary working directory $tmpdir" fi } trap cleanup SIGINT SIGTERM ERR EXIT script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd -P) [[ ! -x "$(command -v date)" ]] && echo "💥 date command not found." && exit 1 today=$(date +"%Y-%m-%d") function log() { echo >&2 -e "[$(date +"%Y-%m-%d %H:%M:%S")] ${1-}" } function die() { local msg=$1 local code=${2-1} # Bash parameter expansion - default exit status 1. See https://wiki.bash-hackers.org/syntax/pe#use_a_default_value log "$msg" exit "$code" } usage() { cat </dev/null if [ $? -ne 0 ]; then rm -f "${script_dir}/${ubuntu_gpg_key_id}.keyring~" die "👿 Verification of SHA256SUMS signature failed." fi rm -f "${script_dir}/${ubuntu_gpg_key_id}.keyring~" digest=$(sha256sum "${source_iso}" | cut -f1 -d ' ') set +e grep -Fq "$digest" "${script_dir}/SHA256SUMS-${sha_suffix}" if [ $? -eq 0 ]; then log "👍 Verification succeeded." set -e else die "👿 Verification of ISO digest failed." fi else log "🤞 Skipping verification of source ISO." fi log "🔧 Extracting ISO image..." xorriso -osirrox on -indev "${source_iso}" -extract / "$tmpdir" &>/dev/null chmod -R u+w "$tmpdir" rm -rf "$tmpdir/"'[BOOT]' log "👍 Extracted to $tmpdir" if [ ${use_hwe_kernel} -eq 1 ]; then if grep -q "hwe-vmlinuz" "$tmpdir/boot/grub/grub.cfg"; then log "☑️ Destination ISO will use HWE kernel." sed -i -e 's|/casper/vmlinuz|/casper/hwe-vmlinuz|g' "$tmpdir/isolinux/txt.cfg" sed -i -e 's|/casper/initrd|/casper/hwe-initrd|g' "$tmpdir/isolinux/txt.cfg" sed -i -e 's|/casper/vmlinuz|/casper/hwe-vmlinuz|g' "$tmpdir/boot/grub/grub.cfg" sed -i -e 's|/casper/initrd|/casper/hwe-initrd|g' "$tmpdir/boot/grub/grub.cfg" sed -i -e 's|/casper/vmlinuz|/casper/hwe-vmlinuz|g' "$tmpdir/boot/grub/loopback.cfg" sed -i -e 's|/casper/initrd|/casper/hwe-initrd|g' "$tmpdir/boot/grub/loopback.cfg" else log "⚠️ This source ISO does not support the HWE kernel. Proceeding with the regular kernel." fi fi log "🧩 Adding autoinstall parameter to kernel command line..." sed -i -e 's/---/ autoinstall ---/g' "$tmpdir/isolinux/txt.cfg" sed -i -e 's/---/ autoinstall ---/g' "$tmpdir/boot/grub/grub.cfg" sed -i -e 's/---/ autoinstall ---/g' "$tmpdir/boot/grub/loopback.cfg" log "👍 Added parameter to UEFI and BIOS kernel command lines." if [ ${all_in_one} -eq 1 ]; then log "🧩 Adding user-data and meta-data files..." mkdir "$tmpdir/nocloud" cp "$user_data_file" "$tmpdir/nocloud/user-data" if [ -n "${meta_data_file}" ]; then cp "$meta_data_file" "$tmpdir/nocloud/meta-data" else touch "$tmpdir/nocloud/meta-data" fi sed -i -e 's,---, ds=nocloud;s=/cdrom/nocloud/ ---,g' "$tmpdir/isolinux/txt.cfg" sed -i -e 's,---, ds=nocloud\\\;s=/cdrom/nocloud/ ---,g' "$tmpdir/boot/grub/grub.cfg" sed -i -e 's,---, ds=nocloud\\\;s=/cdrom/nocloud/ ---,g' "$tmpdir/boot/grub/loopback.cfg" log "👍 Added data and configured kernel command line." fi if [ ${md5_checksum} -eq 1 ]; then log "👷 Updating $tmpdir/md5sum.txt with hashes of modified files..." md5=$(md5sum "$tmpdir/boot/grub/grub.cfg" | cut -f1 -d ' ') sed -i -e 's,^.*[[:space:]] ./boot/grub/grub.cfg,'"$md5"' ./boot/grub/grub.cfg,' "$tmpdir/md5sum.txt" md5=$(md5sum "$tmpdir/boot/grub/loopback.cfg" | cut -f1 -d ' ') sed -i -e 's,^.*[[:space:]] ./boot/grub/loopback.cfg,'"$md5"' ./boot/grub/loopback.cfg,' "$tmpdir/md5sum.txt" log "👍 Updated hashes." else log "🗑️ Clearing MD5 hashes..." echo > "$tmpdir/md5sum.txt" log "👍 Cleared hashes." fi log "📦 Repackaging extracted files into an ISO image..." cd "$tmpdir" xorriso -as mkisofs -r -V "ubuntu-autoinstall-$today" -J -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -isohybrid-mbr /usr/lib/ISOLINUX/isohdpfx.bin -boot-info-table -input-charset utf-8 -eltorito-alt-boot -e boot/grub/efi.img -no-emul-boot -isohybrid-gpt-basdat -o "${destination_iso}" . &>/dev/null cd "$OLDPWD" log "👍 Repackaged into ${destination_iso}" die "✅ Completed." 0