#!/bin/sh # Notes {{{ # Mount or extract # At the end, mounting or extracting the iso use the same disk space, but # mount require root permissions, so i choose to extract the iso. # }}} # Vars {{{ DEBIAN_VERSION_NAME="stretch" DEBIAN_VERSION_NB="9.6.0" DEBIAN_ISO_DVD_URL="https://cdimage.debian.org/debian-cd/current/amd64/iso-dvd/debian-${DEBIAN_VERSION_NB}-amd64-DVD-1.iso" DEBIAN_ISO_NETINST_URL="https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-${DEBIAN_VERSION_NB}-amd64-netinst.iso" DEBIAN_ISO_MINI_URL="http://ftp.nl.debian.org/debian/dists/${DEBIAN_VERSION_NAME}/main/installer-amd64/current/images/netboot/mini.iso" TEMP_DIR_ISO=$(mktemp -d -t debian-iso-XXXXXX.tmp) DEBIAN_DL_ISO_PATH="${TEMP_DIR_ISO}/debian.iso" DEBIAN_PRESEED_ISO_PATH="$(dirname ${TEMP_DIR_ISO})/preseed-debian-${DEBIAN_VERSION_NB}-amd64.iso" # }}} #USE_DEBIAN_ISO="${DEBIAN_ISO_DVD_URL}" USE_DEBIAN_ISO="${DEBIAN_ISO_NETINST_URL}" #USE_DEBIAN_ISO="${DEBIAN_ISO_MINI_URL}" # Pre-requisites {{{ if [ ! $(command -v 7z) ]; then printf '%b\n' "ERROR : Please install '7z' bin :\\nsudo apt install p7zip-full" exit 1 fi if [ ! $(command -v gzip) ]; then printf '%b\n' "ERROR : Please install 'gzip' bin :\\nsudo apt install gzip" exit 1 fi if [ ! $(command -v genisoimage) ]; then printf '%b\n' "ERROR : Please install 'genisoimage' bin :\\nsudo apt install genisoimage" exit 1 fi # }}} # Test vars {{{ case $# in 1 ) PRESEED_FILE="${1}" ;; 2 ) PRESEED_FILE="${1}" USER_TEMP_DIR="${2}" ## Check user temp dir argument if [ ! -d "${USER_TEMP_DIR}" ]; then printf '%b\n' "ERROR : The first argument should be the path to a directory." exit 1 fi TEMP_DIR_ISO=$(mktemp -d -t debian-iso-XXXXXX.tmp -p "${USER_TEMP_DIR}") ;; * ) printf '%b\n' "Usage :" printf '%b\n' "$(basename $0) PRESEED_FILE_PATH [TEMP_DIR]" printf '%b\n' "-------" printf '%b\n' "PRESEED_FILE_PATH : Required" printf '%b\n' "Should be the absolut path to the preseed file you want to add to the ISO." printf '%b\n' "-------" printf '%b\n' "TEMP_DIR : Optionnal" printf '%b\n' "If you want to store temporary files and final ISO in a specific directory." printf '%b\n' "Note : This script require ISO size × 2 (eg for DVD. 3.4GB × 2)." printf '%b\n' "Otherwise \$TMPDIR will be used." ;; esac ## Check preseed argument if [ ! -f "${PRESEED_FILE}" ]; then printf '%b\n' "ERROR : The first argument should be the path to preseed file to add." exit 1 fi # }}} # Download and extract ISO {{{ wget -q "${USE_DEBIAN_ISO}" -O "${DEBIAN_DL_ISO_PATH}" command 7z x -o"${TEMP_DIR_ISO}" -- "${DEBIAN_DL_ISO_PATH}" > /dev/null rm -rf -- "${DEBIAN_DL_ISO_PATH}" # }}} # Manage initrd.gz file {{{ ## Exclude initrd.gz files from xen and gtk directories INITRD_GZ_PATH=$(find "${TEMP_DIR_ISO}" -type f \( -path '*xen*' -o -path '*gtk*' \) -prune -o -name "initrd.gz" -print -quit) ## Uncompress initrd.gz gunzip -- "${INITRD_GZ_PATH}" || exit 1 ## Add preseed file to initrd INITRD_PATH=$(find "${TEMP_DIR_ISO}" -type f \( -path '*xen*' -o -path '*gtk*' \) -prune -o -name "initrd" -print -quit) echo "${PRESEED_FILE}" | cpio --quiet -H newc -o -A -F "${INITRD_PATH}" ## Recompress to initrd.gz gzip -- "${INITRD_PATH}" || exit 1 ## Fix permissions in install directory chmod -w -R -- $(dirname -- "${INITRD_GZ_PATH}") # }}} # Generate new md5sum {{{ cd -- "${TEMP_DIR_ISO}" || exit 2 ## Exclude some unwanted files find . -follow -type f -not \( -name "md5sum.txt" -o -name 'mkisofs' -o -name 'Bootable_NoEmulation.img' -o -path '*isolinux*' \) -exec md5sum {} \; > ./md5sum.txt cd - || exit 2 # }}} # Generate new bootable iso {{{ genisoimage -r -J -b isolinux/isolinux.bin -c isolinux/boot.cat \ -quiet -no-emul-boot -boot-load-size 4 -boot-info-table \ -o "${DEBIAN_PRESEED_ISO_PATH}" "${TEMP_DIR_ISO}" # }}} # If extract image #rm -rf -- "${TEMP_DIR_ISO} exit 0