#!/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 genisoimage
[ -x /usr/bin/genisoimage -o -x /usr/bin/mkisofs ] || exit 2

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

URLBASE=http://www.kernel.org/pub/linux/utils/boot/syslinux/4.xx
VER=$(wget -qO- $URLBASE/'?C=M;O=D'|awk -F- '/.tar.gz/{print $2}'|sed 's/.tar.gz.*//'|head -1)
FILE=syslinux-$VER.tar.gz
URL=$URLBASE/$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="$TMP_SYSLINUX"/syslinux-$VER/core/isolinux.bin
ISOHYBRID="$TMP_SYSLINUX"/syslinux-$VER/utils/isohybrid

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"

$LOAD $URL|tar -C "$TMP_SYSLINUX" -zxv

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"

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"
