#! /bin/sh
# Created by Tobias Powalowski <tpowa@archlinux.org>
# Settings
APPNAME=$(basename "${0}")
CONFIG="/etc/mkisolinux.conf"
GENIMG=""
BURN="0"
BLANK="0"
TARNAME=""
export TEMPDIR=$(mktemp -d /tmp/mkisolinux.XXXX)
usage ()
{
    echo "${APPNAME}: usage"
    echo "  -g=IMAGE         Generate a ISO image as IMAGE"
    echo "  -c=CONFIG        Use CONFIG file. default: /etc/mkisolinux.conf"
    echo "  -B               Burn the ISO image after creation"
    echo "  -b               Blanking media first"
    echo "  -h               This message."
    exit 1
}

[ "$1" == "" ] && usage

while [ $# -gt 0 ]; do
	case $1 in
		-c=*|--c=*) CONFIG="$(echo $1 | awk -F= '{print $2;}')" ;;
		-g=*|--g=*) GENIMG="$(echo $1 | awk -F= '{print $2;}')" ;;
		-B|--B) BURN="1" ;;
		-b|--b) BLANK="1" ;;
		-t=*|--t=*) TARNAME="$(echo $1 | awk -F= '{print $2;}')" ;;
		-h|--h|?) usage ;; 
		*) usage ;;
		esac
	shift
done

if [ "${TARNAME}" = "" -a "${GENIMG}" = "" ]; then 
	echo "ERROR: No image name specified, please use the -g option"
	exit 1
fi

if [ ! -f "${CONFIG}" ]; then
	echo "config file '${CONFIG}' cannot be found, aborting..."
	exit 1
fi

. "${CONFIG}"
# export for mkinitcpio
[ -n "${APPENDBOOTMESSAGE}" ] && export APPENDBOOTMESSAGE
[ -n "${APPENDOPTIONSBOOTMESSAGE}" ] && export APPENDOPTIONSBOOTMESSAGE

export RUNPROGRAM="${APPNAME}"
export BOOTDIRNAME="boot/syslinux"

[ "${BOOTMESSAGE}" = "" ] && export BOOTMESSAGE=$(mktemp /tmp/bootmessage.XXXX)
[ "${OPTIONSBOOTMESSAGE}" = "" ] && export OPTIONSBOOTMESSAGE=$(mktemp /tmp/optionsbootmessage.XXXX)
[ "${ISONAME}" = "" ] && export ISONAME=$(mktemp /tmp/isoname.XXXX)
export USEKERNEL=${VERSION}

# begin script
mkdir -p ${TEMPDIR}/${BOOTDIRNAME}/
# prepare syslinux
install -m755 /usr/lib/syslinux/isolinux.bin ${TEMPDIR}/${BOOTDIRNAME}/isolinux.bin
for i in /usr/lib/syslinux/*.c32; do
    install -m644 $i ${TEMPDIR}/${BOOTDIRNAME}/$(basename $i)
done
install -m644 /usr/share/hwdata/pci.ids ${TEMPDIR}/${BOOTDIRNAME}/pci.ids
# create syslinux.cfg
echo ":: Creating syslinux.cfg ..."
if [ "${ISOLINUXCFG}" = "" ]; then
	[ -e  ${TEMPDIR}/${BOOTDIRNAME}/syslinux.cfg ] && rm  ${TEMPDIR}/${BOOTDIRNAME}/syslinux.cfg
	echo "prompt ${PROMPT}" >>  ${TEMPDIR}/${BOOTDIRNAME}/syslinux.cfg
	echo "timeout ${TIMEOUT}" >>  ${TEMPDIR}/${BOOTDIRNAME}/syslinux.cfg
	echo "display boot.msg" >>  ${TEMPDIR}/${BOOTDIRNAME}/syslinux.cfg
	echo "F1 boot.msg" >>  ${TEMPDIR}/${BOOTDIRNAME}/syslinux.cfg
	echo "F2 options.msg" >>  ${TEMPDIR}/${BOOTDIRNAME}/syslinux.cfg
	echo "default arch"  >>  ${TEMPDIR}/${BOOTDIRNAME}/syslinux.cfg
	echo "label arch" >>  ${TEMPDIR}/${BOOTDIRNAME}/syslinux.cfg
	echo "kernel /boot/vmlinuz" >>  ${TEMPDIR}/${BOOTDIRNAME}/syslinux.cfg
	echo "append initrd=/boot/initrd.img ${KERNEL_BOOT_OPTIONS}" >>  ${TEMPDIR}/${BOOTDIRNAME}/syslinux.cfg
else
	sed "s|@@PROMPT@@|${PROMPT}|g;s|@@TIMEOUT@@|${TIMEOUT}|g;s|@@KERNEL_BOOT_OPTIONS@@|${KERNEL_BOOT_OPTIONS}|g" \
		${ISOLINUXCFG} > ${TEMPDIR}/${BOOTDIRNAME}/syslinux.cfg
fi
[ ! -s ${TEMPDIR}/${BOOTDIRNAME}/syslinux.cfg ] && echo "No syslinux.cfg found" && exit 1

echo ":: Calling mkinitcpio CONFIG=${MKINITCPIO_CONFIG} KERNEL=${VERSION} ..." 
# generate initramdisk
echo ":: Creating initramdisk ..."
	mkinitcpio -c ${MKINITCPIO_CONFIG} -k ${VERSION} -g ${TEMPDIR}/boot/initrd.img
echo ":: Using ${KERNEL} as image kernel ..."
	install -m644 ${KERNEL} ${TEMPDIR}/boot/vmlinuz
	install -m644 ${BOOTMESSAGE} ${TEMPDIR}/${BOOTDIRNAME}/boot.msg
	install -m644 ${OPTIONSBOOTMESSAGE} ${TEMPDIR}/${BOOTDIRNAME}/options.msg
	[ ! -s ${TEMPDIR}/${BOOTDIRNAME}/boot.msg ] && echo 'ERROR:no boot.msg found, aborting!' && exit 1
	[ ! -s ${TEMPDIR}/${BOOTDIRNAME}/options.msg ] && echo 'ERROR:no options.msg found, aborting!' && exit 1
# create image
echo ":: Creating ISO image ..."
	[ -e ${GENIMG} ] && rm ${GENIMG}
	[ -s "${ISONAME}" ] && ISONAME=$(cat $ISONAME) || ISONAME="Arch Linux"
	mkisofs -RlDJLV "${ISONAME}" -b boot/syslinux/isolinux.bin -c boot/syslinux/boot.cat \
		-no-emul-boot -boot-load-size 4 -boot-info-table -o ${GENIMG} ${TEMPDIR}/ > /dev/null 2>&1 \
        && echo ":: ISO Image succesfull created at ${GENIMG}"
	# burning/blanking image
	if [ "$BLANK" = "1" ]; then
		echo ":: Blanking media DEVICE=${DEVICE}, BLANKMODE=${BLANKMODE}, SPEED=${SPEED} ..."
			cdrecord dev=${DEVICE} speed=${SPEED} blank=${BLANKMODE} > /dev/null 2>&1 && echo ":: Successfull."
	fi
	if [ "$BURN" = "1" ]; then
		echo ":: Burning ISO image DEVICE=${DEVICE}, SPEED=${SPEED} ..."
			cdrecord dev=${DEVICE} speed=${SPEED} -eject ${GENIMG}  > /dev/null 2>&1 && echo ":: Successfull."
	fi

# clean /tmp
rm -r ${TEMPDIR}
