#!/bin/sh

# Copyright  2005 Sun Microsystems, Inc.  All rights reserved.
#
# Sun Microsystems, Inc. has intellectual property rights relating to
# technology embodied in the product that is described in this document.
# In particular, and without limitation, these intellectual property rights
# may include one or more of the U.S. patents listed at
# http://www.sun.com/patents and one or more additional patents or pending
# patent applications in the U.S. and in other countries.
#
# U.S. Government Rights - Commercial software.  Government users are subject
# to the Sun Microsystems, Inc. standard license agreement and applicable
# provisions of the FAR and its supplements.
#
# Use is subject to license terms.
#
# This distribution may include materials developed by third parties.Sun,
# Sun Microsystems and  the Sun logo are trademarks or registered trademarks
# of Sun Microsystems, Inc. in the U.S. and other countries.  
#
# Copyright  2005 Sun Microsystems, Inc. Tous droits rservs.
# Sun Microsystems, Inc. dtient les droits de proprit intellectuels relatifs
#  la technologie incorpore dans le produit qui est dcrit dans ce document.
# En particulier, et ce sans limitation, ces droits de proprit
# intellectuelle peuvent inclure un ou plus des brevets amricains lists
#  l'adresse http://www.sun.com/patents et un ou les brevets supplmentaires
# ou les applications de brevet en attente aux Etats - Unis et dans les
# autres pays.
#
# L'utilisation est soumise aux termes du contrat de licence.
#
# Cette distribution peut comprendre des composants dvelopps par des
# tierces parties.
#
# Sun,  Sun Microsystems et  le logo Sun sont des marques de fabrique ou des
# marques dposes de Sun Microsystems, Inc. aux Etats-Unis et dans
# d'autres pays.


#############################################################################
tuneInitConf() {
    tune_file="$CONTAINER_INSTANCE_DIR/config/init.conf"

    $ECHO $LINE_SEP
    $ECHO "Tuning $tune_file..."
    $ECHO
    $ECHO "File                 : $tune_file"
    $ECHO "Parameter tuning     :"
    $ECHO
    $ECHO "1.   RqThrottle"
    $ECHO "Current Value        : RqThrottle=`getMagnusEntry $tune_file 'RqThrottle'`"
    $ECHO "Recommended Value    : RqThrottle=$numRQThrottle"
    $ECHO
    $ECHO "2.   RqThrottleMin"
    $ECHO "Current Value        : RqThrottleMin=`getMagnusEntry $tune_file 'RqThrottleMin'`"
    $ECHO "Recommended Value    : RqThrottleMin=$AMTUNE_NUM_WS_RQTHROTTLE_MIN"
    $ECHO
    $ECHO "3.   ThreadIncrement"
    $ECHO "Current Value        : ThreadIncrement=`getMagnusEntry $tune_file 'ThreadIncrement'`"
    $ECHO "Recommended Value    : ThreadIncrement=$AMTUNE_NUM_WS_THREAD_INCREMENT"
    $ECHO
    $ECHO "4.   ConnQueueSize"
    $ECHO "Current Value        : ConnQueueSize=`getMagnusEntry $tune_file 'ConnQueueSize'`"
    $ECHO "Recommended Value    : ConnQueueSize=$AMTUNE_NUM_TCP_CONN_SIZE"
    $ECHO
    $ECHO "5.   ListenQ"
    $ECHO "Current Value        : ListenQ=`getMagnusEntry $tune_file 'ListenQ'`"
    $ECHO "Recommended Value    : ListenQ=$AMTUNE_NUM_TCP_CONN_SIZE"
    $ECHO
    $ECHO

    if [ "$AMTUNE_MODE" = "REVIEW" ]; then
        return
    fi

    check_file_for_write $tune_file
    if [ $? = 100 ]; then
        return
    fi

    delete_line $tune_file "RqThrottle"
    delete_line $tune_file "RqThrottleMin"
    delete_line $tune_file "ThreadIncrement"
    delete_line $tune_file "ConnQueueSize"
    delete_line $tune_file "ListenQ"
    delete_line $tune_file "# Start: Access Manager Tuning"
    delete_line $tune_file "# End: Access Manager Tuning"

    add_to_end $tune_file "# Start: Access Manager Tuning : `date`"
    add_to_end $tune_file "RqThrottle $numRQThrottle"
    add_to_end $tune_file "RqThrottleMin $AMTUNE_NUM_WS_RQTHROTTLE_MIN"
    add_to_end $tune_file "ThreadIncrement $AMTUNE_NUM_WS_THREAD_INCREMENT"
    add_to_end $tune_file "ConnQueueSize $AMTUNE_NUM_TCP_CONN_SIZE"
    add_to_end $tune_file "ListenQ $AMTUNE_NUM_TCP_CONN_SIZE"
    add_to_end $tune_file "# End: Access Manager Tuning"
}

deleteJVMOptionUsingASAdmin() {
    jvmOptionString=$1

    if [ "$jvmOptionString" = "<No value set>" ] || 
		[ "$jvmOptionString" = "" ] || 
		[ "$jvmOptionString" = "<Empty value>" ]; then
	return
    fi
	$ECHO
	$ECHO "Deleting JVM Option : $jvmOptionString"

	jvmOptionString=`$ECHO $jvmOptionString | $AWK ' BEGIN { FS = ":" ; ORS="" } {print ":"} { for (i = 1; i < NF; i++) { print $i; print "\\\:" } {print $i} }'`

        $ECHO $ASADMIN delete-jvm-options --user $ASADMIN_USER --passwordfile $ASADMIN_PASSFILE --host $ASADMIN_HOST --port $ASADMIN_PORT $ASADMIN_SECURE --interactive=$ASADMIN_INTERACTIVE --profiler=false --target $ASADMIN_TARGET :"$jvmOptionString"

        error_message=`$ASADMIN delete-jvm-options --user $ASADMIN_USER --passwordfile $ASADMIN_PASSFILE --host $ASADMIN_HOST --port $ASADMIN_PORT $ASADMIN_SECURE --interactive=$ASADMIN_INTERACTIVE --profiler=false --target $ASADMIN_TARGET :"$jvmOptionString"`

	$ECHO $error_message
}

insertJVMOptionUsingASAdmin() {
    jvmOptionString=$1

    if [ "$jvmOptionString" != "" ]; then
	$ECHO
	$ECHO "Inserting JVM Option : $jvmOptionString"

	jvmOptionString=`$ECHO $jvmOptionString | $AWK ' BEGIN { FS = ":" ; ORS="" } {print ":"} { for (i = 1; i < NF; i++) { print $i; print "\\\:" } {print $i} }'`

        $ECHO $ASADMIN create-jvm-options --user $ASADMIN_USER --passwordfile $ASADMIN_PASSFILE --host $ASADMIN_HOST --port $ASADMIN_PORT $ASADMIN_SECURE --interactive=$ASADMIN_INTERACTIVE --profiler=false --target $ASADMIN_TARGET :"$jvmOptionString"
        $ASADMIN create-jvm-options --user $ASADMIN_USER --passwordfile $ASADMIN_PASSFILE --host $ASADMIN_HOST --port $ASADMIN_PORT $ASADMIN_SECURE --interactive=$ASADMIN_INTERACTIVE --profiler=false --target $ASADMIN_TARGET :"$jvmOptionString"
    fi

}

tuneDomainXML() {
    tune_file="$CONTAINER_INSTANCE_DIR/config/domain.xml"

    $ECHO $LINE_SEP
    $ECHO "Tuning Application Server Instance..."
    $ECHO
    $ECHO "File                 : $tune_file (using asadmin command line tool)"
    $ECHO "Parameter tuning     :"
    $ECHO

    asadmin_acceptor_threads=`get_token_in_line $tune_file 'acceptor-threads' 'acceptor-threads'`

    $ECHO "1.   Acceptor Threads"
    $ECHO "Current Value        : acceptor-threads=$asadmin_acceptor_threads"
    $ECHO "Recommended Value    : acceptor-threads=$acceptorThreads"
    $ECHO

    asadmin_native_library_path_prefix=`get_token_in_line $tune_file 'native-library-path-prefix' 'native-library-path-prefix'` 

    $ECHO "2.   native-library-path-prefix (if Solaris 8)"
    $ECHO "Current Value        : native-library-path-prefix=$asadmin_native_library_path_prefix"
    $ECHO "Recommended Value    : native-library-path-prefix=/usr/lib/lwp"
    $ECHO

    asadmin_min_heap=`getASJVMOption '-Xms' 'flag' ','`
    asadmin_max_heap=`getASJVMOption '-Xmx' 'flag' ','`

    $ECHO "3.   Max and Min Heap Size"
    $ECHO "Current Value        : Min Heap: $asadmin_min_heap Max Heap: $asadmin_max_heap"
    $ECHO "Recommended Value    : -Xms${minHeapSize}M -Xmx${maxHeapSize}M"
    $ECHO

    asadmin_loggc=`getASJVMOption '-Xloggc' 'flag' ','` 

    $ECHO "4.   LogGC Output"
    $ECHO "Current Value        : $asadmin_loggc"
    $ECHO "Recommended Value    : -Xloggc:$CONTAINER_INSTANCE_DIR/logs/gc.log"
    $ECHO

    asadmin_xrs=`getASJVMOption '-Xrs' 'flag' ','`

    $ECHO "5.   Set JVM to receive less interrupts"
    $ECHO "Current Value        : $asadmin_xrs"
    $ECHO "Recommended Value    : -Xrs"
    $ECHO

    asadmin_serveroption=`getASJVMOption '-server' 'flag' ','`

    $ECHO "6.   JVM in Server mode"
    $ECHO "Current Value        : $asadmin_serveroption"
    $ECHO "Recommended Value    : -server"
    $ECHO

    asadmin_stacksize=`getASJVMOption '-Xss' 'flag' ','`

    $ECHO "7.   Stack Size"
    $ECHO "Current Value        : $asadmin_stacksize"
    $ECHO "Recommended Value    : -Xss${AMTUNE_PER_THREAD_STACK_SIZE_IN_KB}k"
    $ECHO

    asadmin_newsize=`getASJVMOption '-XX:NewSize' 'flag' ','`

    $ECHO "8.   New Size"
    $ECHO "Current Value        : $asadmin_newsize"
    $ECHO "Recommended Value    : -XX:NewSize=${maxNewSize}M"
    $ECHO

    asadmin_maxnewsize=`getASJVMOption '-XX:MaxNewSize' 'flag' ','`

    $ECHO "9.   Max New Size"
    $ECHO "Current Value        : $asadmin_maxnewsize"
    $ECHO "Recommended Value    : -XX:MaxNewSize=${maxNewSize}M"
    $ECHO

    asadmin_permsize=`getASJVMOption '-XX:PermSize' 'flag' ','`

    $ECHO "10.  Perm Size"
    $ECHO "Current Value        : $asadmin_permsize"
    $ECHO "Recommended Value    : -XX:PermSize=${maxPermSize}M (if the calculated value is >= ${AMTUNE_MIN_PERM_SIZE_AS8}M )"
    $ECHO

    asadmin_maxpermsize=`getASJVMOption '-XX:MaxPermSize' 'flag' ','`

    $ECHO "11.  Max Perm Size"
    $ECHO "Current Value        : $asadmin_maxpermsize"
    $ECHO "Recommended Value    : -XX:MaxPermSize=${maxPermSize}M (if the calculated value is >= ${AMTUNE_MIN_PERM_SIZE_AS8}M )"
    $ECHO

    asadmin_disableExplicitGC=`getASJVMOption '-XX:+DisableExplicitGC' 'flag' ','`

    $ECHO "12.  Disable Explicit GC"
    $ECHO "Current Value        : $asadmin_disableExplicitGC"
    $ECHO "Recommended Value    : -XX:+DisableExplicitGC"
    $ECHO

    asadmin_parallelGC=`getASJVMOption '-XX:+UseParNewGC' 'flag' ','`

    $ECHO "13.  Use Parallel GC"
    $ECHO "Current Value        : $asadmin_parallelGC"
    $ECHO "Recommended Value    : -XX:+UseParNewGC"
    $ECHO

    asadmin_cmspermgensweeping=`getASJVMOption '-XX:+CMSPermGenSweepingEnabled' 'flag' ','`

    $ECHO "14.  CMSPermGenSweepingEnabled"
    $ECHO "Current Value        : $asadmin_cmspermgensweeping"
    $ECHO "Recommended Value    : -XX:+CMSPermGenSweepingEnabled"
    $ECHO

    asadmin_cmsclassunloading=`getASJVMOption '-XX:+CMSClassUnloadingEnabled' 'flag' ','`

    $ECHO "15.  CMS Class Unloading"
    $ECHO "Current Value        : $asadmin_cmsclassunloading"
    $ECHO "Recommended Value    : -XX:+CMSClassUnloadingEnabled"
    $ECHO

    asadmin_usecmscompact=`getASJVMOption '-XX:+UseCMSCompactAtFullCollection' 'flag' ','`

    $ECHO "16.  CMS Full GCs before Compact"
    $ECHO "Current Value        : $asadmin_usecmscompact"
    $ECHO "Recommended Value    : -XX:+UseCMSCompactAtFullCollection"
    $ECHO

    asadmin_cmsfullgc=`getASJVMOption '-XX:CMSFullGCsBeforeCompaction' 'flag' ','`

    $ECHO "17.  CMS Full GCs before Compact"
    $ECHO "Current Value        : $asadmin_cmsfullgc"
    $ECHO "Recommended Value    : -XX:CMSFullGCsBeforeCompaction=0"
    $ECHO

    asadmin_softreferencecleanup=`getASJVMOption '-XX:SoftRefLRUPolicyMSPerMB' 'flag' ','`

    $ECHO "18.  Soft Reference Cleanup"
    $ECHO "Current Value        : $asadmin_softreferencecleanup"
    $ECHO "Recommended Value    : -XX:SoftRefLRUPolicyMSPerMB=0"
    $ECHO

    asadmin_printclasshisto=`getASJVMOption '-XX:+PrintClassHistogram' 'flag' ','`

    $ECHO "19.  Print Class Histogram"
    $ECHO "Current Value        : $asadmin_printclasshisto"
    $ECHO "Recommended Value    : -XX:+PrintClassHistogram"
    $ECHO

    asadmin_printGCDetails=`getASJVMOption '-XX:+PrintGCDetails' 'flag' ','`

    $ECHO "20.  Print GC Details"
    $ECHO "Current Value        : $asadmin_printGCDetails"
    $ECHO "Recommended Value    : -XX:+PrintGCDetails"
    $ECHO

    asadmin_printGCTimeStamps=`getASJVMOption '-XX:+PrintGCTimeStamps' 'flag' ','`

    $ECHO "21.  Print GC Time Stamps"
    $ECHO "Current Value        : $asadmin_printGCTimeStamps"
    $ECHO "Recommended Value    : -XX:+PrintGCTimeStamps"
    $ECHO

    asadmin_overrideDefaultLibthread=`getASJVMOption '-XX:+OverrideDefaultLibthread' 'flag' ','`

    $ECHO "22.  OverrideDefaultLibthread (if Solaris 8)"
    $ECHO "Current Value        : $asadmin_overrideDefaultLibthread"
    $ECHO "Recommended Value    : -XX:+OverrideDefaultLibthread"
    $ECHO

    asadmin_useconcmarksweepgc=`getASJVMOption '-XX:+UseConcMarkSweepGC' 'flag' ','`

    $ECHO "23.  Enable Conc Mark Sweep GC"
    $ECHO "Current Value        : $asadmin_useconcmarksweepgc"
    $ECHO "Recommended Value    : -XX:+UseConcMarkSweepGC"
    $ECHO

    if [ "$AMTUNE_WEB_CONTAINER_JAVA_POLICY" = "true" ]; then
        asadmin_serverpolicy=`getASJVMOption '\-Djava.security.policy' 'nvp' ',' '='`

        $ECHO "24.  Disable Server Security Policy Checks"
        $ECHO "Current Value        : -Djava.security.policy=$asadmin_serverpolicy"
        $ECHO 'Recommended Value    : -Djava.security.policy=${com.sun.aas.instanceRoot}/config/server.policy.NOTUSED'
        $ECHO
    fi

    $ECHO
 
    if [ "$AMTUNE_MODE" = "REVIEW" ]; then
        return
    fi

    deleteJVMOptionUsingASAdmin "$asadmin_min_heap" 
    deleteJVMOptionUsingASAdmin "$asadmin_max_heap"
    deleteJVMOptionUsingASAdmin "$asadmin_xrs"
    deleteJVMOptionUsingASAdmin "$asadmin_loggc"
    deleteJVMOptionUsingASAdmin "$asadmin_serveroption"
    deleteJVMOptionUsingASAdmin "$asadmin_stacksize"
    deleteJVMOptionUsingASAdmin "$asadmin_newsize"
    deleteJVMOptionUsingASAdmin "$asadmin_maxnewsize"
    deleteJVMOptionUsingASAdmin "$asadmin_permsize"
    deleteJVMOptionUsingASAdmin "$asadmin_maxpermsize"
    deleteJVMOptionUsingASAdmin "$asadmin_disableExplicitGC"
    deleteJVMOptionUsingASAdmin "$asadmin_parallelGC"
    deleteJVMOptionUsingASAdmin "$asadmin_useconcmarksweepgc"
    deleteJVMOptionUsingASAdmin "$asadmin_cmspermgensweeping"
    deleteJVMOptionUsingASAdmin "$asadmin_cmsclassunloading"
    deleteJVMOptionUsingASAdmin "$asadmin_usecmscompact"
    deleteJVMOptionUsingASAdmin "$asadmin_cmsfullgc"
    deleteJVMOptionUsingASAdmin "$asadmin_softreferencecleanup"
    deleteJVMOptionUsingASAdmin "$asadmin_printclasshisto"
    deleteJVMOptionUsingASAdmin "$asadmin_printGCDetails"
    deleteJVMOptionUsingASAdmin "$asadmin_printGCTimeStamps"
    deleteJVMOptionUsingASAdmin "$asadmin_overrideDefaultLibthread"

    if [ "$AMTUNE_WEB_CONTAINER_JAVA_POLICY" = "true" ]; then
        deleteJVMOptionUsingASAdmin "$asadmin_serverpolicy"
    fi

    insertJVMOptionUsingASAdmin "-Xms${minHeapSize}M"
    insertJVMOptionUsingASAdmin "-Xmx${maxHeapSize}M"
    insertJVMOptionUsingASAdmin "-Xrs"
    insertJVMOptionUsingASAdmin "-Xloggc:$CONTAINER_INSTANCE_DIR/logs/gc.log"
    insertJVMOptionUsingASAdmin "-server"
    insertJVMOptionUsingASAdmin "-Xss${AMTUNE_PER_THREAD_STACK_SIZE_IN_KB}k"
    insertJVMOptionUsingASAdmin "-XX:NewSize=${maxNewSize}M"
    insertJVMOptionUsingASAdmin "-XX:MaxNewSize=${maxNewSize}M"

    if [ $maxPermSize -ge $AMTUNE_MIN_PERM_SIZE_AS8 ]; then
        insertJVMOptionUsingASAdmin "-XX:PermSize=${maxPermSize}M"
        insertJVMOptionUsingASAdmin "-XX:MaxPermSize=${maxPermSize}M"
    fi

    insertJVMOptionUsingASAdmin "-XX:+DisableExplicitGC"
    insertJVMOptionUsingASAdmin "-XX:+UseParNewGC"
    insertJVMOptionUsingASAdmin "-XX:+UseConcMarkSweepGC"
    insertJVMOptionUsingASAdmin "-XX:+CMSPermGenSweepingEnabled"
    insertJVMOptionUsingASAdmin "-XX:+CMSClassUnloadingEnabled"
    insertJVMOptionUsingASAdmin "-XX:+UseCMSCompactAtFullCollection"
    insertJVMOptionUsingASAdmin "-XX:CMSFullGCsBeforeCompaction=0"
    insertJVMOptionUsingASAdmin "-XX:SoftRefLRUPolicyMSPerMB=0"
    insertJVMOptionUsingASAdmin "-XX:+PrintClassHistogram"
    #insertJVMOptionUsingASAdmin "-XX:+PrintGCDetails"
    insertJVMOptionUsingASAdmin "-XX:+PrintGCTimeStamps"

    if [ ! "`/bin/uname -r | grep 8 | wc -m`" -eq "0" ] ; then
        $ECHO  "Solaris 8 specific changes"
        insertJVMOptionUsingASAdmin "-XX:+OverrideDefaultLibthread"
    fi

    if [ "$AMTUNE_WEB_CONTAINER_JAVA_POLICY" = "true" ]; then
        insertJVMOptionUsingASAdmin '-Djava.security.policy=${com.sun.aas.instanceRoot}/config/server.policy.NOTUSED'
    fi

}

tuneDomainXMLOld() {

    substitute_token_in_line $tune_file "acceptor-threads" "acceptor-threads" "$acceptorThreads" 0 ":"

    if [ ! "`/bin/uname -r | grep 8 | wc -m`" -eq "0" ] ; then
        $ECHO  "Solaris 8 specific changes"
        substitute_token_in_line $tune_file "native-library-path-prefix" "native-library-path-prefix" "/usr/lib/lwp" 2 ":"
    fi

}

#############################################################################
# Start of main program
#############################################################################
SCRIPT_LOCATION=`/usr/bin/dirname $0`

# import the environment
if [ -f $SCRIPT_LOCATION/amtune-env ]; then
    if [ ! "$INIT_STATUS" = "INIT_COMPLETE" ]; then
        . $SCRIPT_LOCATION/amtune-env
    fi
fi

$ECHO "Access Manager - Application Server Tuning Script"       1>>$DEBUG_FILE 2>&1

$ECHO "$ASADMIN_PASSWORD_SYNTAX$ASADMIN_PASSWORD" > $ASADMIN_PASSFILE


tuneDomainXML                                                   1>>$DEBUG_FILE 2>&1

$RM $ASADMIN_PASSFILE						1>>$DEBUG_FILE 2>&1

$ECHO $PARA_SEP                                                 1>>$DEBUG_FILE 2>&1
