#!/bb/ash
#(c) Robert Shingledecker 2009-2011
# Contributions by Jason Williams 
. /etc/init.d/tc-functions

PATH="/bb:/bin:/sbin:/usr/bin:/usr/sbin"
export PATH

checkroot
TCEDIR=/etc/sysconfig/tcedir
read USER < /etc/sysconfig/tcuser
TCEINSTALLED="/usr/local/tce.installed"
if [ ! -f /tmp/.installed ]; then
  touch /tmp/.installed
  chown "$USER":staff /tmp/.installed > /dev/null 2>&1
fi

process_normal_tcedir() {
	[ -z "$TCE" ] && TCE="$(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"/sce ]; then
		mkdir "$TCEDIR"/sce
		chown -R "$USER".staff "$TCEDIR" > /dev/null 2>&1
	fi
	[ -L /etc/sysconfig/tcedir ] && rm -f /etc/sysconfig/tcedir
	ln -sf "$TCEDIR" /etc/sysconfig/tcedir
	chown -R "$USER".staff "$TCEINSTALLED" > /dev/null 2>&1
	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
	sync
	
#	Next check for and if found process any sces
	if [ -s "$SCELIST" ] && [ "$(ls -A "$SCEDIR"/*.sce 2>/dev/null)" ]; then
		process_sce 
	fi
}

setupExtnDirs() {
	[ -d "$MOUNTPOINT"/"$TCE_DIR"/sce ] || mkdir -p "$MOUNTPOINT"/"$TCE_DIR"/sce
	[ -d "$MOUNTPOINT"/"$TCE_DIR"/ondemand ] || mkdir -p "$MOUNTPOINT"/"$TCE_DIR"/ondemand
	touch "$MOUNTPOINT"/"$TCE_DIR"/sceboot.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##*/}"
	done
	# Handle startup scripts of any .gz initrd files installed.
	for I in `ls /usr/local/tce.installed/`; do
		SS=/usr/local/tce.installed/"$I"
		if ! grep "$I:" /tmp/.installed > /dev/null 2>&1; then
			$SS > /dev/null 2>&1
			echo "$I:" >> /tmp/.installed
		fi
	done
	cd -
}
process_sce() {
	if [ -d "$TCEDIR"/sce/update ]; then
		mv "$TCEDIR"/sce/update/* "$TCEDIR"/sce/ > /dev/null 2>&1
	fi
	for I in `cat "$SCELIST"`; do
		su "$USER" -c "sce-load -b "$I""
	done 
}

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

process_builtin() {
	if ls /tmp/builtin/*.sce > /dev/null 2>&1; then
		for I in `ls /tmp/builtin/*.sce`; do
			su "$USER" -c "sce-load -b "$I""
		done
	fi
}

process_CD() {
	CD="/mnt/${DEV#/dev/}"
	mount "$CD" 2>/dev/null
	if [ "$?" == 0 ] ; then
		if [ -d "$CD"/cde ]; then
			LOADFROM="$CD"/cde/sce
			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 ;;
		debug) DEBUG=TRUE
	esac
done

[ -n "$TARGETLIST" ] || TARGETLIST="sceboot.lst"
SCEDIR="$TCEDIR"/sce
SCELIST="$TCEDIR"/"$TARGETLIST"

# 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"
	# Handle startup scripts of any .gz initrd files installed.
	for I in `ls /usr/local/tce.installed/`; do
		SS=/usr/local/tce.installed/"$I"
		if ! grep "$I:" /tmp/.installed > /dev/null 2>&1; then
			$SS > /dev/null 2>&1
			echo "$I:" >> /tmp/.installed
		fi
	done
	# Rebuildfstab as /tmp/builtin can be used for filesystem drivers.
	rebuildfstab
fi

chown "$USER":staff /tmp/.installed /tmp/.debinstalled > /dev/null 2>&1

# 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"/sce ]; then
		mkdir "$TCEDIR"/sce
		chown -R "$USER".staff "$TCEDIR" > /dev/null 2>&1
	fi
else
	process_normal_tcedir
fi

# Now process SCEs in /tmp/builtin
process_builtin

# Finally check for CD Extensions if requested
if [ "$CDE" ]; then
	[ ! -s /etc/sysconfig/cdroms ] && udevadm settle --timeout 5
	for DEV in `cat /etc/sysconfig/cdroms`; do
		process_CD
	done 
fi			

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

# Wrap up by performing updates as may be needed.
if [ -e /etc/sysconfig/newmodules ]; then
	/sbin/depmod -a 
	/sbin/udevadm control --reload-rules
	/sbin/udevadm trigger
fi
/sbin/ldconfig 2>/dev/null
if [ -s /tmp/setup.lst ]; then
	for F in `cat /tmp/setup.lst`; do
	APP=`basename "$F"`
		if ! grep "^$APP:" /tmp/.installed >/dev/null; then
			if [ "$DEBUG" == "TRUE" ]; then
				echo "$APP"
				echo "$APP:" | tee -a /var/log/sce.log > /dev/null 2>&1
				"$F" 2>&1 | tee -a /var/log/sce.log > /dev/null 2>&1	
			else
				"$F" > /dev/null 2>&1
			fi
			echo "$APP:" >> /tmp/.installed
		fi
	 done
	rm -f /tmp/setup.lst
fi

setupHome

