#!/bin/bash
#  $Id:
#  Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
#  This software code contains proprietary information
#  and should be treated as confidential.
#
#  Prepares an SGD instance

source "common.sh"

# This is a generic product script used to establish an environment
# before starting/stopping a product or component.
# This script was built from shell library
#   $Id$
# This script has to run on every platform we support.  Any suggestions
# for improvement are welcome (but must be portable!)

# Version numbers
PRODUCT_VERSION="5.60.514"
PRODUCT_VERSION_FULL="5.60.514"
PRODUCT_VERSION_MAJOR=5
PRODUCT_VERSION_FEATURE=6
PRODUCT_VERSION_BUG=0
PRODUCT_VERSION_BUILD=514
PRODUCT_VERSION_BUILD_DECIMAL=514
PRODUCT_VERSION_AS_NUMBER=560514
PRODUCT_VERSION_CAB=5,6,0,514
PRODUCT_VERSION_RPM=5.60-514

# Product names
PRODUCT_FULL_NAME="Oracle Secure Global Desktop"
PRODUCT_SHORT_NAME="Secure Global Desktop"
PRODUCT_IDENT="SSGD"
PRODUCT_SHORT_FILENAME="Tarantella"
PRODUCT_LSBSCRIPTNAME="sun.com-sgd-base"
PRODUCT_LSBSCRIPT_RUN_LEVEL="90"
TSP_FULL_NAME="Oracle Secure Global Desktop Security Pack"
TSP_SHORT_NAME="Security Pack"
WCP_FULL_NAME="Oracle Secure Global Desktop Windows Connectivity Pack"
WCP_SHORT_NAME="Windows Connectivity Pack"
TN3270_FULL_NAME="Oracle Secure Global Desktop Mainframe Connectivity Pack"
TN3270_SHORT_NAME="Mainframe Connectivity Pack"
AS400_FULL_NAME="Oracle Secure Global Desktop AS/400 Connectivity Pack"
AS400_SHORT_NAME="AS/400 Connectivity Pack"
S1PSTK_FULL_NAME="Oracle Secure Global Desktop Channel for Sun ONE Portal Server"
S1PSIP_FULL_NAME="Oracle Secure Global Desktop Integration Pack for Sun ONE Portal Server"
S1PSTK_SHORT_NAME="Secure Global Desktop Channel for Sun ONE Portal Server"
S1PSIP_SHORT_NAME="Secure Global Desktop Integration Pack for Sun ONE Portal Server"

OBJECT_MGR_NAME="Object Manager"
ARRAY_MGR_NAME="Array Manager"
NATIVE_WIN16_FULL_NAME="Oracle Secure Global Desktop Native Client for Windows 3.1"
NATIVE_WIN16_SHORT_NAME="Native Client for Windows 3.1"
NATIVE_WIN32_FULL_NAME="Oracle Secure Global Desktop Native Client for Windows 95, 98 and NT"
NATIVE_WIN32_SHORT_NAME="Native Client for Windows 95, 98 and NT"
NATIVE_WYSE_FULL_NAME="Oracle Secure Global Desktop Native Client for Wyse"
NATIVE_WYSE_SHORT_NAME="Native Client for Wyse"
NATIVE_FULL_NAME="Oracle Secure Global Desktop Native Client"
NATIVE_SHORT_NAME="Native Client"
NATIVE_REGISTRY_NAME="Tarantella Native Client"
INTCLI_FULL_NAME="Oracle Secure Global Desktop Client"
INTCLI_SHORT_NAME="Client"
TCC_FULL_NAME="Oracle Secure Global Desktop Client"
TCC_HELPER_NAME="Oracle Secure Global Desktop Client Helper"
TCC_ACTIVEX_NAME="Oracle Secure Global Desktop ActiveX Control"
TCC_PLUGIN_NAME="Oracle Secure Global Desktop Netscape Plug-in"
T3COMPONENT_WIN_NAME="Oracle Secure Global Desktop Enhancement Module for Windows"
T3COMPONENT_UNIX_NAME="Oracle Secure Global Desktop Enhancement Module for UNIX(TM) and Linux Platforms"
T3COMPONENT_SHORT_UNIX_NAME="tem"
T3COMPONENT_NAME="Oracle Secure Global Desktop Enhancement Module"
T3COMPONENT_LSBSCRIPTNAME="sun.com-sgd-em"
T3COMPONENT_LSBSCRIPT_RUN_LEVEL="90"
GWCOMPONENT_UNIX_NAME="Oracle Secure Global Desktop Gateway for UNIX(TM) and Linux Platforms"
GWCOMPONENT_NAME="Oracle Secure Global Desktop Gateway"
GWCOMPONENT_SHORTNAME="SGD Gateway"
GWCOMPONENT_LSBSCRIPTNAME="sun.com-sgd-gw"
GWCOMPONENT_LSBSCRIPT_RUN_LEVEL="91"

# Watch the length of these names: IE refuses to remove packages if
# the name is too long.
ARCHIVE_NAME_ttalw="TCC Helper, version"
ARCHIVE_NAME_asad="3.x Framework Java Archive"
#ARCHIVE_NAME_tta="3.x Java Archive"
#ARCHIVE_NAME_tta="3.x Combined Java Archive"
ARCHIVE_NAME_tta="Client, "
ARCHIVE_NAME_tsp="3.x Security Java Archive"
ARCHIVE_NAME_proxy="3.x Proxy Java Archive"
WEBSTART_JAR_NAME="sgdwscs"
ARCHIVE_SUFFIX="K"

NS_REGKEY="java/download/com/tarantella/tta"

PRODUCT_VENDOR="Oracle Corporation, Inc."
PRODUCT_SHORT_VENDOR="Oracle"

# Capabilities:
# The format for the capabilities required by the client end of a
# connection is: CAPABILITIES_protocol_type_REQUIRED="expression"

# The format for the capabilities provided by the server end of a
# connection is: CAPABILITIES_protocol_type_PROVIDED="c1 c2 ... c3"

# Asad between a webtop client and server:
CAPABILITIES_ASAD_WEBTOPCLIENT_REQUIRED="(1.1 || 1.2)"
CAPABILITIES_ASAD_WEBTOPCLIENT_PROVIDED="1.1 1.2"

# Asad between two peer servers, or an admin tool and a server:
# 1.1 is core E3 array functionality.
# 1.2 is 3.01 array interoperability functionality.
# 2.1 is core Pisa client device mapping functionality (not a requirement)
CAPABILITIES_ASAD_PEER_REQUIRED="(1.1 || 1.2)"
CAPABILITIES_ASAD_PEER_PROVIDED="1.1 1.2 2.1"

# Client versions of server strings; same format, name prefixed by CLIENT
# Asad between a webtop client and server:
CLIENTCAPABILITIES_ASAD_WEBTOPCLIENT_REQUIRED="(1.1 || 1.2)"
CLIENTCAPABILITIES_ASAD_WEBTOPCLIENT_PROVIDED="1.1 1.2"

# Top-level item names in ENS datastore
DEFAULT_ROOT_ENS="organization"
SYSTEM_ROOT_ENS="Tarantella System Objects"
APP_ROOT_ENS="applications"
APPSERVER_ROOT_ENS="appservers"

WEB_SERVICES_VERSION=1.9


# be paranoid about the current path
if [ -d /bin ]; then
  PATH=/bin:$PATH
fi
if [ -d /sbin ]; then
  PATH=/sbin:$PATH
fi
if [ -d /usr/bin ]; then
  PATH=/usr/bin:$PATH
fi
if [ -d /usr/sbin ]; then
  PATH=/usr/sbin:$PATH
fi
if [ -d /etc ]; then
  PATH=/etc:$PATH
fi
export PATH

N=""
C=""
if echo -n | grep n > /dev/null
then
  C="\c"
else
  N="-n"
fi
case "$MACHINEARCH" in
i3li*|ppli*) N="$N -e" ;;
esac
_ss_headlines="--------------------------------------------------------------------------"

if [ -f ${TTAMSG}/common -a -f ${TTAMSG}/prepare_instance.msg ]; then
  . ${TTAMSG}/common
  . ${TTAMSG}/prepare_instance.msg
else
  echo "Unable to open message file: ${TTAMSG}/prepare_instance.msg"
  exit 1
fi


usage() {
    exit_usage_error "${long_usage}"
}

external_name=""
external_access_port=""
deployment_arg=""
sgdadmin_prompt_arg=""
regen_dh_param=1
prompt=1

# Check the arguments
while [ -n "$1" ]; do
   case "$1" in
       --help)
           exit_usage_error "${long_usage}"
           ;;
       --external-name)
           if [ -z "$2" ] 
           then
               exit_on_error "${missing_externalname}"
           fi
           
           external_name="$2"
           shift
           ;;
       --external-access-port)
           if [ -z "$2" ]
           then
               exit_on_error "${missing_externalaccessport}"
           fi

           external_access_port="$2"
           shift
           ;;
       --deployment-script)
           if [ -z "$2" ]
           then
               exit_on_error "${missing_deployment}"
           fi
           deployment_arg="--deployment-script $2"
           shift
           ;;
       --no-dhparam-regen)
           regen_dh_param=0
           ;;
       --no-prompt)
           prompt=0
           sgdadmin_prompt_arg="--no-password"
           ;;
       *)
           echo "${bad_argument} $1"
           usage
           ;;
   esac
   shift
done

# Check whether an external name is required
REQ_EXTERNAL="$(getServerConfig \
    "template.image.require${DEPLOYCONF_EXTERNAL_NAME}")"
if [ "${REQ_EXTERNAL}" == "1" ]
then
    while [ -z "${external_name}" -a ${prompt} -eq 1 ]
    do
	# Prompt for the external name
	echo $N "${require_externalname} " $C
	read external_name
    done

    # If obtained a value from prompt or deployment script reset the template.instance flag
    # And store the external name
    if [ -n "${external_name}" ]
    then
        editServerConfig \
            "template.instance.${DEPLOYCONF_EXTERNAL_NAME}" "${external_name}"
        editServerConfig \
            "template.instance.require${DEPLOYCONF_EXTERNAL_NAME}" 0
    fi
fi

# Check whether an external access port is required
REQ_EXTERNALACCESSPORT="$(getServerConfig \
    "template.image.require${DEPLOYCONF_EXTERNAL_PORT}")"
if [ "${REQ_EXTERNALACCESSPORT}" == "1" ]
then
    edit_config=1
    if [ -z "${external_access_port}" ]
    then
        edit_config=0
        if [ ${prompt} -eq 1 ]
        then
            # Prompt for the external access port if it's not available
            edit_config=1
            echo $N "${require_externalaccessport} " $C
            read external_access_port
        fi

        if [ -z "${external_access_port}" ]
        then
            # If it's still missing, use default
            external_access_port=$HTTPS_PORT
        fi
    fi

    # Store the external access port
    editServerConfig "template.instance.${DEPLOYCONF_EXTERNAL_PORT}" \
        "${external_access_port}"

    # If obtained a value from prompt or deployment script reset the template.instance flag
    if [ ${edit_config} -eq 1 ]
    then
        editServerConfig \
            "template.instance.require${DEPLOYCONF_EXTERNAL_PORT}" 0
    fi
fi

# Check whether a password is required
REQ_PASSWORD="$(getServerConfig \
    "template.image.require${DEPLOYCONF_PASSWORD}")"
if [ "${REQ_PASSWORD}" == "1" ] 
then
    echo "${password_prompt}"
    # Call "tarantella prepare sgdadmin_user" to prompt for the password
    "${TTABINDIR}/tarantella" prepare sgdadmin_user ${deployment_arg} ${sgdadmin_prompt_arg}
    if [ $? -eq 0 ] 
    then
        # If used deployment script or could prompt then password must be set
        if [ -n "${deployment_arg}" -o -z "${sgdadmin_prompt_arg}" ]
        then
            # Successfully set the password, so reset the template instance flag
            editServerConfig \
                "template.instance.require${DEPLOYCONF_PASSWORD}" 0
        fi
    fi
fi

# Check whether the generation of the Diffie-Hellman parameters is required
REQ_DHPARAMS=`getServerConfig "template.image.require${DEPLOYCONF_DHPARAMS}"`
if [ "${REQ_DHPARAMS}" == "1" ]
then
    if [ ${regen_dh_param} -eq 1 ]
    then
        instdir="${TTADIR}" sh "${TTADIR}/bin/scripts/install_scripts/tsp/dhparams"
    fi
    # Reset the template.instance flag
    editServerConfig "template.instance.require${DEPLOYCONF_DHPARAMS}" 0
fi
