#!/bin/sh
# setup script for unix machines

TMP_DATA="/tmp/setup.digi"
TMP_LIST="/tmp/setup.list"
TMP_STORE="/tmp/tmp.store"

IN_JVM=0
JVM_TYPES="java jre"
CP_UPDATED=0
DISPLAY_ENV_VAR=""

exec 2>/dev/null

cleanup() {
	for FILE in $TMP_DATA $TMP_LIST $TMP_STORE; do
		if [ -f "$FILE" ]; then
			rm $FILE
		fi
	done
}

interrupted() {
	cleanup
	exit 1
}

choose() {
	CHOICE=""
	while [ -z "$CHOICE" ]; do
		cat $TMP_LIST
		echo "Enter choice: " | tr -d '\n'
		exec 3<&0 < /dev/tty
		while read CHOICE
		do
			break
		done
		exec 0<&3 3<&-
        if [ "$CHOICE" -ge 0 -a "$CHOICE" -le $JVM_COUNT ] 
	then
		echo
	else
		echo
		echo "Invalid choice"
		echo
		CHOICE=""
	fi
	done
}

get_display_var() {
	set > $TMP_STORE
	exec 3<&0 < $TMP_STORE
	IFS='='
	while read v1 v2
	do
		case $v1 in DISPLAY )
			DISPLAY_ENV_VAR=$v2
			break
			;;
		esac
	done
	exec 0<&3 3<&-
	IFS=' '
	rm $TMP_STORE
}




update_classpath() {
	TRUE_DIR=""
	dir_name=""
	is_link=0
	relative_path=0
	ls -l $JVM > $TMP_STORE
	exec 3<&0 < $TMP_STORE
	while read v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11
	do
		case $v1 in l* )
			is_link=1
			dir_name=`dirname $v11`
			;;
		esac
	done
	exec 0<&3 3<&-
	rm $TMP_STORE

	if [ $is_link -eq 1 ]
	then
		dir_name_parent=`dirname $dir_name`
		if [ $dir_name_parent = "." ] 
		then
			TRUE_DIR=$DIR
		else 
			echo $dir_name > $TMP_STORE
			exec 3<&0 < $TMP_STORE
			IFS='/'
			while read v1 v2
			do
				case $v1 in .. )
					relative_path=1
					;;
				esac
			done
			exec 0<&3 3<&-
			rm $TMP_STORE
	
			if [ $relative_path -eq 1 ]
			then
				TRUE_DIR=$DIR/$dir_name
			else
				TRUE_DIR=$dir_name
			fi
			IFS=' '
		fi	
	else
		TRUE_DIR=$DIR
	fi

	JVM_LIB_DIR=$TRUE_DIR/../lib
	ls $JVM_LIB_DIR > $TMP_STORE
	FOUND=0
	exec 3<&0 < $TMP_STORE
	while read filename
	do
		case $filename in *.jar | *.zip)
			CLASSPATH=$CLASSPATH:$JVM_LIB_DIR/$filename
			FOUND=`expr $FOUND + 1`
			;;
		esac
	done
	exec 0<&3 3<&-
	rm $TMP_STORE
	if [ $FOUND -gt 0 ]; then
		CP_UPDATED=$FOUND
	fi
}

trap 'interrupted' 2

JVM=$1
if [ -z "$JVM" ]
then
	JVM_COUNT=0
	echo "Searching PATH for Java Virtual Machines..."
	echo "0) Quit" >$TMP_LIST
	for DIR in `IFS=:;echo $PATH`
	do
		for NAME in $JVM_TYPES
		do
			JVM=$DIR/$NAME
			if [ -x "$JVM" ]
			then
				CLASSPATH=./setup.jar
				update_classpath
				$JVM -classpath "$CLASSPATH" com.digi.setup.JVMData >$TMP_DATA
				READ=0
				exec 3<&0 < $TMP_DATA
				while read TYPE VALUE; do
					if [ "$TYPE" = "Vendor:" -a "$VALUE" != "" ]; then
						VENDOR=$VALUE
						READ=`expr $READ + 1`
					elif [ "$TYPE" = "Version:" -a "$VALUE" != "" ]; then
	
					VERSION=$VALUE
						READ=`expr $READ + 1`
					fi
				done 
				exec 0<&3 3<&-
				if [ $READ -eq 2 ]; then
					# check to see if this jvm is already in list
					JVM_FOUND=0
					exec 3<&0 < $TMP_LIST
					while read param1 param2 param3
					do
						case "$param2" in
						*.* )
							if [ $JVM = $param3 ] 
							then
								JVM_FOUND=1
								break
							fi
						esac
					done
					exec 0<&3 3<&-
					if [ $JVM_FOUND -eq 0 ]  
					then
						JVM_COUNT=`expr $JVM_COUNT + 1`
						echo "$JVM_COUNT) $VERSION $JVM" >>$TMP_LIST
						echo "   ($VENDOR)">>$TMP_LIST
						if [ -z "$JVM_LIST" ]; then
							JVM_LIST=$JVM
						else
							JVM_LIST="$JVM_LIST:$JVM"
						fi
					fi
				fi
			fi
		done
	done
	IFS=' '
	if [ $JVM_COUNT -eq 0 ]
	then
		echo "No JVM found in PATH. Please specify the JVM as an argument to setup."
		echo "See http://www.portassist.com for additional JVM information"
		exit 1
	fi

	choose

	if [ $CHOICE -eq 0 ]; then
		exit
	fi
	INDEX=1
	IFS=':'
	for JVM in $JVM_LIST; do
		if [ $INDEX -eq $CHOICE ]; then
			echo "using: $JVM"
			break
		fi
		INDEX=`expr $INDEX + 1`
	done
	IFS=' ' 
else
	echo "using: $JVM"
fi
cleanup

DIR=`dirname $JVM`
IN_JVM=1
CLASSPATH=./setup.jar
update_classpath
if [ $CP_UPDATED -eq 0 ]; then
	echo "Invalid JVM path or JVM class archive files not found.  Exiting setup."
	exit 1
fi
get_display_var
$JVM -D"Setup.argv0"=`pwd` -D"Setup.JVM"=$JVM -D"Setup.Switch.Property"="-D" -D"Setup.Switch.Classpath"="-classpath" -D"Setup.DisplayEnvar"=$DISPLAY_ENV_VAR -classpath "$CLASSPATH" com.digi.setup.Main pam

if [ $? -eq 1 ]
then
	exec 3<&0 </etc/digi/pam.ini
	IFS='='
	while read var value
	do
		case "$var" in
		path )
			PAMDIR=$value;;
		esac
	done

	rm -rf $PAMDIR
	rm -rf /etc/digi
	exec 0<&3 3<&-
	IFS=' '
fi
