#!/bin/sh
if [ $# != 2 ]; then
 echo "Usage: $0 image.iso /dev/usb-drive" >&2
 exit 1
fi

if [ $(id -u) != 0 ]; then
 echo "Error: You must be root to run this script!" >&2
 exit 2
fi

if ! [ -x /usr/bin/mcopy ]; then
 apt-get update && apt-get install --yes mtools
fi

if ! [ -x /usr/bin/mcopy ]; then
 echo "Error: Please install mtools first!" >&2
 exit 3
fi

SOURCE="$1"
TARGET="$2"

LABEL=$(file "$SOURCE"|cut -d\' -f2|sed 's/ß/ss/g;s/Ä/Ae/g;s/Ö/Oe/g;s/Ü/Ue/g;s/ä/ae/g;s/ö/oe/g;s/ü/ue/g;s/?//g;s/#/-/g;s/ *$//g'|tr ' :' '_-')

if [ $? != 0 ] || [ ! -r "$SOURCE" ]; then
 echo "Error: $SOURCE is no iso file" >&2
 exit 3
fi

[ -z "$LABEL" ] && LABEL="USB_BOOT"

REM=$(cat /sys/block/${TARGET#/dev/}/removable 2>/dev/null)

if [ "$REM" != "1" ]; then
 echo "Error: No removeable drive $TARGET" >&2
 exit 4
fi

TMP_SYSLINUX=$(mktemp -td create-syslinux-usb-drive.XXXXXX)
TMP_SOURCE=$(mktemp -td create-syslinux-usb-drive-source.XXXXXX)
TMP_TARGET=$(mktemp -td create-syslinux-usb-drive-target.XXXXXX)

mount -o loop,ro "$SOURCE" "$TMP_SOURCE"

URLBASE=https://www.kernel.org/pub/linux/utils/boot/syslinux/6.xx
VER=$(wget -qO- $URLBASE/'?C=M;O=D'|awk -F- '/.tar.xz/{print $2}'|sed 's/.tar.xz.*//'|head -1)
FILE=syslinux-$VER.tar.xz
URL=$URLBASE/$FILE

SYSLINUX="$TMP_SYSLINUX"/syslinux-$VER/bios/mtools/syslinux
CHAIN_C32="$TMP_SYSLINUX"/syslinux-$VER/bios/com32/chain/chain.c32
MENU_C32="$TMP_SYSLINUX"/syslinux-$VER/bios/com32/menu/menu.c32
VESAMENU_C32="$TMP_SYSLINUX"/syslinux-$VER/bios/com32/menu/vesamenu.c32
GFXBOOT_C32="$TMP_SYSLINUX"/syslinux-$VER/bios/com32/gfxboot/gfxboot.c32
LIBCOM_C32="$TMP_SYSLINUX"/syslinux-$VER/bios/com32/lib/libcom32.c32
LIBUTIL_C32="$TMP_SYSLINUX"/syslinux-$VER/bios/com32/libutil/libutil.c32
MBR_BIN="$TMP_SYSLINUX"/syslinux-$VER/bios/mbr/mbr.bin

OPTIONS="umask=000,shortname=mixed,quiet,utf8"

SFDISK=/sbin/sfdisk
MKDOSFS=/sbin/mkdosfs

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

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

umount -l $TARGET* 2>/dev/null

dd if=/dev/zero of=$TARGET bs=1M count=1

#$SFDISK -D -uM $TARGET <<EOT
#,,ef,*
#EOT

#$SFDISK -f -L -uS $TARGET <<EOT
#2048,,ef,*
#EOT

$SFDISK -f -L -uS $TARGET <<EOT
2048,,b,*
EOT

dd if=$MBR_BIN of=$TARGET
$MKDOSFS -F32 -n$LABEL ${TARGET}1
$SYSLINUX ${TARGET}1

mount -o $OPTIONS ${TARGET}1 "$TMP_TARGET"

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

if [ -d "$TMP_TARGET"/isolinux ]; then
 sed -ri 's|(^display\s+)([a-zA-Z0-9])|\1/isolinux/\2|' "$TMP_TARGET"/isolinux/*.cfg
 sed -ri 's|(^include\s+)([a-zA-Z0-9])|\1/isolinux/\2|' "$TMP_TARGET"/isolinux/*.cfg
 sed -ri 's|(^f.\s+)([a-zA-Z0-9])|\1/isolinux/\2|' "$TMP_TARGET"/isolinux/*.cfg
 sed -i 's|^default vesamenu.c32|default /isolinux/vesamenu.c32|' "$TMP_TARGET"/isolinux/isolinux.cfg
 sed -ri 's|(^ui)|#\1|' "$TMP_TARGET"/isolinux/isolinux.cfg
 [ -f "$TMP_TARGET"/isolinux/stdmenu.cfg ] && sed -ri 's|^(menu background )(splash.png)|\1/isolinux/\2|' "$TMP_TARGET"/isolinux/stdmenu.cfg
 for x in menu.cfg exithelp.cfg; do
  [ -f "$TMP_TARGET"/isolinux/$x ] && sed -ri 's|(config\s+)([a-zA-Z0-9])|\1/isolinux/\2|' "$TMP_TARGET"/isolinux/$x
 done
fi

if [ -f "$TMP_TARGET"/isolinux/isolinux.cfg ]; then
 if [ -f "$TMP_TARGET"/isolinux/menu.c32 ]; then
  rm -f "$TMP_TARGET"/isolinux/menu.c32
  cp -v $MENU_C32 "$TMP_TARGET"/isolinux
 fi
 if [ -f "$TMP_TARGET"/isolinux/vesamenu.c32 ]; then
  rm -f "$TMP_TARGET"/isolinux/vesamenu.c32
  cp -v $VESAMENU_C32 "$TMP_TARGET"/isolinux
 fi
 if [ -f "$TMP_TARGET"/isolinux/data/vesamenu.c32 ]; then
  rm -f "$TMP_TARGET"/isolinux/data/vesamenu.c32
  cp -v $VESAMENU_C32 "$TMP_TARGET"/isolinux/data
 fi
 if [ -f "$TMP_TARGET"/isolinux/gfxboot.c32 ]; then
  rm -f "$TMP_TARGET"/isolinux/gfxboot.c32
  cp -v $GFXBOOT_C32 "$TMP_TARGET"/isolinux
 fi
 if ! grep -q isolinux "$TMP_TARGET"/isolinux/isolinux.cfg; then
  mv -v "$TMP_TARGET"/isolinux "$TMP_TARGET"/syslinux
  cp -v "$TMP_TARGET"/syslinux/isolinux.cfg "$TMP_TARGET"/syslinux/syslinux.cfg
 else
  cp -v "$TMP_TARGET"/isolinux/isolinux.cfg "$TMP_TARGET"/syslinux.cfg
 fi
fi

if [ -f "$TMP_TARGET"/bootmgr ]; then
 cp -v $CHAIN_C32 "$TMP_TARGET"
 cat > "$TMP_TARGET"/syslinux.cfg <<EOT
default chain.c32 hd0,1 ntldr=/bootmgr
EOT
fi

cp -v $LIBCOM_C32 $LIBUTIL_C32 "$TMP_TARGET"

umount "$TMP_SOURCE" "$TMP_TARGET"
sync

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