#!/bin/busybox ash
#(c) Robert Shingledecker 2009-2011

. /etc/init.d/tc-functions
useBusybox
checkroot

read USER < /etc/sysconfig/tcuser
TCEINSTALLED="/usr/local/tce.installed"

process_normal_tcedir() {
	[ -z "$TCE" ] && TCE="$(tc_autoscan 'tce' 'd')"/tce
	if [ "$TCE" != "/tce" ]; then
		TCE_DEVICE="${TCE%%/*}"
		TCE_DIR="${TCE#*/}"
		if [ "$TCE_DEVICE" = "$TCE_DIR" ]; then TCE_DIR="tce"; fi
		find_mountpoint "$TCE_DEVICE"
		if [ -n "$MOUNTPOINT" ]; then
			if [ "$MOUNTED" == "yes" ]; then
				setupExtnDirs
			else
				mount "$MOUNTPOINT"
				if [ $? == 0 ]; then
					UMOUNT="yes"
					setupExtnDirs
				fi
			fi
		fi
	else
	   MOUNTPOINT="/tmp"; TCE_DIR="tce"
	fi

	TCEDIR="$MOUNTPOINT"/"$TCE_DIR"
	if [ ! -d "$TCEDIR"/optional ]; then
		mkdir "$TCEDIR"/optional
		chown -R "$USER".staff "$TCEDIR"
	fi
	[ -L /etc/sysconfig/tcedir ] && rm -f /etc/sysconfig/tcedir
	ln -sf "$TCEDIR" /etc/sysconfig/tcedir
	chown -R "$USER".staff "$TCEINSTALLED"
	sync
	[ "$MOUNTPOINT" == "/tmp" ] && return

# 	Process any .gzs in tce directory before regular extensions.
	if [ "$(ls -A "$TCEDIR"/*.gz 2>/dev/null)" ]; then
		process_gz "$TCEDIR"
	fi

	if [ -d "$TCEDIR"/optional/upgrade ] && [ "$(ls -A "$TCEDIR"/optional/upgrade 2>/dev/null)" ]; then
		echo -n "${GREEN}Performing upgrade from $TCEDIR/optional/upgrade. ${NORMAL}"
		yes y | cp -ai "$TCEDIR"/optional/upgrade/* "$TCEDIR"/optional/. 2>/dev/null && rm -rf "$TCEDIR"/optional/upgrade
		echo "${YELLOW}Done.${NORMAL}"
	fi
#	Process regular extensions
	ONBOOT="$TCEDIR"/"$TARGETLIST"
	[ -s "$ONBOOT" ] && process "$ONBOOT"
	sync
}

setupExtnDirs() {
	[ -d "$MOUNTPOINT"/"$TCE_DIR"/optional ] || mkdir -p "$MOUNTPOINT"/"$TCE_DIR"/optional
	[ -d "$MOUNTPOINT"/"$TCE_DIR"/ondemand ] || mkdir -p "$MOUNTPOINT"/"$TCE_DIR"/ondemand
	[ -f "$MOUNTPOINT"/"$TCE_DIR"/onboot.lst ] || touch "$MOUNTPOINT"/"$TCE_DIR"/onboot.lst
	chown -R "$USER".staff "$MOUNTPOINT"/"$TCE_DIR" 2>/dev/null
	chmod -R g+w "$MOUNTPOINT"/"$TCE_DIR" 2>/dev/null
}

process_gz() {
	FILELIST=`ls "$1"/*.gz`
	cd /
	for FILE in $FILELIST; do
		zcat "$FILE" | cpio -idmu > /dev/null 2>&1
		GZ="${FILE##*/}"
		STARTSCRIPT="$TCEINSTALLED"/"${GZ%.gz}"
		[ -s "$STARTSCRIPT" ] && sh "$STARTSCRIPT"
	done
	cd - > /dev/null
	setupHome
}

process() {
	[ -f "$1" ] && applist=$(awk -v ORS=" " '{gsub(/#.*/, ""); if ($1~/\w/) print $1;}' "$1")
	[ "$applist" ] && su "$USER" -c "tce-load -i -b -t `dirname $1` $applist"
	if [ -s /tmp/aberr ]; then
		echo "occured while loading:  $applist" >> /tmp/aberr
		exit 1
	fi
}

process_CD() {
	CD="/mnt/${DEV#/dev/}"
	mount "$CD" 2>/dev/null
	if [ "$?" == 0 ] ; then
		if [ -d "$CD"/cde ]; then
			LOADFROM="$CD"/cde/optional
			CDELIST="$CD"/cde/"$TARGETLIST"
			if [ -s "$CDELIST" ]; then
				process "$CDELIST"
				echo "$LOADFROM" > /etc/sysconfig/cde
			fi
		else
			umount "$CD"
		fi
	fi
}

for i in `cat /proc/cmdline`; do
	case $i in
		tce=*) TCE=${i#*=} ;;
		lst=*) TARGETLIST=${i#*=} ;;
	esac
	case $i in
		cde) CDE=1 ;;
		base) ONLYBASE=1 ;;
	esac
done

[ -n "$TARGETLIST" ] || TARGETLIST="onboot.lst"

# Process any .gzs before attempting to mount tce directory.
# /tmp/builtin support provided for embedding extensions inside the initrd.
if [ "$(ls -A "/tmp/builtin"/*.gz 2>/dev/null)" ]; then
	process_gz "/tmp/builtin"
fi

# Next Check for any tcz initrd builtins
if [ -d /tmp/builtin ] && [ "$(ls -A /tmp/builtin 2>/dev/null)" ]; then
	TCEDIR=/tmp/builtin
	[ -s "$TCEDIR"/"$TARGETLIST" ] && process "$TCEDIR"/"$TARGETLIST"
fi

# Next process regular extensions unless BASE boot option has been specified.

if [ "$1" == "booting" ] && [ -n "$ONLYBASE" ]; then
	echo "${GREEN}Skipping regular Extension loading as requested on the command line.${NORMAL}"
	TCEDIR="/tmp/tce"
	if [ ! -d "$TCEDIR"/optional ]; then
		mkdir "$TCEDIR"/optional
		chown -R "$USER".staff "$TCEDIR"
	fi
else
	process_normal_tcedir
fi

# Finally check for CD Extensions if requested
if [ "$CDE" ]; then
	# Some cd drives are slow - if cde was requested, wait for udev to settle
	[ ! -s /etc/sysconfig/cdroms ] && udevadm settle --timeout 5

	if [ -s /etc/sysconfig/cdroms ]; then
		for DEV in `cat /etc/sysconfig/cdroms`; do
			process_CD
		done
	fi
fi

# If nothing loaded then also check for pseudo CD, e.g., isohybrid
if [ "$CDE" -a -z "$CDELIST" ]; then
	sleep 5
	DEV="$(tc_autoscan 'cde' 'd')"
	process_CD
fi

# Wrap up by performing updates as may be needed.
if [ -e /etc/sysconfig/newmodules ]; then
	depmod -a 2>/dev/null
	/sbin/udevadm trigger
fi
/sbin/ldconfig 2>/dev/null
if [ -s /tmp/setup.lst ]; then
	for F in `cat /tmp/setup.lst`; do "$F"; done
	rm -f /tmp/setup.lst
fi

[ -d /mnt/test ] && rmdir /mnt/test

setupHome