#!/bin/sh
###############################################################################
# WebSphere Application Server liberty administrative pre-uninstall script for 
# IBM i
#
# Copyright IBM Corp. 2012, 2022
# The source code for this program is not published or other-
# wise divested of its trade secrets, irrespective of what has
# been deposited with the U.S. Copyright Office.
# 
# ----------------------------------------------------------------------------
#
# Run the _iPreUninstallUtility script before removing product files on IBM i. 
# However, this step is only for manual administrative "unzip" 
# installations. Do not use this command for manual developer installations.
# The administrator must have *ALLOBJ and *SECADM special authority to run this 
# script.
#
#

usage() {
  echo ""
  echo "Usage: _iPreUninstallUtility [options]"
  echo ""
  echo "Options:"
  echo "  --action [ DLTPRDLOD | DLTPRDLIB | DLTSHRPRDLIB ]"
  echo "  --appdatadir im_application_data_directory"
  echo ""
  echo "The --appdatadir option is required for the"
  echo "DLTPRDLOD action and is ignored by all other actions."
  exit 1
}

set_wlp_install_dir() {
        CUR_DIR=`pwd`
        WLP_DIR=`dirname ${0}`/../../../../
        cd "${WLP_DIR}"
        WLP_INSTALL_DIR=`pwd`
        cd "${CUR_DIR}"
}

##
## evalJavaPropsFile: Reads Java properties from file specified in $1,
## and for every property it replaces all "." with "_" in the property name, 
## sets the resulting named script variable to the property value and exports 
## the variable.
evalJavaPropsFile()
{
  if [ -f "$1" ]; then
    while read -r line; do
      case $line in
      \#*);;
      *=*)
        # Only accept alphanumeric variable names to avoid eval complexities.
        if var=`echo "$line" | sed -e 's/^\([a-zA-Z0-9_\.][a-zA-Z0-9_\.]*\)=.*/\1/'`; then
          var=`echo $var | sed -e 's/\./_/g'`
          value=\'`echo "$line" | sed -e 's/[^=]*=//' -e s/\'/\'\"\'\"\'/g`\'
          eval "$var=$value; export $var"
        fi
      esac
    done < "$1"
  fi
}

delete_prod_lib() {
  echo "Executing delete_prod_lib"
  if [ -e ${WAS_PRODUCT_LIB_PATH} ]; then
    system "QSYS/DLTLIB LIB(${WAS_PRODUCT_LIB})"
    if [ $? -ne 0 ]; then
      ERR_CHK=1
    fi
  fi
}

delete_shared_prod_lib() {
  echo "Executing delete_shared_prod_lib"
	ALPHABET="A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Z"

	PROD_LIB=${SHR_PROD_LIB}A
	DELETE_SHR_PRD_LIB=true
	for letter in $ALPHABET
	do
		if [ -e /QSYS.LIB/${PROD_LIB}.LIB ]; then
			DELETE_SHR_PRD_LIB=false
			echo "Library /QSYS.LIB/${PROD_LIB}.LIB exists, so the shared library will not be deleted"
		else
			echo "Library /QSYS.LIB/${PROD_LIB}.LIB does not exist"
		fi	
		PROD_LIB=${SHR_PROD_LIB}${letter}
	done

	if [ "$DELETE_SHR_PRD_LIB" = "true" ]; then
  	echo "Clearing output queue"
  	system "QSYS/CLROUTQ OUTQ(QWAS9/QWASOUTQ)"
      if [ $? -ne 0 ]; then
        ERR_CHK=1
      fi
  	echo "Removing TCP Service Table port entries"
  	system "QSYS/CALL PGM(QWAS9/QWASCLN)"
      if [ $? -ne 0 ]; then
        ERR_CHK=1
      fi
  	echo "Ending QWAS9 subsystem"
  	system "QSYS/ENDSBS SBS(QWAS9) OPTION(*IMMED)"
  	sleep 5
  	echo "Since this is the last product, we can safely remove the Base Product Load QWAS00M"
      export QIBM_MULTI_THREADED=N
      system "CALL QSYS/QSZDLTPL PARM('$1   QWAS9    ' '')"
      if [ $? -ne 0 ]; then
        ERR_CHK=1
      fi
  	system "QSYS/DLTLIB LIB(QWAS9)"
      if [ $? -ne 0 ]; then
        ERR_CHK=1
      fi
  else 
  	echo "Did not remove the shared product library (QWAS9) because other product installations are using the shared library"
	fi
}

delete_prod_load() {

  APP_DATA_LOC=$1
	echo "IM App Data location used: ${APP_DATA_LOC}"
	if [ "$PRODUCT_EDITION" = "EXPRESS" ]; then
		grep package.*com.ibm.websphere.liberty.EXPRESS.v90 ${APP_DATA_LOC}/installed.xml > tmp
		grep package.*com.ibm.websphere.liberty.EXPRESSTRIAL.v90 ${APP_DATA_LOC}/installed.xml >> tmp
		grep package.*com.ibm.websphere.liberty.WEBENAB.v90 ${APP_DATA_LOC}/installed.xml >> tmp
		grep package.*com.ibm.websphere.EXPRESS.v90 ${APP_DATA_LOC}/installed.xml >> tmp
		grep package.*com.ibm.websphere.EXPRESSTRIAL.v90 ${APP_DATA_LOC}/installed.xml >> tmp
		grep package.*com.ibm.websphere.WEBENAB.v90 ${APP_DATA_LOC}/installed.xml >> tmp
		PROD_LOAD=QWAS01M
		echo "Product Load = $PROD_LOAD"
	fi
	if [ "$PRODUCT_EDITION" = "BASE" ]; then
		grep package.*com.ibm.websphere.liberty.BASE.v90 ${APP_DATA_LOC}/installed.xml > tmp
		grep package.*com.ibm.websphere.liberty.BASETRIAL.v90 ${APP_DATA_LOC}/installed.xml >> tmp
		grep package.*com.ibm.websphere.liberty.WEBENAB\' ${APP_DATA_LOC}/installed.xml >> tmp
		grep package.*com.ibm.websphere.BASE.v90 ${APP_DATA_LOC}/installed.xml >> tmp
		grep package.*com.ibm.websphere.BASETRIAL.v90 ${APP_DATA_LOC}/installed.xml >> tmp
		grep package.*com.ibm.websphere.DEVELOPERS.v90 ${APP_DATA_LOC}/installed.xml >> tmp
		grep package.*com.ibm.websphere.DEVELOPERSILAN.v90 ${APP_DATA_LOC}/installed.xml >> tmp
		grep package.*com.ibm.websphere.WEBENAB.v90 ${APP_DATA_LOC}/installed.xml >> tmp
		PROD_LOAD=QWAS02M
		echo "Product Load = $PROD_LOAD"
	fi
	if [ "$PRODUCT_EDITION" = "DEVELOPERS" ]; then
		grep package.*com.ibm.websphere.liberty.DEVELOPERS.v90 ${APP_DATA_LOC}/installed.xml >> tmp
		grep package.*com.ibm.websphere.liberty.DEVELOPERSILAN.v90 ${APP_DATA_LOC}/installed.xml >> tmp
		PROD_LOAD=QWAS02M
		echo "Product Load = $PROD_LOAD"
	fi
	if [ "$PRODUCT_EDITION" = "ND" ]; then
        grep package.*com.ibm.websphere.liberty.ND\' ${APP_DATA_LOC}/installed.xml > tmp
        grep package.*com.ibm.websphere.liberty.ND.v90 ${APP_DATA_LOC}/installed.xml >> tmp
		grep package.*com.ibm.websphere.liberty.NDTRIAL.v90 ${APP_DATA_LOC}/installed.xml >> tmp
		grep package.*com.ibm.websphere.ND.v90 ${APP_DATA_LOC}/installed.xml >> tmp
		grep package.*com.ibm.websphere.NDTRIAL.v90 ${APP_DATA_LOC}/installed.xml >> tmp
		PROD_LOAD=QWAS03M
		echo "Product Load = $PROD_LOAD"
	fi
	if [ "$PRODUCT_EDITION" = "LIBERTY_CORE" ]; then
		grep package.*com.ibm.websphere.liberty.v90 ${APP_DATA_LOC}/installed.xml > tmp
		grep package.*com.ibm.websphere.liberty.TRIAL.v90 ${APP_DATA_LOC}/installed.xml >> tmp
		PROD_LOAD=QWAS05M
		echo "Product Load = $PROD_LOAD"
	fi
  count=0
  if [ -e tmp ]; then
    while read line   
      do  
        echo "$line"
        count=`expr $count + 1`
      done < tmp
    rm -f tmp

    echo "Total instances of package $PRODUCT_EDITION = $count"
	
    if [ -e /QSYS.LIB/QWAS9.LIB/${PROD_LOAD}.PRDLOD ]; then
      if [ $count -le 1 ]; then
        export QIBM_MULTI_THREADED=N
        system "CALL QSYS/QSZDLTPL PARM('${PROD_LOAD}   QWAS9    ' '')"
      else
        echo "Not removing product load $PROD_LOAD because there are more than one instance of this offering"
      fi
    else
      echo "Product load $PROD_LOAD was not found"
    fi
  else 
    echo "Could not find any instance of the offering $PRODUCT_EDITION, doing nothing"
  fi

}

do_default() {
#
  echo "Executing $ACTION"
  delete_prod_lib
  delete_shared_prod_lib
}


if [ "`uname`" != "OS400" ]; then
 exit 1
fi

# Validate parameters
# Do the whole 9 yards if no parameters are passed.

ACTION=DODEFAULT
ERR_CHK=0
APPDATADIR=

while [ $# -gt 0 ]; do
  case $1 in
    '--action') if [ $# -gt 1 ]; then
	  ACTION=$2;shift
	fi
    ;;
    '--appdatadir') if [ $# -gt 1 ]; then
	  APPDATADIR=$2;shift
	fi
    ;;
    *) usage
    ;;
  esac
  shift
done

echo "Action = $ACTION"

if [ ${ACTION} = "DLTPRDLOD" ]; then
  if [ ! ${APPDATADIR} ]; then
    usage
  fi
fi

SHR_PROD_LIB=QWAS9
set_wlp_install_dir

echo "WebSphere liberty profile install root is ${WLP_INSTALL_DIR}"

evalJavaPropsFile ${WLP_INSTALL_DIR}/lib/versions/WebSphereApplicationServer.properties
echo "Product edition is "${com_ibm_websphere_productEdition}
echo "Installation type is "${com_ibm_websphere_productInstallType}

IS_IM_INSTALL=
if [ ${com_ibm_websphere_productInstallType} = "InstallationManager" ]; then
  IS_IM_INSTALL=true
else
  SCRIPT_DIR="${WLP_INSTALL_DIR}/bin"
  LSOUT=`ls -ld ${SCRIPT_DIR}`
  SCRIPT_DIR_OWNER=
  FCOUNT=0
  for LSTOKEN in $LSOUT
    do
      FCOUNT=`expr $FCOUNT + 1`
      if [ $FCOUNT = 3 ]; then
        SCRIPT_DIR_OWNER=$LSTOKEN
        break
      fi
  done
  echo Owner of ${SCRIPT_DIR} directory is ${SCRIPT_DIR_OWNER}
  if [ ! ${SCRIPT_DIR_OWNER} = "QSYS" ]; then
    echo "Nothing to do because the \"iAdmin POSTINSTALL\" command has not been run."
    exit 0
  fi
fi

if [ ! -e ${WLP_INSTALL_DIR}/etc/default.env ]; then
  echo "Error: ${WLP_INSTALL_DIR}/etc/default.env does not exist"
  exit 1
fi
. ${WLP_INSTALL_DIR}/etc/default.env

PRODUCT_EDITION=${com_ibm_websphere_productEdition}

case "$ACTION" in
  'DODEFAULT') do_default
  ;;
  'DLTPRDLOD') delete_prod_load ${APPDATADIR}
  ;;
  'DLTPRDLIB') delete_prod_lib
  ;;
  'DLTSHRPRDLIB') delete_shared_prod_lib
  ;;
  *)
  usage
  ;;
esac

exit ${ERR_CHK}