#!/bin/sh
#  $Id: install_beans.sh 109677 2015-03-31 12:24:31Z pc161604 $
#  Copyright (c) 2001, 2019, Oracle and/or its affiliates. All rights reserved.
#  This software code contains proprietary information
#  and should be treated as confidential.
#
#  Component: JServer component beans installation.
#  Author: stevent

. "common-env.sh"

case "$trace" in
x) set -x
esac

# cd to the directory containing this script, so that we can use
# relative pathnames
ttacommand=$0
case "$ttacommand" in
/*) cd `dirname $ttacommand`
    ;;
*)  fullpath=`pwd`/$ttacommand
    cd `dirname $fullpath`
esac


# Where are we relative to top of tta tree?
top=.
for _i in 0 1 2 3 4 5 6 7 8 9; do
    [ -d $top/bin/java -a -x $top/bin/tarantella ] && break
    [ -f $top/etc/passwd ] && { top=.; break; }
    top=../$top
done


# Source the Java development environment variables:

# Set port numbers. Start by sourcing info/ports.properties.
if [ -r $top/var/info/ports.properties ]; then
	. $top/var/info/ports.properties
fi

# Use these as defaults for config
tarantella_config_array_externalport=${externalport:-3144}
tarantella_config_array_port=${peerport:-5427}
tarantella_config_array_secureport=${secureport:-5307}
#also include proxiedhttpsurl for firewall traversal
tarantella_config_server_proxiedhttpsurl=${proxiedhttpsurl:-""}
tarantella_config_array_privilegeduser=${privilegeduser:-""}
tarantella_config_array_privilegedgroup=${privilegedgroup:-""}
#also include privileged username for web authentication
tarantella_config_array_webserveruser=${webserveruser:-""}
# Include web auth key refresh
tarantella_config_login_webauth_refreshkeyonrestart=${refreshkeyonrestart:-""}

#Include attribute to tell ttawebtop whether to be verbose or not
tarantella_config_server_cgiverbose=${cgiverbose:-""}

#Include attribute used to modify the archive names
tarantella_config_server_archivemodifier=${archivemodifier:-""}

#Attribute for cgi-bin to tell client to bootstrap from
tarantella_config_server_cgibin_bootscript=${bootscript:-""}

#Attribute passed to client so it knows the route to the server.
tarantella_config_array_netservice_proxy_routes=${routes:-""}

#Attribute passed to client so it knows the correct external name of the server
tarantella_config_server_netservice_proxy_externalnames=${externalnames:-""}

#SHould we use ssl on peer connections? Admin tools need to know
tarantella_config_security_peerssl_enabled=${peerssl:-"0"}

# Use the bootstrap.properties file if we can.
_propfile="$top/var/serverconfig/global/bootstrap.properties"
[ -s "${_propfile}" -a -r "${_propfile}" ] && {
eval `tr -d '\\\\' <"${_propfile}" | egrep -v "^[ 	]*#|'|^tarantella\.config\.(name|type)=" | sed "/=/!d
:dotloop
s/^\([^=]*\)\.\([^=]*=.*\)\$/\1_\2/
tdotloop
s/^\([^=]*\)=\(.*\)/\1='\2'/"`
}

# Set the values in the expected variables.
externalport=$tarantella_config_array_externalport
secureport=$tarantella_config_array_secureport
peerport=$tarantella_config_array_port

# Set DNS names. Use the bootstrap.properties file if we can.
_propfile="$top/var/serverconfig/local/bootstrap.properties"
[ -s "${_propfile}" -a -r "${_propfile}" ] && {
eval `tr -d '\\\\' <"${_propfile}" | egrep -v "^[ 	]*#|'|^tarantella\.config\.(name|type)=" | sed "/=/!d
:dotloop
s/^\([^=]*\)\.\([^=]*=.*\)\$/\1_\2/
tdotloop
s/^\([^=]*\)=\(.*\)/\1='\2'/"`
}

# We need defaults if the properties file is unreadable or corrupt.
peerhost=${tarantella_config_server_dns_peer:-`$top/bin/bin/ttahostname`}
externalhost="${tarantella_config_server_dns_external:-$peerhost}"
auxhost="$peerhost"

# Get the value of proxiedhttpsurl/cgiverbose/archivemodifier/bootscript from 
# server.properties
_propfile="$top/var/serverconfig/local/server.properties"
[ -s "${_propfile}" -a -r "${_propfile}" ] && {
eval `tr -d '\\\\' <"${_propfile}" | egrep -v "^[ 	]*#|'|^tarantella\.config\.(name|type)=" | sed "/=/!d
:dotloop
s/^\([^=]*\)\.\([^=]*=.*\)\$/\1_\2/
tdotloop
s/^\([^=]*\)=\(.*\)/\1='\2'/"`
}

# Get the properties from array.properties
_propfile="$top/var/serverconfig/global/array.properties"
[ -s "${_propfile}" -a -r "${_propfile}" ] && {
eval `tr -d '\\\\' <"${_propfile}" | egrep -v "^[ 	]*#|'|^tarantella\.config\.(name|type)=" | sed "/=/!d
:dotloop
s/^\([^=]*\)\.\([^=]*=.*\)\$/\1_\2/
tdotloop
s/^\([^=]*\)=\(.*\)/\1='\2'/"`
}

# Get web auth properties
_propfile="$top/var/serverconfig/global/webauth.properties"
[ -s "${_propfile}" -a -r "${_propfile}" ] && {
eval `tr -d '\\\\' <"${_propfile}" | egrep -v "^[ 	]*#|'|^tarantella\.config\.(name|type)=" | sed "/=/!d
:dotloop
s/^\([^=]*\)\.\([^=]*=.*\)\$/\1_\2/
tdotloop
s/^\([^=]*\)=\(.*\)/\1='\2'/"`
}

# Get peerssl properties
_propfile="$top/var/serverconfig/global/security.properties"
[ -s "${_propfile}" -a -r "${_propfile}" ] && {
eval `tr -d '\\\\' <"${_propfile}" | egrep -v "^[ 	]*#|'|^tarantella\.config\.(name|type)=" | sed "/=/!d
:dotloop
s/^\([^=]*\)\.\([^=]*=.*\)\$/\1_\2/
tdotloop
s/^\([^=]*\)=\(.*\)/\1='\2'/"`
}

proxiedhttpsurl=$tarantella_config_server_proxiedhttpsurl
privilegeduser=$tarantella_config_array_privilegeduser
privilegedgroup=$tarantella_config_array_privilegedgroup
webauthrefresh=$tarantella_config_login_webauth_refreshkeyonrestart
cgiverbose=$tarantella_config_server_cgiverbose
archivemodifier=$tarantella_config_server_archivemodifier
bootscript=$tarantella_config_server_cgibin_bootscript
routes=$tarantella_config_array_netservice_proxy_routes
externalnames=$tarantella_config_server_netservice_proxy_externalnames
peerssl=$tarantella_config_security_peerssl_enabled
peersslciphers=$tarantella_config_security_peerssl_ciphers
webserveruser=$tarantella_config_array_webserveruser

INSTALLDIR=$top
export INSTALLDIR

[ -f $top/bin/scripts/javaprops ] && . $top/bin/scripts/javaprops
JAVADIR=${INSTALLDIR}/bin/java
CLASSPATH=${JAVADIR}/jserver.jar:${JAVADIR}/lib/*:${JAVADIR}:${JAVADIR}/ext/*:${INSTALLDIR}/var/serverresources/adminconfig

# (This sets the $jrecommand to be an appropriate jre.)

# Note that we ALWAYS use the "disconnected-local-master" flavour
# with the "force local" flag on.
JAVA_SYSTEM_PROPERTIES="${JAVA_SYSTEM_PROPERTIES}
-Djava.naming.tfn.flavour=disconnected-local-master
-Djava.naming.forceLocal=true"



getChildrenOfPid() 
{
## Warning - the following code is Linux specific.  (And if 
## /proc/<pid>/exe changes, will break)
## PS: It was changed. And it did break. [Fitz 605468]
ppid="$1"
exepattern="$2"
exclpattern="$3"
childrenpids=""
# Get children of ppid
ALLCHILDPIDS=`echo "$ps_output" | grep "^ *$ppid " | awk '{ print $2 }'`

if [ -z "$exepattern" ] ; then 
    childrenpids="$ALLCHILDPIDS" 
else 
    if [ ! -z "$ALLCHILDPIDS" ] ; then 
	for p in $ALLCHILDPIDS ; do
	    # is the executable one we worry about?
	    if [ -n "`find /proc/$p -name exe -lname \"$exepattern\" 2>/dev/null | sort | sed 1q`" ] ; then
		# yes 
                if [ -z "$exclpattern" ]; then
                    childrenpids="$childrenpids $p"
                else
                    check=`ps --noheading --pid $p -ww -o args | egrep -- "$exclpattern"`
                    [ -z "$check" ] && childrenpids="$childrenpids $p"
                fi
	    fi
	done
    fi
fi
echo $childrenpids
}

removeSurplusJVMs() 
{
# this will kill any instances of our JVM whose parent is init.
case "$SCOARCH" in
    i3li*|ppli*)
	## cache the output of ps, as it may be called several times, and can
	## be slow.
	ps_output=`ps --no-heading -ax -o ppid,pid 2>/dev/null`
	
	PIDSTOKILL=""
	PPIDS=`getChildrenOfPid 1 "$TTABINDIR/j*" "-classpath[ :]*$TTADIR/webserver"`
	while [ ! -z "$PPIDS" ] ; do
	    CHILDPIDS=""
	    PIDSTOKILL="$PIDSTOKILL $PPIDS"
	    for pp in $PPIDS ; do 
		CHILDPIDS="$CHILDPIDS `getChildrenOfPid $pp`"
	    done
	    PPIDS="$CHILDPIDS"
	done
	if [ ! -z "$PIDSTOKILL" ] ; then 
	    for p in $PIDSTOKILL ; do 
		if [ -d /proc/$p ] ; then 
		    kill $p 2>/dev/null
		    # give it time to exit
		    sleep 1
		    if [ -d /proc/$p ]; then
			kill -9 $p 2>/dev/null
			echo -n "(Using SIGKILL)"
		    fi
		echo "Killed pid $p (surplus JVM thread)"
		fi
	    done
	fi
	;;
esac
}



u="`LANG=C LC_ALL=C id | sed 's/.*uid=\([0-9][0-9]*\).*/\1/'`"
if [ "$u" = "0" ]
then
    removeSurplusJVMs &
fi



# The verbose output option
VERBOSE="--verbose"
# The verbose command to use
VERBOSE_CMD=""

# Will remove the --verbose switch and its
# argument (if it has one) from the list  
set_verbose_cmd(){
    LAST_VERBOSE=""
    APP_ARGS=""
    
    for arg in $@ ; do
      case "$arg" in 
        $VERBOSE )
            # If we find --verbose set a flag so we can
            # treat the next argument as a file name for --verbose
            LAST_VERBOSE="true"
            VERBOSE_CMD="$VERBOSE"
            ;;
        *)
            # If the last argument was --verbose then
            # the next is the file to output to.
            if [ ! -z "$LAST_VERBOSE" ] ; then
                LAST_VERBOSE=""
                VERBOSE_CMD="$VERBOSE_CMD $arg"
            else 
                # Just append the other args on the APP_ARGS
                APP_ARGS="$APP_ARGS $arg"
            fi
            ;;
      esac
    done
}

# See if APP_ARGS contains --verbose
# if it does then remove it and set the verbose command
if [ ! -z "`echo "$APP_ARGS" | grep -- "$VERBOSE"`" ] ; then
    set_verbose_cmd $APP_ARGS
fi

# By default, run com.sco.tta.server.config.Install
case "$APP_ARGS" in
    -* | "" ) APP_ARGS="com.sco.tta.server.config.Install $APP_ARGS" ;;
esac



##########################################################
# We can specify the following parameters...
#
# PEERHOST - the host we should connect to (if running on a machine in array).
# PEERPORT - the port number to connect to on PEERHOST.
# EXTERNALHOST - the host clients connect to.
# EXTERNALPORT - the port clients connect to on EXTERNALHOST.
# SECUREPORT - secure server port clients connect to on EXTERNALHOST.
# INSTALLDIR - the install directory.
#
###########################################################

${SGD_JAVA_DIR}/java $RUNTIME_ARGS -Djava.library.path=${TTAINSTDIR}/lib -classpath $CLASSPATH $RUNTIME_ARGS $JAVA_SYSTEM_PROPERTIES $TTA_USER_CMD $APP_ARGS INSTALLDIR=${TTAINSTDIR} PEERHOST=${peerhost} EXTERNALHOST=${externalhost} EXTERNALPORT=${externalport} SECUREPORT=${secureport} PEERPORT=${peerport} $VERBOSE_CMD
