#!/bin/bash set -eu if [ "$#" -lt 1 ]; then echo 'Need at least 1 parameter' echo '-h for help' exit 1 fi if [ "$1" = "-h" ]; then echo ' [dist] [arch] [mode] [boot]' echo '' echo 'Parameters:' echo 'seed preseed file.' echo 'img preferred image.' echo 'dist preferred distribution.' echo 'arch preferred architecture.' echo 'mode whitch mode you want to automatically launch the installer.' echo 'boot kernel boot options' echo '' echo 'List of supported values for each parameter and their defaults (*):' echo 'seed must be a valid path of an existsing file.' echo 'img netinst, netinst-mini*.' echo 'dist sid, stable*, unstable, stretch, testing.' echo 'arch amd64*, arm64, armhf, i386.' echo 'mode none*, auto, expert.' echo 'boot must be a set of valid kernel boot options' exit 0 fi if [ -z "$1" ]; then echo 'Parameter 1 should not be empty or not set!' echo 'Issue a valid path of a preseed file. Aborting...' exit 1 else PRESEED_PATH=$1 fi if [ -z "$2" ]; then IMAGE="netinst-mini" fi if [ -z "$3" ]; then DIST="stable" fi if [ -z "$4" ]; then ARCH="amd64" fi if [ -z "$5" ]; then MODE="none" fi if [ -f "$PRESEED_PATH" ] then echo "Preseed file '${PRESEED_PATH}' found." else echo "Preseed file '${PRESEED_PATH}' not found. Aborting..." exit 1 fi SUPPORTED_IMAGES="netinst netinst-mini" IMAGE=$2 if echo "${SUPPORTED_IMAGES}" | grep -w "${IMAGE}" > /dev/null; then echo "Image '${IMAGE}' supported" else echo "Image '${IMAGE}' not supported! Aborting..." exit 1 fi SUPPORTED_DIST="sid stable unstable stretch testing" DIST=$3 if echo "${SUPPORTED_DIST}" | grep -w "${DIST}" > /dev/null; then echo "Dist '${DIST}' supported" else echo "Dist '${DIST}' not supported! Aborting..." exit 1 fi SUPPORTED_ARCH="amd64 armhf arm64" ARCH=$4 if echo "${SUPPORTED_ARCH}" | grep -w "${ARCH}" > /dev/null; then echo "Architecture '${ARCH}' supported" else echo "Architecture '${ARCH}' not supported! Aborting..." exit 1 fi MIRROR="http://debian.mirror.garr.it" if [ "$IMAGE" == "netinst-mini" ]; then IMG_URL="${MIRROR}/debian/dists/${DIST}/main/installer-${ARCH}/current/images/netboot/mini.iso" else if [ "$IMAGE" == "netinst" ]; then IMG_URL="${MIRROR}/debian-cd/current/${ARCH}/iso-cd/debian-11.1.0-${ARCH}-${IMAGE}.iso" else echo "An error occurred in selecting the proper image. Aborting..." exit 1 fi fi FILE_ISO="debian-${DIST}-${ARCH}-${IMAGE}.iso" if [ -f "${FILE_ISO}" ] then echo "${FILE_ISO} found." else echo "${FILE_ISO} not found." echo "Downloading..." wget -O "${FILE_ISO}" "${IMG_URL}" fi SUPPORTED_MODE="none auto expert" MODE=$5 if echo "${SUPPORTED_MODE}" | grep -w "${MODE}" > /dev/null; then echo "Mode '${MODE}' supported" else echo "Mode '${MODE}' not supported! Aborting..." exit 1 fi echo "Extracting..." 7z x -oisofiles "${FILE_ISO}" # Adding a Preseed File to the Initrd: # You now have the directory isofiles with all the ISO's files in it. Make # initrd.gz writable by the user, uncompress it and append a preseed file to # the initrd. Recompress the initrd and return initrd.gz to its original # read-only state. #wget -O isofiles/linux https://d-i.debian.org/daily-images/amd64/daily/netboot/debian-installer/amd64/linux #wget -O isofiles/initrd.gz https://d-i.debian.org/daily-images/amd64/daily/netboot/debian-installer/amd64/initrd.gz cp "$PRESEED_PATH" preseed.cfg if [ "$IMAGE" == "netinst-mini" ]; then ISOLINUX_PATH="" echo "Patching initrd.gz..." gunzip isofiles/initrd.gz echo preseed.cfg | cpio -H newc -o -A -F isofiles/initrd gzip isofiles/initrd # Boot Parameters echo "Patching boot parameters..." if [ "$MODE" != "none" ]; then sed -i "/default/c\default $5" isofiles/isolinux.cfg sed -i '/prompt/c\prompt 1' isofiles/isolinux.cfg sed -i '/timeout/c\timeout 50' isofiles/isolinux.cfg fi sed -i "/append priority=low/c\ append priority=low vga=788 initrd=initrd.gz $5 --- " isofiles/adtxt.cfg sed -i "/append auto=true/c\ append auto=true priority=critical vga=788 initrd=initrd.gz $5 --- quiet " isofiles/adtxt.cfg else if [ "$IMAGE" == "netinst" ]; then ISOLINUX_PATH="isolinux" if [ "$ARCH" == "amd64" ]; then BUILD_ARCH="amd" else if [ "$ARCH" == "i386" ]; then BUILD_ARCH="386" else echo "Unsupported arch in the building process. Aborting..." exit 1 fi fi echo "Patching initrd.gz..." gunzip isofiles/install.${BUILD_ARCH}/initrd.gz echo preseed.cfg | cpio -H newc -o -A -F isofiles/install.${BUILD_ARCH}/initrd gzip isofiles/install.${BUILD_ARCH}/initrd # Boot Parameters echo "Patching boot parameters..." if [ "$MODE" != "none" ]; then sed -i "/default/c\default $5" isofiles/isolinux/isolinux.cfg sed -i '/prompt/c\prompt 1' isofiles/isolinux/isolinux.cfg sed -i '/timeout/c\timeout 50' isofiles/isolinux/isolinux.cfg fi sed -i "/append priority=low/c\ append priority=low vga=788 initrd=/install.${BUILD_ARCH}/initrd.gz $5 --- " isofiles/isolinux/adtxt.cfg sed -i "/append auto=true/c\ append auto=true priority=critical vga=788 initrd=/install.${BUILD_ARCH}/initrd.gz $5 --- quiet " isofiles/isolinux/adtxt.cfg else echo "An error occurred in selecting the proper image for build process. Aborting..." exit 1 fi fi # Import custom files into the ISO cp -ar custom isofiles/custom || echo "[WARNING] Cannot import 'custom' folder." # Creating a New Bootable ISO Image: # The following instructions suffice for i386 and amd64 in legacy BIOS mode. # The example names get mapped to their roles here orig_iso="$FILE_ISO" new_files=isofiles new_iso="preseed-${FILE_ISO}" mbr_template=isohdpfx.bin # Extract MBR template file to disk dd if="$orig_iso" bs=1 count=432 of="$mbr_template" # Create the new ISO image # https://wiki.debian.org/RepackBootableISO#What_is_a_bootable_ISO_9660_image_.3F echo "Generating patched iso image..." xorriso -as mkisofs \ -r -V "Debian $ARCH n" \ -o "$new_iso" \ -J -J -joliet-long -cache-inodes \ -isohybrid-mbr "$mbr_template" \ -b "${ISOLINUX_PATH}/isolinux.bin" \ -c boot.cat \ -boot-load-size 4 -boot-info-table -no-emul-boot \ -eltorito-alt-boot \ -e boot/grub/efi.img \ -no-emul-boot -isohybrid-gpt-basdat -isohybrid-apm-hfsplus \ "$new_files" #echo "Generating patched iso image..." #genisoimage -r -J -b isolinux.bin -c boot.cat \ # -no-emul-boot -boot-load-size 4 -boot-info-table \ # -o "preseed-${FILE_ISO}" isofiles echo "Cleaning temporary files..." rm -rf isofiles/ rm preseed.cfg rm isohdpfx.bin echo "Done." exit 0