#!/bin/sh

if [ $# != 2 ]; then
 echo "Error: $0 image-source.iso image-target.iso" >&2
 exit 1
fi

ISO_SOURCE="$1"
ISO_TARGET="$2"

LABEL=$(file "$ISO_SOURCE"|cut -d\' -f2)

[ -x /usr/bin/genisoimage -o -x /usr/bin/mkisofs ] || apt-get install --yes genisoimage
[ -x /usr/bin/genisoimage -o -x /usr/bin/mkisofs ] || exit 2

[ -x /usr/bin/lzcat ] || apt-get install --yes lzma
[ -x /usr/bin/rpm2cpio ] || apt-get install --yes rpm

GENISOIMAGE=/usr/bin/genisoimage
[ -x /usr/bin/mkisofs ] && GENISOIMAGE=/usr/bin/mkisofs

VER=3.84
FILE=syslinux-$VER.tar.gz
URL=http://www.kernel.org/pub/linux/utils/boot/syslinux/$FILE

GFXBOOT_VER=3.83-1.23
GFXBOOT_ARCH=i586
GFXBOOT_FILE=syslinux-$GFXBOOT_VER.$GFXBOOT_ARCH.rpm
GFXBOOT_URL=http://download.opensuse.org/factory/repo/oss/suse/$GFXBOOT_ARCH/$GFXBOOT_FILE

TMP_SYSLINUX=$(mktemp -td update-isolinux.XXXXXX)
TMP_SOURCE=$(mktemp -td update-isolinux-source.XXXXXX)
TMP_TARGET=$(mktemp -td update-isolinux-target.XXXXXX)

ISOLINUX_FILE=isolinux/isolinux.bin
BOOTCAT=isolinux/boot.cat

[ -x /usr/bin/curl ] && LOAD="/usr/bin/curl -s"
[ -x /usr/bin/wget ] && LOAD="/usr/bin/wget -qO-"

mount -o loop -t iso9660 "$ISO_SOURCE" "$TMP_SOURCE"

if ! [ -f "$TMP_SOURCE"/$ISOLINUX_FILE ]; then
 cd "$TMP_SOURCE"
 ISOLINUX_FILE=$(find -name isolinux.bin|sed 's|^./||'|head -1)
 cd -
fi

if ! [ -f "$TMP_SOURCE"/$ISOLINUX_FILE ]; then
 echo Error: isolinux.bin not found! >&2
 umount "$TMP_SOURCE"
 rm -rf "$TMP_SOURCE" "$TMP_TARGET" "$TMP_SYSLINUX"
 exit 3
fi

cp -av "$TMP_SOURCE"/* "$TMP_TARGET"
[ -d "$TMP_SOURCE"/.disk ] && cp -av "$TMP_SOURCE"/.disk "$TMP_TARGET"

if ! [ -d "$TMP_TARGET"/isolinux ]; then
 ln -s -v "$TMP_TARGET"/"$(dirname $ISOLINUX_FILE)" "$TMP_TARGET"/isolinux
 GENISOIMAGE_OPTIONS="-f"
fi

umount "$TMP_SOURCE"

if grep -qi gfxboot "$TMP_TARGET"/"$(dirname $ISOLINUX_FILE)"/isolinux.cfg && [ -x /usr/bin/lzcat -a /usr/bin/rpm2cpio ]; then
 cd "$TMP_SYSLINUX"
 $LOAD $GFXBOOT_URL|rpm2cpio|lzcat|cpio -idv ./usr/bin/isohybrid ./usr/share/syslinux/isolinux.bin ./usr/share/syslinux/gfxboot.com
 cd -
 ISOLINUX="$TMP_SYSLINUX"/usr/share/syslinux/isolinux.bin
 ISOHYBRID="$TMP_SYSLINUX"/usr/bin/isohybrid
 GFXBOOT="$TMP_SYSLINUX"/usr/share/syslinux/gfxboot.com
 sed -i 's/.*\(gfxboot.*\)/ui \1/' "$TMP_TARGET"/"$(dirname $ISOLINUX_FILE)"/isolinux.cfg
else
 $LOAD $URL|tar -C "$TMP_SYSLINUX" -zxv
 ISOLINUX="$TMP_SYSLINUX"/syslinux-$VER/core/isolinux.bin
 ISOHYBRID="$TMP_SYSLINUX"/syslinux-$VER/utils/isohybrid
 unset GFXBOOT
fi

GENISOIMAGE_OPTIONS="$GENISOIMAGE_OPTIONS -J -l -cache-inodes -allow-multidot"
GENISOIMAGE_OPTIONS="$GENISOIMAGE_OPTIONS -no-emul-boot -boot-load-size 4 -boot-info-table"
GENISOIMAGE_OPTIONS="$GENISOIMAGE_OPTIONS -r -b $ISOLINUX_FILE"
[ -f "$TMP_TARGET"/$BOOTCAT ] && GENISOIMAGE_OPTIONS="$GENISOIMAGE_OPTIONS -c $BOOTCAT"
if [ "$LABEL" = "KANOTIX" ]; then
 GENISOIMAGE_OPTIONS="$GENISOIMAGE_OPTIONS -publisher kanotix.com"
 GENISOIMAGE_OPTIONS="$GENISOIMAGE_OPTIONS -p kanotix.com"
fi

rm -v "$TMP_TARGET"/"$ISOLINUX_FILE"
cp -v "$ISOLINUX" "$TMP_TARGET"/"$ISOLINUX_FILE"
[ "$GFXBOOT" ] && cp -v "$GFXBOOT" "$TMP_TARGET"/$(dirname "$ISOLINUX_FILE")

if [ "$LABEL" ]; then
 $GENISOIMAGE $GENISOIMAGE_OPTIONS -V "$LABEL" -o "$ISO_TARGET" "$TMP_TARGET"
else
 $GENISOIMAGE $GENISOIMAGE_OPTIONS -o "$ISO_TARGET" "$TMP_TARGET"
fi
$ISOHYBRID "$ISO_TARGET"
md5sum -b "$ISO_TARGET" > "$ISO_TARGET".md5

rm -rf "$TMP_SOURCE" "$TMP_TARGET" "$TMP_SYSLINUX"
