#!/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.


tune_AMConfig() {

    setAMConfigPropertyFile
    tune_file=$AMCONFIG_PROPERTY_FILE

    $ECHO $LINE_SEP
    $ECHO "Tuning $AMCONFIG_PROPERTY_FILE..."
    $ECHO
    $ECHO "File                 : $tune_file"
    $ECHO "Parameter tuning     :"
    $ECHO
    $ECHO "1.   com.iplanet.am.stats.interval"
    $ECHO "Current Value        : com.iplanet.am.stats.interval=`getConfigEntry 'com.iplanet.am.stats.interval='`"
    $ECHO "Recommended Value    : com.iplanet.am.stats.interval=60"
    $ECHO
    $ECHO "2.   com.iplanet.services.stats.state"
    $ECHO "Current Value        : com.iplanet.services.stats.state=`getConfigEntry 'com.iplanet.services.stats.state='`"
    $ECHO "Recommended Value    : com.iplanet.services.stats.state=file"
    $ECHO
    $ECHO "3.   com.iplanet.services.debug.level"
    $ECHO "Current Value        : com.iplanet.services.debug.level=`getConfigEntry 'com.iplanet.services.debug.level='`"
    $ECHO "Recommended Value    : com.iplanet.services.debug.level=error"
    $ECHO
    $ECHO "4.   com.iplanet.am.sdk.cache.maxSize"
    $ECHO "Current Value        : com.iplanet.am.sdk.cache.maxSize=`getConfigEntry 'com.iplanet.am.sdk.cache.maxSize='`"
    $ECHO "Recommended Value    : com.iplanet.am.sdk.cache.maxSize=$numSDKCacheEntries"
    $ECHO
    $ECHO "5.   com.iplanet.am.notification.threadpool.size"
    $ECHO "Current Value        : com.iplanet.am.notification.threadpool.size=`getConfigEntry 'com.iplanet.am.notification.threadpool.size='`"
    $ECHO "Recommended Value    : com.iplanet.am.notification.threadpool.size=$numNotificationThreads"
    $ECHO
    $ECHO "6.   com.iplanet.am.notification.threadpool.threshold"
    $ECHO "Current Value        : com.iplanet.am.notification.threadpool.threshold=`getConfigEntry 'com.iplanet.am.notification.threadpool.threshold='`"
    $ECHO "Recommended Value    : com.iplanet.am.notification.threadpool.threshold=$numNotificationQueue"
    $ECHO
    $ECHO "7.   com.iplanet.am.session.maxSessions"
    $ECHO "Current Value        : com.iplanet.am.session.maxSessions=`getConfigEntry 'com.iplanet.am.session.maxSessions='`"
    $ECHO "Recommended Value    : com.iplanet.am.session.maxSessions=$numSessions"
    $ECHO
    $ECHO "8.   com.iplanet.am.session.httpSession.enabled"
    $ECHO "Current Value        : com.iplanet.am.session.httpSession.enabled=`getConfigEntry 'com.iplanet.am.session.httpSession.enabled='`"
    $ECHO "Recommended Value    : com.iplanet.am.session.httpSession.enabled=false"
    $ECHO
    $ECHO "9.   com.iplanet.am.session.purgedelay"
    $ECHO "Current Value        : com.iplanet.am.session.purgedelay=`getConfigEntry 'com.iplanet.am.session.purgedelay='`"
    $ECHO "Recommended Value    : com.iplanet.am.session.purgedelay=1"
    $ECHO
    $ECHO "10.  com.iplanet.am.session.invalidsessionmaxtime"
    $ECHO "Current Value        : com.iplanet.am.session.invalidsessionmaxtime=`getConfigEntry 'com.iplanet.am.session.invalidsessionmaxtime='`"
    $ECHO "Recommended Value    : com.iplanet.am.session.invalidsessionmaxtime=1"
    $ECHO
    $ECHO

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

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

    perf_tune_start_str="#Line modified for Performance Tuning by amtune - `date`"

    delete_line $tune_file "#Line modified for Performance Tuning by amtune"

    insert_line $tune_file "com.iplanet.am.stats.interval=" "$perf_tune_start_str"
    replace_line $tune_file "com.iplanet.am.stats.interval=" "com.iplanet.am.stats.interval=60"

    insert_line $tune_file "com.iplanet.services.stats.state=" "$perf_tune_start_str"
    replace_line $tune_file "com.iplanet.services.stats.state=" "com.iplanet.services.stats.state=file"

    insert_line $tune_file "com.iplanet.services.debug.level=" "$perf_tune_start_str"
    replace_line $tune_file "com.iplanet.services.debug.level=" "com.iplanet.services.debug.level=error"

    insert_line $tune_file "com.iplanet.am.sdk.cache.maxSize=" "$perf_tune_start_str"
    replace_line $tune_file "com.iplanet.am.sdk.cache.maxSize=" "com.iplanet.am.sdk.cache.maxSize=$numSDKCacheEntries"

    insert_line $tune_file "com.iplanet.am.notification.threadpool.size=" "$perf_tune_start_str"
    replace_line $tune_file "com.iplanet.am.notification.threadpool.size=" "com.iplanet.am.notification.threadpool.size=$numNotificationThreads"

    insert_line $tune_file "com.iplanet.am.notification.threadpool.threshold=" "$perf_tune_start_str"
    replace_line $tune_file "com.iplanet.am.notification.threadpool.threshold=" "com.iplanet.am.notification.threadpool.threshold=$numNotificationQueue"

    insert_line $tune_file "com.iplanet.am.session.maxSessions=" "$perf_tune_start_str"
    replace_line $tune_file "com.iplanet.am.session.maxSessions=" "com.iplanet.am.session.maxSessions=$numSessions"

    insert_line $tune_file "com.iplanet.am.session.httpSession.enabled=" "$perf_tune_start_str"
    replace_line $tune_file "com.iplanet.am.session.httpSession.enabled=" "com.iplanet.am.session.httpSession.enabled=false"

    insert_line $tune_file "com.iplanet.am.session.purgedelay=" "$perf_tune_start_str"
    replace_line $tune_file "com.iplanet.am.session.purgedelay=" "com.iplanet.am.session.purgedelay=1"

    insert_line $tune_file "com.iplanet.am.session.invalidsessionmaxtime=" "$perf_tune_start_str"
    replace_line $tune_file "com.iplanet.am.session.invalidsessionmaxtime=" "com.iplanet.am.session.invalidsessionmaxtime=1"

}

tune_ServerConfig() {
    setServerConfigXMLFile
    tune_file=$SERVERCONFIG_XML_FILE

    $ECHO $LINE_SEP
    $ECHO "Tuning $tune_file..."
    $ECHO
    $ECHO "File                 : $tune_file"
    $ECHO "Parameter tuning     :"
    $ECHO
    $ECHO "1.   minConnPool"
    $ECHO "Current Value        : minConnPool=`get_token_in_line $tune_file 'minConnPool' 'minConnPool'`"
    $ECHO "Recommended Value    : minConnPool=1"
    $ECHO
    $ECHO "2.   maxConnPool"
    $ECHO "Current Value        : maxConnPool=`get_token_in_line $tune_file 'maxConnPool' 'maxConnPool'`"
    $ECHO "Recommended Value    : maxConnPool=$numSMLdapThreads"
    $ECHO
    $ECHO

    currMinVal=`get_token_in_line $tune_file 'minConnPool' 'minConnPool'`
    currMaxVal=`get_token_in_line $tune_file 'maxConnPool' 'maxConnPool'`

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

    check_file_for_write $tune_file
    if [ $? = 100 ]; then
        return
    fi
    sed -e "s/minConnPool=\"$currMinVal\"/minConnPool=\"1\"/g" $tune_file > $tune_file-$$
    cat $tune_file-$$ > $tune_file
    rm $tune_file-$$

    sed -e "s/maxConnPool=\"$currMaxVal\"/maxConnPool=\"$numSMLdapThreads\"/g" $tune_file > $tune_file-$$
    cat $tune_file-$$ > $tune_file
    rm $tune_file-$$

}

uploadAmadminData(){
    xml_file=$1
    
    $ECHO 

    adminUser=`getConfigEntry "com.sun.identity.authentication.super.user"`
    #if [ "$FILE_BASED_PASSWD" != "true" ]; then
        $ADMIN_CLIENT --runasdn $adminUser --password "$ADMIN_PASSWORD" --verbose --nolog --data ${xml_file}
    #else
    #    $ADMIN_CLIENT --runasdn $adminUser -f "$FILE_ADMINPASSWD" --verbose --nolog --data ${xml_file}
    #fi

    $ECHO 
}

tune_LDAPConnPool() {
    $ECHO $LINE_SEP
    $ECHO "Tuning LDAP Connection Pool in Global iPlanetAMAuthService..."
    $ECHO
    $ECHO "Service              : iPlanetAMAuthService"
    $ECHO "SchemaType           : global"
    $ECHO "Parameter tuning     :"
    $ECHO
    $ECHO "1.   iplanet-am-auth-ldap-connection-pool-default-size"
#   $ECHO "Current Value        : iplanet-am-auth-ldap-connection-pool-default-size="
    $ECHO "Recommended Value    : iplanet-am-auth-ldap-connection-pool-default-size=$numLdapAuthThreads:$numLdapAuthThreads"
    $ECHO
    $ECHO

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

    FILE="/tmp/dsame-auth-core-tune.xml"
    $ECHO '<?xml version="1.0" encoding="ISO-8859-1"?>' > $FILE
    $ECHO '<!DOCTYPE Requests PUBLIC "-//iPlanet//iDSAME 5.1 Admin CLI DTD//EN" "jar://com/iplanet/am/admin/cli/amAdmin.dtd">' >> $FILE
    $ECHO '<!--  MODIFY REQUESTS -->' >> $FILE
    $ECHO '<Requests>' >> $FILE
    $ECHO '<SchemaRequests serviceName="iPlanetAMAuthService" SchemaType="global">' >> $FILE
    $ECHO '<ModifyDefaultValues>' >> $FILE
    $ECHO '<AttributeValuePair>' >> $FILE
    $ECHO '<Attribute name="iplanet-am-auth-ldap-connection-pool-default-size "/>' >> $FILE
    $ECHO "<Value>$numLdapAuthThreads:$numLdapAuthThreads</Value>" >> $FILE
    $ECHO '</AttributeValuePair>' >> $FILE
    $ECHO '</ModifyDefaultValues>' >> $FILE
    $ECHO '</SchemaRequests>' >> $FILE
    $ECHO '</Requests>' >> $FILE

    uploadAmadminData $FILE
    $RM -f $FILE
}

tune_LDAPSearchCriteriaForDefaultOrg() {
    defaultOrg=`getConfigEntry "com.iplanet.am.defaultOrg"`

    $ECHO $LINE_SEP
    $ECHO "Tuning LDAP Search Criteria in iPlanetAMAuthLDAPService For Default Org: $defaultOrg..."
    $ECHO
    $ECHO "Service              : iPlanetAMAuthLDAPService for Org $defaultOrg"
    $ECHO "SchemaType           : organization"
    $ECHO "Parameter tuning     :"
    $ECHO
    $ECHO "1.   iplanet-am-auth-ldap-base-dn"
#   $ECHO "Current Value        : iplanet-am-auth-ldap-base-dn="
    $ECHO "Recommended Value    : iplanet-am-auth-ldap-base-dn=${DEFAULT_ORG_PEOPLE_CONTAINER},${defaultOrg}"
    $ECHO
    $ECHO "2.   iplanet-am-auth-ldap-search-scope"
#   $ECHO "Current Value        : iplanet-am-auth-ldap-search-scope="
    $ECHO "Recommended Value    : iplanet-am-auth-ldap-search-scope=OBJECT"
    $ECHO
    $ECHO

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

    FILE="/tmp/dsame-auth-ldap-tune.xml"
    $ECHO '<?xml version="1.0" encoding="ISO-8859-1"?>' > $FILE
    $ECHO '<!DOCTYPE Requests PUBLIC "-//iPlanet//iDSAME 5.1 Admin CLI DTD//EN" "jar://com/iplanet/am/admin/cli/amAdmin.dtd">' >> $FILE
    $ECHO '<!--  MODIFY REQUESTS -->' >> $FILE
    $ECHO '<Requests>' >> $FILE
    $ECHO "<OrganizationRequests DN=\"$defaultOrg\">" >> $FILE
    $ECHO '<ModifyServiceTemplate serviceName="iPlanetAMAuthLDAPService" schemaType="organization">' >> $FILE
    $ECHO '<AttributeValuePair>' >> $FILE
    $ECHO '<Attribute name="iplanet-am-auth-ldap-base-dn"/>' >> $FILE
    $ECHO "<Value>${DEFAULT_ORG_PEOPLE_CONTAINER},${defaultOrg}</Value>" >> $FILE
    $ECHO '</AttributeValuePair>' >> $FILE
    $ECHO '<AttributeValuePair>' >> $FILE
    $ECHO '<Attribute name="iplanet-am-auth-ldap-search-scope"/>' >> $FILE
    $ECHO '<Value>OBJECT</Value>' >> $FILE
    $ECHO '</AttributeValuePair>' >> $FILE
    $ECHO '</ModifyServiceTemplate>' >> $FILE
    $ECHO '</OrganizationRequests>' >> $FILE
    $ECHO '</Requests>' >> $FILE

    uploadAmadminData $FILE
    $RM -f $FILE
}

tune_SessionTimeouts() {
    $ECHO $LINE_SEP
    $ECHO "Tuning Session Timeouts in Global iPlanetAMSessionService..."
    $ECHO
    $ECHO "Service              : iPlanetAMSessionService"
    $ECHO "SchemaType           : Dynamic"
    $ECHO "Parameter tuning     :"
    $ECHO
    $ECHO "1.   iplanet-am-session-max-session-time"
#   $ECHO "Current Value        : iplanet-am-session-max-session-time="
    $ECHO "Recommended Value    : iplanet-am-session-max-session-time=$AMTUNE_SESSION_MAX_SESSION_TIME_IN_MTS"
    $ECHO
    $ECHO "2.   iplanet-am-session-max-idle-time"
#   $ECHO "Current Value        : iplanet-am-session-max-idle-time="
    $ECHO "Recommended Value    : iplanet-am-session-max-idle-time=$AMTUNE_SESSION_MAX_IDLE_TIME_IN_MTS"
    $ECHO
    $ECHO "3.   iplanet-am-session-max-caching-time"
#   $ECHO "Current Value        : iplanet-am-session-max-caching-time="
    $ECHO "Recommended Value    : iplanet-am-session-max-caching-time=$AMTUNE_SESSION_MAX_CACHING_TIME_IN_MTS"
    $ECHO
    $ECHO

    if [ "$AMTUNE_MODE" = "REVIEW" ]; then
        return
    fi
    
    FILE="/tmp/dsame-session-timeout-tune.xml"
    $ECHO '<?xml version="1.0" encoding="ISO-8859-1"?>' > $FILE
    $ECHO '<!DOCTYPE Requests PUBLIC "-//iPlanet//iDSAME 5.1 Admin CLI DTD//EN" "jar://com/iplanet/am/admin/cli/amAdmin.dtd">' >> $FILE
    $ECHO '<!--  MODIFY REQUESTS -->' >> $FILE
    $ECHO '<Requests>' >> $FILE
    $ECHO '<SchemaRequests serviceName="iPlanetAMSessionService" SchemaType="Dynamic">' >> $FILE
    $ECHO '<ModifyDefaultValues>' >> $FILE
    $ECHO '<AttributeValuePair>' >> $FILE
    $ECHO '<Attribute name="iplanet-am-session-max-session-time"/>' >> $FILE
    $ECHO "<Value>$AMTUNE_SESSION_MAX_SESSION_TIME_IN_MTS</Value>" >> $FILE
    $ECHO '</AttributeValuePair>' >> $FILE
    $ECHO '<AttributeValuePair>' >> $FILE
    $ECHO '<Attribute name="iplanet-am-session-max-idle-time"/>' >> $FILE
    $ECHO "<Value>$AMTUNE_SESSION_MAX_IDLE_TIME_IN_MTS</Value>" >> $FILE
    $ECHO '</AttributeValuePair>' >> $FILE
    $ECHO '<AttributeValuePair>' >> $FILE
    $ECHO '<Attribute name="iplanet-am-session-max-caching-time"/>' >> $FILE
    $ECHO "<Value>$AMTUNE_SESSION_MAX_CACHING_TIME_IN_MTS</Value>" >> $FILE
    $ECHO '</AttributeValuePair>' >> $FILE
    $ECHO '</ModifyDefaultValues>' >> $FILE
    $ECHO '</SchemaRequests>' >> $FILE
    $ECHO '</Requests>' >> $FILE


    uploadAmadminData $FILE
    $RM -f $FILE
}

#############################################################################
# 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 "IS - Access Manager 2005Q4 Tuning Script"       1>>$DEBUG_FILE 2>&1

tune_AMConfig                                           1>>$DEBUG_FILE 2>&1
tune_ServerConfig                                       1>>$DEBUG_FILE 2>&1
tune_LDAPConnPool                                       1>>$DEBUG_FILE 2>&1

#If default org's people container is specified, then perform this tune
if [ "$DEFAULT_ORG_PEOPLE_CONTAINER" != "" ]; then
    tune_LDAPSearchCriteriaForDefaultOrg                1>>$DEBUG_FILE 2>&1
fi

if [ "$AMTUNE_DONT_TOUCH_SESSION_PARAMETERS" = "false" ]; then
    tune_SessionTimeouts                                1>>$DEBUG_FILE 2>&1
fi

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