#!/bin/sh
#
# Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved.
#
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License v. 2.0, which is available at
# http://www.eclipse.org/legal/epl-2.0.
#
# This Source Code may also be made available under the following Secondary
# Licenses when the conditions for such availability set forth in the
# Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
# version 2 with the GNU Classpath Exception, which is available at
# https://www.gnu.org/software/classpath/license.html.
#
# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
#

#--- Extract environment properties --- "sed" doesn't work with iastools.zip used in windows
PASSWORD_FILE=${APS_HOME}/devtests/connector/config/password.txt
for x in `cat $APS_HOME/devtests/connector/config/ee-config.properties`
do
    varval=`echo $x |cut -d'=' -f1`
                                                                                                                                                             
    if [ $varval = "admin.user" ];
    then
        AS_ADMIN_USER=`echo $x |cut -d'=' -f2`
    fi
                                                                                                                                                             
    if [ $varval = "admin.port" ];
    then
        AS_ADMIN_PORT=`echo $x |cut -d'=' -f2`
    fi
                                                                                                                                                             
    if [ $varval = "admin.host" ];
    then
        AS_ADMIN_HOST=`echo $x |cut -d'=' -f2`
    fi
                                                                                                                                                             
    if [ $varval = "orb.port" ];
    then
        ORB_LISTENER_1_PORT=`echo $x |cut -d'=' -f2`
    fi
                                                                                                                                                             
    if [ $varval = "http.port" ];
    then
        HTTP_LISTENER_1_PORT=`echo $x |cut -d'=' -f2`
    fi
                                                                                                                                                             
    if [ $varval = "https.port" ];
    then
        SSL_PORT=`echo $x |cut -d'=' -f2`
    fi
                                                                                                                                                             
    if [ $varval = "admin.password" ];
    then
        echo "AS_ADMIN_PASSWORD=`echo $x |cut -d'=' -f2`" > ${PASSWORD_FILE}
        echo "AS_ADMIN_ADMINPASSWORD=`echo $x |cut -d'=' -f2`" >> ${PASSWORD_FILE}
    fi
    
    if [ $varval = "master.password" ];
    then
        echo "AS_ADMIN_MASTERPASSWORD=`echo $x |cut -d'=' -f2`" >> ${PASSWORD_FILE}
    fi
                                                                                                                                                             
    if [ $varval = "admin.domain" ];
    then
        AS_ADMIN_DOMAIN=`echo $x |cut -d'=' -f2`
    fi
    if [ $varval = "nodeagent.name" ];
    then
        AS_ADMIN_NODEAGENT=`echo $x |cut -d'=' -f2`
    fi
                                                                                                                                                             
    if [ $varval = "server.instance.name" ];
    then
        AS_ADMIN_SERVER=`echo $x |cut -d'=' -f2`
    fi
                                                                                                                                                             
    if [ $varval = "cluster.name" ];
    then
        CLUSTER_NAME=`echo $x |cut -d'=' -f2`
    fi
                                                                                                                                                             
    if [ $varval = "clustered.instance.name" ];
    then
        CLUSTERED_INSTANCE_NAME=`echo $x |cut -d'=' -f2`
    fi
                                                                                                                                                             
    if [ $varval = "install.type" ];
    then
        INSTALL_TYPE=`echo $x |cut -d'=' -f2`
    fi
                                                                                                                                                             
done
                                                                                                                                                             
ASADMIN=${S1AS_HOME}/bin/asadmin
HTTP_LISTENER_2_PORT="1042"
SSL_MUTUALAUTH_PORT="1058"
JMX_SYSTEM_CONNECTOR_PORT="8687"
                                                                                                                                                             
export AS_ADMIN_USER
#export AS_ADMIN_PASSWORD ## do not set AS_ADMIN_PASSWORD in env. -password option is deprecated.
export AS_ADMIN_PORT
export AS_ADMIN_HOST
export AS_ADMIN_DOMAIN
export AS_ADMIN_NODEAGENT
export AS_ADMIN_SERVER
export CLUSTER_NAME
export CLUSTERED_INSTANCE_NAME
                                                                                                                                                             

LOG_DIR=$APS_HOME/devtests/jdbc/logs

if [ ${INSTALL_TYPE} = "standalone" ]; then
#  ----------------
    # Stop server instance: sqe-server----
    echo "              EEUNSETUP: stopping sever instance:${AS_ADMIN_SERVER}..."
    ${ASADMIN} stop-instance \
        --user ${AS_ADMIN_USER} \
        --passwordfile ${PASSWORD_FILE} \
        ${AS_ADMIN_SERVER}

    ${ASADMIN} delete-instance \
        --user ${AS_ADMIN_USER} \
        --passwordfile ${PASSWORD_FILE} \
        ${AS_ADMIN_SERVER}
fi

if [ ${INSTALL_TYPE} = "cluster" ]; then
#  ----------------
    # Create server instance: sqe-server----
    echo "              EEUNSETUP: stopping cluster ${CLUSTER_NAME}"
    ${ASADMIN} stop-cluster \
        --user ${AS_ADMIN_USER} \
        --passwordfile ${PASSWORD_FILE} \
        ${CLUSTER_NAME}

   ${ASADMIN} delete-instance \
        --user ${AS_ADMIN_USER} \
        --passwordfile ${PASSWORD_FILE} \
        ${CLUSTERED_INSTANCE_NAME}_1

   ${ASADMIN} delete-instance \
        --user ${AS_ADMIN_USER} \
        --passwordfile ${PASSWORD_FILE} \
        ${CLUSTERED_INSTANCE_NAME}_2

   ${ASADMIN} delete-cluster \
        --user ${AS_ADMIN_USER} \
        --passwordfile ${PASSWORD_FILE} \
        ${CLUSTER_NAME}
fi


echo "              EEUNSETUP: stopping nodeagent....."
${ASADMIN} stop-node-agent $AS_ADMIN_NODEAGENT

echo "              EEUNSETUP: Deleting nodeagent....."
${ASADMIN} delete-node-agent ${AS_ADMIN_NODEAGENT}

echo "              EEUNSETUP: Deleting nodeagent config....."
${ASADMIN} delete-node-agent-config --passwordfile ${PASSWORD_FILE} ${AS_ADMIN_NODEAGENT}

echo "              EEUNSETUP: stopping domain...."
${ASADMIN} stop-domain ${AS_ADMIN_DOMAIN}

${ASADMIN} delete-domain ${AS_ADMIN_DOMAIN}
echo "              EEUNSETUP: EE domain,server instance and nodeagent has been deleted"

rm -f $PASSWORD_FILE
echo "		    EEUNSETUP: Unsetup complete.... "

