#!/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

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 ]; 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_SOURCE=$(mktemp -td create-syslinux-usb-drive-source.XXXXXX)
TMP_TARGET=$(mktemp -td create-syslinux-usb-drive-target.XXXXXX)

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

SYSLINUX=/usr/bin/syslinux
CHAIN_C32=/usr/lib/syslinux/chain.c32
MENU_C32=/usr/lib/syslinux/menu.c32
VESAMENU_C32=/usr/lib/syslinux/vesamenu.c32
GFXBOOT_C32=/usr/lib/syslinux/gfxboot.c32
MBR_BIN=/usr/lib/syslinux/mbr.bin

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

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

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

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

#$SFDISK -D -uM $TARGET <<EOT
#,$(ls -l "$SOURCE"|awk '{print int($5/2^20+0.5)+10}'),b,*
#,,83,
#EOT

SIZE_MB=$(ls -l "$SOURCE"|awk '{print int($5/2^20+0.5)+10}')
$SFDISK -f -L -uS $TARGET <<EOT
2048,$((2048*SIZE_MB)),b,*
$((2048*SIZE_MB+2048)),,83,
EOT

dd if=$MBR_BIN of=$TARGET
$MKDOSFS -F32 -n$LABEL ${TARGET}1
grep -qe --update $SYSLINUX && $SYSLINUX -i ${TARGET}1 || $SYSLINUX ${TARGET}1
LIVE_RW=live-rw
[ -d "$TMP_SOURCE"/casper ] && LIVE_RW=casper-rw
mkfs -t ext4 -m 0 -L $LIVE_RW ${TARGET}2

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

[ -f "$TMP_TARGET"/isolinux/menu.cfg ] && sed -i '/Kanotix/s/$/ - Persistent/;/boot=live/s/$/ persistent/' "$TMP_TARGET"/isolinux/menu.cfg

[ -f "$TMP_TARGET"/isolinux/live.cfg ] && sed -i '/Live/s/$/ - Persistent/;/boot=live/s/$/ persistent/' "$TMP_TARGET"/isolinux/live.cfg

[ -f "$TMP_TARGET"/isolinux/txt.cfg ] && sed -i '/Start/s/$/ - Persistent/;/boot=casper/s/$/ persistent/' "$TMP_TARGET"/isolinux/txt.cfg

umount "$TMP_SOURCE" "$TMP_TARGET"
sync

rm -rf "$TMP_SOURCE" "$TMP_TARGET"
