#!/bin/sh
# PLD RescueCD modifier 0.1
# (c) areq@pld.org.pl

ISOSIZE=53645312

usage ()
{
echo Usage:
echo isomod -i isofile [-o isofile.out] [-f local_file] [-d unpack_dir] [-tail\|-dd]
echo 
echo "Example:"
echo "  isomod -i rescue.iso -f local.tar.bz -o rescue_new.iso"
echo "   Add local.tar.bz to rescue.iso and save as rescue_new.iso."
echo 
echo "  isomod -i rescue.iso -d files"
echo "   Save all files from rescue.iso to direcory files."
echo
echo "  isomod -i rescue.iso -d files -dd"
echo "   Save all files from rescue.iso to direcory files use dd - slow."
echo
echo "  isomod -d files -o rescue_new.iso"
echo "   Create rescue_new.iso from directory files."
echo
exit 1
}

un_tail ()
{
 tail -c $(($ISOSIZE-$2)) $ISO | head -c $3 > $1
}
un_dd ()
{
 dd if=$ISO of=$1 skip=$2 count=$3 bs=1 2> /dev/null
}

unpack ()
{
 mkdir -p $(dirname $1)
 un_$METHOD $*
 echo "$4  $1" | md5sum -c
}
mkiso ()
{
LOG=`mktemp /tmp/isomod.$$.XXXXXX` || exit 1
echo Save log to $LOG.
mkisofs -v -L -R -D -b boot/isolinux/isolinux.bin -c boot/isolinux/boot.catalog \
-no-emul-boot -boot-load-size 4 -boot-info-table -log-file $LOG -o $2 $1
echo Saved $2.
}

unpack_all ()
{
while read file start len md5; 
do 
 unpack $DIR/$file $start $len $md5
done << __EOT__
rescue.iso 57344 45957120 b1fa0864d5cf32b0c76ce11c3484b7f5
boot/boot.bat 46014464 78 395543c7421aee092f990f31f323e6d4
boot/bootauto.bat 46016512 98 8449b7b684955c608078b483dd962283
boot/fdd-boot.img.gz 46018560 121624 9a94c231b8617162d67e24e3b83838c6
boot/gzip.exe 46141440 39910 468c7ede345425ea4b7db63360084743
boot/isolinux/initrd.ide 51838976 540672 7f35b90579c39cb797710b09eb7ab98e
boot/isolinux/initrd 46239744 5599232 94c8c709b6c01cc32f9e8bbc205d13a6
boot/isolinux/isolinux.bin 52379648 9400 a13dffcffd3b5e75f06389a25671cf35
boot/isolinux/isolinux.cfg 52389888 453 72e595becf035b56bbd8869d110da3bb
boot/isolinux/ldlinux.bin 52391936 8348 ff6b67de47f5959770b818bff5de8d8d
boot/isolinux/ldlinux.sys 52392448 7836 207d71c27b952613784d1f51b9921524
boot/isolinux/memtest 52410368 80324 5f57f1bd80f4a0c97f357b4ca94d7a1f
boot/isolinux/vmlinuz 52492288 845038 f68a8d42b5caa379f2fc1bbee944fdb5
boot/isolinux/help.msg 46237696 962 a5bf646f86ed4b981b7290067257d55c
boot/isolinux/boot.msg 46235648 1469 bdd62bcb786483b15eb137f6f194fcc7
boot/loadlin.exe 46186496 32208 81d0270ee44075a1afb88b0aedcd27fe
boot/rawrite.exe 46219264 14305 0606c3411a930ffa4cf1d53e7e931af5
__EOT__
}

echo PLD RescueCD modifier 0.1
echo

[ $# -eq 0 ] && usage

METHOD=tail
RMOUT=0
while [ $# -ge 1 ]; do
  case $1 in
    -i)     shift;  ISO=$1 ;;
    -o)     shift;  OUT=$1 ;;
    -d)     shift;  DIR=$1 ;;
    -f)     shift;  FILE=$1 ;;
    -dd)    METHOD=dd;;
    -tail)  METHOD=tail ;;
    *)     usage ;;
  esac
  shift
done

if [ "$DIR" = "" ] 
then
 DIR=`mktemp -d /tmp/$$.XXXXXX` || exit 1
 RMOUT=1
fi

if [ "$FILE" != "" ] 
then
 echo Checking $FILE...
 [ -f "$FILE" ] || exit 1
 [ "$(head -c 3 "$FILE")" = "BZh" ] || exit 1
 bzip2 -dc "$FILE" | tar tf - | sed 's/\.\///' |\
 	grep -v -q -E "^$|^etc|^tmp|^var|^root|^home"
 if [ $? == 0 ]; then
      echo -e "PANIC! $FILE contains invalid paths! quitting.\n"
      exit 1
 fi
 echo OK
fi

if [ -n "$ISO" ]
then
  if ! [ -f "$ISO" ] 
  then
    echo File $ISO not found!
  exit 1
  fi
  if ! [ $(stat -c %s $ISO) -eq $ISOSIZE ]
  then
    echo Bad iso file $ISO!
  exit 1
  fi
  unpack_all
fi

if [ -n "$FILE" ] ; then
  rm -fr $DIR/local.tar.bz2
  cp $FILE $DIR/local.tar.bz2
  echo Add $FILE.
fi

[ -n "$OUT" ] && mkiso $DIR $OUT

[ $RMOUT -eq 1 ] && rm -fr $DIR
