#!/bin/bash

#=======================================
# Globals
#---------------------------------------
CD_PREPARER="CD-Team, http://bugs.opensuse.org/"
CD_PUBLISHER="Novell, Inc."

#=======================================
# Globals
#---------------------------------------
PARAMS="-r -J -pad -joliet-long"
SORTFILE=`mktemp /var/tmp/m_cd-XXXXXX`
SOURCE2=`mktemp -d /var/tmp/m_cd-XXXXXX`
ROOT_ON_CD=suse
BOOT_BASE_DIR=boot
BOOT_IMAGE=$BOOT_BASE_DIR/image
BOOT_ISOLINUX=$BOOT_BASE_DIR/loader

#=======================================
# Parameters
#---------------------------------------
SOURCE=$1  # source tree
DEST=$2    # output file

#=======================================
# check /boot/<arch>/loader layout
#---------------------------------------
if [ -d $SOURCE/$BOOT_BASE_DIR/s390x ] ; then
	BOOT_BASE_DIR_Z=$BOOT_BASE_DIR/s390x
	BOOT_BASE_DIR=$BOOT_BASE_DIR/i386
	BOOT_IMAGE=$BOOT_BASE_DIR/image
	BOOT_ISOLINUX=$BOOT_BASE_DIR/loader
elif [ -d $SOURCE/$BOOT_BASE_DIR/s390 ] ; then
	BOOT_BASE_DIR_Z=$BOOT_BASE_DIR/s390
	BOOT_BASE_DIR=$BOOT_BASE_DIR/i386
	BOOT_IMAGE=$BOOT_BASE_DIR/image
	BOOT_ISOLINUX=$BOOT_BASE_DIR/loader
elif [ -d $SOURCE/$BOOT_BASE_DIR/i386 ] ; then
	BOOT_BASE_DIR=$BOOT_BASE_DIR/i386
	BOOT_IMAGE=$BOOT_BASE_DIR/image
	BOOT_ISOLINUX=$BOOT_BASE_DIR/loader
elif [ -d $SOURCE/$BOOT_BASE_DIR/x86_64 ] ; then
	BOOT_BASE_DIR=$BOOT_BASE_DIR/x86_64
	BOOT_IMAGE=$BOOT_BASE_DIR/image
	BOOT_ISOLINUX=$BOOT_BASE_DIR/loader
elif [ -d $SOURCE/$BOOT_BASE_DIR/ia64 ] ; then
	BOOT_BASE_DIR=$BOOT_BASE_DIR/ia64
	BOOT_IMAGE=$BOOT_BASE_DIR/efi
fi

#=======================================
# Create ISO
#---------------------------------------
TMP_LS=`/bin/ls -d $SOURCE/*/update 2> /dev/null`
if test -d $SOURCE/$BOOT_BASE_DIR \
	-o -d $SOURCE/$ROOT_ON_CD -o ! -z "$TMP_LS"
then
	if test -f $SOURCE/$BOOT_IMAGE -o -f $SOURCE/.boot \
		-o -d $SOURCE/$BOOT_ISOLINUX \
		-o -f $SOURCE/ppc/bootinfo.txt -o -d $SOURCE/suseboot \
		-o -d $SOURCE/etc -o -f $SOURCE/boot/silo.conf
	then
		mkdir -p $SOURCE2 || { echo "can't create tmpdir $SOURCE2" ; exit 1 ; }
		chmod 755 $SOURCE2
		if [ -f $SOURCE/.boot ] ; then
			PARAMS="$PARAMS -b .boot -c boot.catalog"
			echo found boot image. Making CD bootable.
			mkdir -p $SOURCE2/$BOOT_BASE_DIR || exit 1
		elif [ -f $SOURCE/$BOOT_IMAGE ] ; then
			# needed for ia64
			PARAMS="$PARAMS -no-emul-boot -boot-load-size 1"
			echo "$SOURCE2/$BOOT_BASE_DIR/boot.catalog 2" >$SORTFILE
			echo "$SOURCE/$BOOT_IMAGE 1" >>$SORTFILE
			PARAMS="$PARAMS -sort $SORTFILE -b $BOOT_IMAGE \
					-c $BOOT_BASE_DIR/boot.catalog \
					-hide $BOOT_BASE_DIR/boot.catalog \
					-hide-joliet $BOOT_BASE_DIR/boot.catalog"
			echo found boot image. Making CD bootable.
			mkdir -p $SOURCE2/$BOOT_BASE_DIR || exit 1
		elif [ -d $SOURCE/$BOOT_ISOLINUX ] ; then
			echo "$SOURCE2/$BOOT_BASE_DIR/boot.catalog 3" >$SORTFILE
			echo "$BOOT_BASE_DIR/boot.catalog 3" >>$SORTFILE
			echo "$SOURCE/$BOOT_BASE_DIR/boot.catalog 3" >>$SORTFILE
			find $SOURCE/$BOOT_ISOLINUX -printf "%p 1\n" >>$SORTFILE
			# last priority wins
			echo "$SOURCE/$BOOT_ISOLINUX/isolinux.bin 2" >>$SORTFILE
			echo "sortfile has"
			cat $SORTFILE
			echo "end sortfile"
			# isolinux expects a directory
			PARAMS="$PARAMS -sort $SORTFILE -no-emul-boot \
				-boot-load-size 4 -boot-info-table \
				-b $BOOT_ISOLINUX/isolinux.bin \
				-c $BOOT_BASE_DIR/boot.catalog \
				-hide $BOOT_BASE_DIR/boot.catalog \
				-hide-joliet $BOOT_BASE_DIR/boot.catalog"
			echo found boot image. Making CD bootable.
			mkdir -p $SOURCE2/$BOOT_BASE_DIR || exit 1
			if [ -f $SOURCE/$BOOT_BASE_DIR/efi ]; then
				PARAMS="$PARAMS -eltorito-alt-boot -no-emul-boot -boot-load-size 1 -b $BOOT_BASE_DIR/efi"
			fi
		elif [ -d $SOURCE/ppc ]; then
		if [ -f $SOURCE/ppc/bootinfo.txt ] ; then
		# assume thats a pSeries/iSeries CD
		  echo "adding -chrp-boot for CHRP boot"
		  PARAMS="$PARAMS -chrp-boot"
		fi
		# check if a PReP install file is available
		if [ -f $SOURCE/boot/zImage.prep.initrd ] ; then
			PARAMS="$PARAMS -prep-boot boot/zImage.prep.initrd"
			echo using boot/zImage.prep.initrd for PReP boot
		elif [ -f $SOURCE/suse/images/zImage.prep.initrd ] ; then
			PARAMS="$PARAMS -prep-boot suse/images/zImage.prep.initrd"
			echo using suse/images/zImage.prep.initrd for PReP boot
		fi
		# check if a pmac kernel is available
		if [ -d $SOURCE/suseboot ] ; then
			# create a mac partition table
			# use netatalk and macbinary filename translation
			# bless a directory named suseboot, mark it bootable
			echo using suseboot for hfs boot
			PARAMS="`echo $PARAMS | sed 's/-f//g'`"
			PARAMS="`echo $PARAMS | sed 's/-joliet-long//g'`"
			PARAMS="`echo $PARAMS | sed 's/-J//g'` -U -T -l"
			PARAMS="$PARAMS -part --netatalk --macbin -hfs-bless $SOURCE/suseboot"
			if [ -f /work/cd/lib/m_cd/apple.filemapping.txt ] ; then
				echo using /work/cd/lib/m_cd/apple.filemapping.txt for hfs mapping
				PARAMS="$PARAMS -map /work/cd/lib/m_cd/apple.filemapping.txt"
			else
				echo /work/cd/lib/m_cd/apple.filemapping.txt not found
				echo not a blocker but should be fixed
			fi
		fi
		if test -f $SOURCE/content ; then
			for i in $SOURCE/media.? ; do
				if test -d $i ; then
					number=${i##*.}
				fi
				break
			done
			name="`awk '/^(NAME|PRODUCT)[[:blank:]]/ { print $2 }' $SOURCE/content`"
			version="`awk '/^VERSION[[:blank:]]/ { print $2 }' $SOURCE/content`"
			if test -n "$name" ; then
				hfsvolid="$name"
			fi
			if test -n "$version" ; then
				hfsvolid="$hfsvolid $version"
			fi
			if test -n "$hfsvolid" ; then
				if test -n "$number" ; then
					hfsvolid="`echo $hfsvolid | cut -b -25` $number"
				fi
			else
				i=$SOURCE/media.1/build
				if test -f $i ; then
					hfsvolid="`awk '{
					l=length($0);
					if (l>27)
						l=l-27;
					else
						l=0;
					printf("%s", substr($0,l))
					}' $i`"
				else
					hfsvolid=${SOURCE##*/}
				fi
			fi
		fi
		#hfsvolid=`echo $hfsvolid | tr ' ' '-'`
		PARAMS="$PARAMS -hfs-volid '$hfsvolid'"
		else
			if [ -d $SOURCE/etc ] ; then
				echo found $SOURCE/etc. put it at the beginning of iso image.
				mkdir -p $SOURCE2/etc || exit 1
			else
				if [ -f $SOURCE/boot/silo.conf ] ; then
					PARAMS="$PARAMS -silo-boot boot/second.b -s /boot/silo.conf"
					echo found SPARC boot config. Making CD bootable.
					mkdir -p $SOURCE2/boot || exit 1
				fi
			fi
		fi
		XPARAMS="$SOURCE2"
	else 
		echo found no boot image. No bootable CD.
	fi

	if test -f $SOURCE/content -a -z "$TMP_LS" ; then
		# we already collected this above
		APPID=$DISTIDENT
	elif test -f $SOURCE/$DESCRDIR/info ; then
		set -- `fgrep DIST_IDENT $SOURCE/$DESCRDIR/info`
		APPID=$2
	else
		# If we have directory "update" in the second level, we assume
		# this is a Patch-CD
		if test ! -z "$TMP_LS" ; then
		if test -f $SOURCE/media.1/patches ; then
			APPID="`cat $SOURCE/media.1/patches|sed -e"s|/ ||g" | tr " " _`"
		else
			APPID="`cat $SOURCE/.S.u.S.E-disk-* | tr " " _`"
		fi
		fi
	fi
	if test -z "$APPID" \
		-a -f $SOURCE/$ROOT_ON_CD/MD5SUMS \
		-a -f $SOURCE/.S.u.S.E-disk-*
	then
		APPID=`cat $SOURCE/.S.u.S.E-disk-*|tr " " - |sed -e"s@-Version-@-@"`
		APPID="$APPID.0#0"
	fi
	APPID=`echo $APPID | tr " " -`

	if test -f $SOURCE/content ; then
		MEDIANUMBER=1
		for i in $SOURCE/media.? ; do
			test -d $i || continue
			MEDIADIR=`ls -d $SOURCE/media.?`
			MEDIANUMBER=${MEDIADIR##$SOURCE/media.}
		done
		VOL="0$MEDIANUMBER"
                APPID=`sed -n -e "s/^LABEL[ ]*\(.*\)/\1/p" "$SOURCE/content" | sed -e "s/ /-/g"`
	elif test -f $SOURCE/.S.u.S.E-disk-* ; then
		BASE=`basename $SOURCE/.S.u.S.E-disk-*`
		VOL=`echo $BASE | cut -c 16-17`
	fi
	if test -n "$VOL" ; then
		DIS=`echo $APPID | sed -e "s/.*-//" | tr -d \.\#`
		VOL_PREFIX="SU"
		case "$APPID" in
			*Basic*)
				KND="B"
			;;
			*Evaluation*)
				KND="E"
			;;
			*FTP*)
				KND="F"
			;;
			*full*)
				KND="Z"
			;;
			*ITP*)
				KND="I"
			;;
			*Runtime*)
				KND="R"
			;;
			*Patch-CD*)
				DIS="PATCH"
				KND="P"
			;;
			*)
				KND="0"
			;;
		esac
# FIXME !! This is version + release without dots !
FIXME="1110"
		VOL="$VOL_PREFIX$FIXME.$KND$VOL" # Dropped $DIS to be sure
		if test -n "$VOL" ; then
			PARAMS="$PARAMS -V $VOL"
		fi
	fi
	test -n "$APPID" && PARAMS="$PARAMS -A $APPID"
fi

if [ -f $SOURCE/$BOOT_ISOLINUX/isolinux.bin ] ; then
  if [ ! -x /usr/bin/isolinux-config ];then
	echo "Can't find isolinux-config binary"
	exit 1
  fi
  /usr/bin/isolinux-config \
	--base $BOOT_ISOLINUX $SOURCE/$BOOT_ISOLINUX/isolinux.bin
fi

echo "Calling mkisofs with the following parameters:"
echo "-p $CD_PREPARER -A -"
echo "-publisher $CD_PUBLISHER"
echo "PARAMS=$PARAMS"
echo "XPARAMS=$XPARAMS"

eval mkisofs \
	-p "'$CD_PREPARER'" -A "-" \
	-publisher "'$CD_PUBLISHER'" \
	$PARAMS -o $DEST $XPARAMS $SOURCE
code=$?

#=======================================
# Clean up
#---------------------------------------
if [ -d "$SOURCE2" ] ; then
	echo removing $SOURCE2
	rm -r $SOURCE2
fi

if [ -e "$SORTFILE" ] ; then
	echo removing $SORTFILE
	rm -f "$SORTFILE"
fi

exit $code
