#!/bin/sh

###################################################################################################
# function - check if the weblogic server is up or not
###################################################################################################
checkStatus () {
  # check startup status from log file
  LOG_FILE="${DOMAIN_HOME}/$1_jrt.log"
  COUNT=0
  while [ $COUNT -lt 60 ]; do
    if [ "x`tail -100l ${LOG_FILE} 2>&1 | egrep 'Server started in RUNNING mode'`" != "x" ]; then
      break
    fi

    sleep 3
    COUNT=`expr $COUNT + 1`
  done
  echo "Server $1 has started!"
}

###################################################################################################
#Note: this script is to pre-configure the weblogic server for installing the jrt-weblogic.ear. Before
#      run this script, make sure the domain and server are created already. WLST can create the domain though
# TODO: it is a little hard to restore it to clean state!!!
# TODO: try drop the domain/server at the first, then create domain/server from the scratch
# TODO: 1) if DOMAIN_HOME exists, then goto there and stop weblogic, then delete the domain directory; 
#       2) use wlst to create a new domain with the servers
###################################################################################################
#1, setup the environment path
###################################################################################################
## necessary parameters
WL_HOME="/scratch/swu/Middleware/wlserver_10.3"
#target Server name
#TARGET_SERVER=AdminServer
TARGET_SERVER=MyServer1
USER=weblogic
PASSWORD=welcome1
ADMIN_URL=t3://localhost:7001
audit_uri="localhost:1521/ora111.us.oracle.com"

DOMAIN_NAME=owb
#Admin Server name - created when create domain by default
SERVER_NAME=AdminServer
JAVA_HOME=$WL_HOME/../jdk160_11
TARGET_PORT=7003
DOMAIN_HOME=$WL_HOME/../user_projects/domains/$DOMAIN_NAME
# hardcode APP_NAME here, as the context-root has been hardcoded in application.xml
APP_NAME=jrt

CLASSPATH=$WL_HOME/server/lib/weblogic.jar:$CLASSPATH
export CLASSPATH

PATH=$WL_HOME/server/bin:$JAVA_HOME/bin:$PATH
export PATH

# set the WLS_USER/WLS_PW, so no need to enter credentials when startup Managed Server
WLS_USER=$USER
export WLS_USER

WLS_PW=$PASSWORD
export WLS_PW

# TODO: considering what are the necessary parameters which should be passed in
if [ $# -eq 1 ]
then
  echo "the parameter will be used as password, others will use default value!"
  PASSWORD=$1
elif [ $# -eq 8 ]
then
  echo "get values from parameters!"
  WL_HOME=$1
  ADMIN_URL=$2
  TARGET_SERVER=$3
  USER=$4
  PASSWORD=$5
  audit_uri=$6
else
  echo "wrong parameters! either provide 1 parameter for \"PASSWORD\" or provide 6 parameters for \"WL_HOME ADMIN_URL TARGET_SERVER USER PASSWORD audit_uri\""
  exit 1
fi


###################################################################################################
#2, stop weblogic and modify the startWebLogic.sh 
###################################################################################################
if [ -e $DOMAIN_HOME ]
then
  echo "@@@@@@@@@@@@@@@@@@try to stop the weblogic and drop the existing domain@@@@@@@@@@@@@@@"
  cd $DOMAIN_HOME/bin
  # stop weblogic; stop managed server first in case target is not Admin Server
  if [ "${SERVER_NAME}" != "${TARGET_SERVER}" ]
  then
      ./stopManagedWebLogic.sh $TARGET_SERVER $ADMIN_URL $USER $PASSWORD
  fi
  ./stopWebLogic.sh
  # now remove the domain
  cd ../..
  rm -rf $DOMAIN_NAME
fi

# now create the domain with offline mode
echo "@@@@@@@@@@@@@@@@@@create weblogic domain in offline mode@@@@@@@@@@@@@@@"
cd $WL_HOME/../user_projects/domains
echo "createDomain('$WL_HOME/common/templates/domains/wls.jar','$DOMAIN_HOME','$USER','$PASSWORD')" > config.py
echo "exit()" >> config.py

$JAVA_HOME/bin/java weblogic.WLST config.py

# modify startWebLogic.sh to add external options
echo "@@@@@@@@@@@@@@@@@@update the startup script@@@@@@@@@@@@@@@"
cd $DOMAIN_HOME/bin
cp startWebLogic.sh startWebLogic.sh.orig
sed -e 's/weblogic.policy/weblogic.policy -Doracle.j2ee.home=${DOMAIN_HOME} -Dpython.path=${DOMAIN_HOME}\/lib\/jython_lib.zip:${DOMAIN_HOME}\/lib\/jython_owblib.jar/g' startWebLogic.sh > startWebLogic.sh.tmp
sed -e '/-version/ a WLS_REDIRECT_LOG=\"\${DOMAIN_HOME}\/\${SERVER_NAME}_jrt.log\"' startWebLogic.sh.tmp > startWebLogic.sh
rm startWebLogic.sh.tmp

cp startManagedWebLogic.sh startManagedWebLogic.sh.orig
sed -e 's/WLS_USER=\"\"/WLS_USER=\${WLS_USER}/g' startManagedWebLogic.sh > startManagedWebLogic.sh.tmp
sed -e 's/WLS_PW=\"\"/WLS_PW=\${WLS_PW}/g' startManagedWebLogic.sh.tmp > startManagedWebLogic.sh
rm startManagedWebLogic.sh.tmp

# modify setDomainEnv.sh to add jython.jar (at the front to override the jython in weblogic.jar)
cp setDomainEnv.sh setDomainEnv.sh.orig
sed '$a CLASSPATH=\"\${DOMAIN_HOME}/lib/jython.jar\${CLASSPATHSEP}\${CLASSPATH}\${CLASSPATHSEP}\${DOMAIN_HOME}/lib/jrt.jar\${CLASSPATHSEP}\${DOMAIN_HOME}/lib/ojdl.jar\${CLASSPATHSEP}\${DOMAIN_HOME}/lib/dms.jar\${CLASSPATHSEP}\${DOMAIN_HOME}/lib/ojdl2.jar\${CLASSPATHSEP}\${DOMAIN_HOME}/lib/xmlparserv2.jar\${CLASSPATHSEP}\${DOMAIN_HOME}/lib/orawsdl.jar\"' setDomainEnv.sh > setDomainEnv.sh.tmp
sed '$a export CLASSPATH' setDomainEnv.sh.tmp > setDomainEnv.sh
rm setDomainEnv.sh.tmp


###################################################################################################
#3, copy necessary libraries to DOMAIN_HOME/lib
# TODO: weblogic_jrt_lib.zip contains necessary jars (non jdbc jars)!!
###################################################################################################
echo "@@@@@@@@@@@@@@@@@@setup the weblogic libraries@@@@@@@@@@@@@@@"
cd $DOMAIN_HOME/lib
rm -rf *.zip *.jar

cp $OWB_HOME/owb/lib/non_ship/ext_copy/*.jar .
cp $OWB_HOME/owb/jrt/applications/weblogic_jrt_lib.zip .
unzip weblogic_jrt_lib.zip


###################################################################################################
#4, copy ct_permission.properties and platform properties
# TODO: it is important to create that jrt/config directory!! Also create jrt/applications dir!
###################################################################################################
echo "@@@@@@@@@@@@@@@@@@copy the ct_permissions file@@@@@@@@@@@@@@@"
cd $DOMAIN_HOME/config
mkdir -p $APP_NAME/config
cd $APP_NAME/config
cp $OWB_HOME/owb/bin/non_ship/ct_permissions.properties .

cd $DOMAIN_HOME/config
mkdir -p $APP_NAME/applications/$APP_NAME/platforms
cd $APP_NAME/applications/$APP_NAME/platforms
cp $SRCHOME/oracle/wh/jrt/sdk/platform/xml/* .

###################################################################################################
#5, start weblogic
# TODO: !!startWebLogic.sh does not return, we need find a block way for startup!!
# TODO: setup the managed server here and set some properties
###################################################################################################
cd $DOMAIN_HOME/bin

# start weblogic
./startWebLogic.sh &
checkStatus ${SERVER_NAME}

# start managed server if needed
if [ "${SERVER_NAME}" != "${TARGET_SERVER}" ]
then
    # now create the managed server and set properties if needed
    echo "@@@@@@@@@@@@@@@@@@try create the managed server and set the listen port@@@@@@@@@@@@@@@"
    echo "connect('$USER','$PASSWORD','$ADMIN_URL')" > config.py
    echo "edit()" >> config.py
    echo "startEdit()" >> config.py
    echo "create('$TARGET_SERVER','Server')" >> config.py
    echo "cd('Servers/$TARGET_SERVER')" >> config.py
    echo "set('ListenPort', $TARGET_PORT)" >> config.py
    echo "save()" >> config.py
    echo "activate(block='true')" >> config.py
    echo "exit()" >> config.py

    $JAVA_HOME/bin/java weblogic.WLST config.py

    ./startManagedWebLogic.sh $TARGET_SERVER $ADEMIN_URL &
    checkStatus ${TARGET_SERVER}
fi


###################################################################################################
#6, setup security roles (use groups -- roles, so that we can grant role easily)
###################################################################################################
# config.py
echo "@@@@@@@@@@@@@@@@@@create weblogic security roles@@@@@@@@@@@@@@@"
echo "connect('$USER','$PASSWORD','$ADMIN_URL')" > config.py
echo "antr=cmo.getSecurityConfiguration().getDefaultRealm().lookupAuthenticationProvider('DefaultAuthenticator')" >> config.py
#echo "cd('SecurityConfiguration/$DOMAIN_NAME/DefaultRealm/myrealm/AuthenticationProviders/DefaultAuthenticator')" >> config.py
echo "antr.createGroup('OWB_J2EE_EXECUTOR','owb executors group')" >> config.py
echo "antr.createGroup('OWB_J2EE_OPERATOR','owb operators group')" >> config.py
echo "antr.createGroup('OWB_J2EE_ADMINISTRATOR','owb administrators group')" >> config.py
echo "antr.createGroup('OWB_INTERNAL_USERS','owb internal users group')" >> config.py
echo "antr.addMemberToGroup('OWB_J2EE_EXECUTOR','OWB_J2EE_OPERATOR')" >> config.py
echo "antr.addMemberToGroup('Administrators','OWB_J2EE_OPERATOR')" >> config.py
echo "antr.addMemberToGroup('OWB_J2EE_EXECUTOR','OWB_J2EE_ADMINISTRATOR')" >> config.py
echo "antr.addMemberToGroup('OWB_J2EE_OPERATOR','OWB_J2EE_ADMINISTRATOR')" >> config.py
echo "antr.addMemberToGroup('OWB_J2EE_ADMINISTRATOR','$USER')" >> config.py
echo "rlmp=cmo.getSecurityConfiguration().getDefaultRealm().lookupRoleMapper('XACMLRoleMapper')" >> config.py
#echo "cd('../../RoleMappers/XACMLRoleMapper')" >> config.py
echo "rlmp.createRole(None,'OWB_J2EE_EXECUTOR','Grp(OWB_J2EE_EXECUTOR)')" >> config.py
echo "rlmp.createRole(None,'OWB_J2EE_OPERATOR','Grp(OWB_J2EE_OPERATOR)')" >> config.py
echo "rlmp.createRole(None,'OWB_J2EE_ADMINISTRATOR','Grp(OWB_J2EE_ADMINISTRATOR)')" >> config.py
echo "rlmp.createRole(None,'OWB_INTERNAL_USERS','Grp(OWB_INTERNAL_USERS)')" >> config.py
echo "exit()" >> config.py

$JAVA_HOME/bin/java weblogic.WLST config.py


###################################################################################################
#7, setup audit datasource
###################################################################################################
echo "@@@@@@@@@@@@@@@@@@create weblogic audit data source@@@@@@@@@@@@@@@"
echo "connect('$USER','$PASSWORD','$ADMIN_URL')" > config.py
echo "cd('/')" >> config.py
echo "edit()" >> config.py
echo "startEdit()" >> config.py
echo "jdbcSR=cmo.createJDBCSystemResource('AuditDS')" >> config.py
echo "jdbcRS=jdbcSR.getJDBCResource()" >> config.py
echo "jdbcRS.setName('AuditDS')" >> config.py
echo "dsParams=jdbcRS.getJDBCDataSourceParams()" >> config.py
echo "dsParams.addJNDIName('jdbc/AuditDS')" >> config.py
echo "dsParams.setGlobalTransactionsProtocol('None')" >> config.py
echo "driverParams=jdbcRS.getJDBCDriverParams()" >> config.py
echo "driverParams.setUrl('jdbc:oracle:thin:@//$audit_uri')" >> config.py
echo "driverParams.setDriverName('oracle.jdbc.pool.OracleDataSource')" >> config.py
echo "driverParams.setPassword('owbsys_audit')" >> config.py
echo "driverProperties=driverParams.getProperties()" >> config.py
echo "proper=driverProperties.createProperty('user')" >> config.py
echo "proper.setValue('owbsys_audit')" >> config.py
echo "targetServer=getMBean('Servers/$TARGET_SERVER')" >> config.py
echo "jdbcSR.addTarget(targetServer)" >> config.py
echo "save()" >> config.py
echo "activate(block='true')" >> config.py
echo "exit()" >> config.py

$JAVA_HOME/bin/java weblogic.WLST config.py


###################################################################################################
#8, setup jms queues
###################################################################################################
echo "@@@@@@@@@@@@@@@@@@create weblogic jms queues@@@@@@@@@@@@@@@"
echo "connect('$USER','$PASSWORD','$ADMIN_URL')" > config.py
echo "cd('/')" >> config.py
echo "edit()" >> config.py
echo "startEdit()" >> config.py
echo "targetServer=getMBean('Servers/$TARGET_SERVER')" >> config.py
echo "jmsServer=cmo.createJMSServer('AgentJMSServer')" >> config.py
echo "jmsServer.addTarget(targetServer)" >> config.py
echo "jmsSR=cmo.createJMSSystemResource('AgentJMS')" >> config.py
echo "jmsSR.addTarget(targetServer)" >> config.py
echo "subDep=jmsSR.createSubDeployment('DeployToJMSServer')" >> config.py
echo "subDep.addTarget(jmsServer)" >> config.py
echo "jmsRS=jmsSR.getJMSResource()" >> config.py
echo "owbQueue=jmsRS.createQueue('owbQueue')" >> config.py
echo "owbQueue.setJNDIName('jms/owbQueue')" >> config.py
echo "owbQueue.setSubDeploymentName('DeployToJMSServer')" >> config.py
### testing for jrt only begin, no need for generic purpose ###
echo "cd('/JMSSystemResources/AgentJMS/JMSResource/AgentJMS/Queues/owbQueue/DeliveryFailureParams/owbQueue')" >> config.py
echo "cmo.setRedeliveryLimit(0)" >> config.py
### testing for jrt only end ###
echo "abortQueue=jmsRS.createQueue('owb_abortQueue')" >> config.py
echo "abortQueue.setJNDIName('jms/owb_abortQueue')" >> config.py
echo "abortQueue.setSubDeploymentName('DeployToJMSServer')" >> config.py
#echo "connFactory=jmsRS.createConnectionFactory('owbConnFactory')" >> config.py
#echo "connFactory.setJNDIName('jms/QueueConnectionFactory')" >> config.py
#echo "connFactory.setSubDeploymentName('DeployToJMSServer')" >> config.py
echo "save()" >> config.py
echo "activate(block='true')" >> config.py
echo "exit()" >> config.py

$JAVA_HOME/bin/java weblogic.WLST config.py


###################################################################################################
#9, deploy jrt application
###################################################################################################
echo "@@@@@@@@@@@@@@@@@@deploy jrt application now@@@@@@@@@@@@@@@"
$JAVA_HOME/bin/java weblogic.Deployer -adminurl $ADMIN_URL -username $USER -password $PASSWORD -deploy -name $APP_NAME -source $OWB_HOME/owb/jrt/applications/jrt_weblogic_deploy.ear -targets ${TARGET_SERVER} -upload -securityModel CustomRoles -remote

# set the deployment order of JRT application
echo "@@@@@@@@@@@@@@@@@@setup the Deployment Order for jrt application@@@@@@@@@@@@@@@"
echo "connect('$USER','$PASSWORD','$ADMIN_URL')" > config.py
echo "cd('/')" >> config.py
echo "edit()" >> config.py
echo "startEdit()" >> config.py
echo "cd('AppDeployments/$APP_NAME')" >> config.py
echo "set('DeploymentOrder',50)" >> config.py
echo "save()" >> config.py
echo "activate(block='true')" >> config.py
echo "exit()" >> config.py

$JAVA_HOME/bin/java weblogic.WLST config.py


###################################################################################################
#10, restart weblogic again, to make some changes take effect, like disable AuditDS globalTrans
###################################################################################################
#if [ -e $DOMAIN_HOME ]
#then
#  echo "@@@@@@@@@@@@@@@@@@restart the weblogic@@@@@@@@@@@@@@@"
#  cd $DOMAIN_HOME/bin
#  # stop weblogic; stop managed server first in case target is not Admin Server
#  if [ "${SERVER_NAME}" != "${TARGET_SERVER}" ]
#  then
#      ./stopManagedWebLogic.sh $TARGET_SERVER $ADMIN_URL $USER $PASSWORD
#  fi
#  ./stopWebLogic.sh
#fi

## start weblogic
#cd $DOMAIN_HOME/bin
#./startWebLogic.sh &
#checkStatus ${SERVER_NAME}

## start managed server if needed
#if [ "${SERVER_NAME}" != "${TARGET_SERVER}" ]
#then
#    ./startManagedWebLogic.sh $TARGET_SERVER $ADEMIN_URL &
#    checkStatus ${TARGET_SERVER}
#fi


echo "@@@@@@@@@@@@@@@@@@Done with the weblogic setup@@@@@@@@@@@@@@@"
exit 0
