#!/bin/ksh

###############################################
# Defines
###############################################

AWK=/usr/bin/awk
CAT=/usr/bin/cat
CHMOD=/usr/bin/chmod
CP=/usr/bin/cp
CUT=/usr/bin/cut
DATE=/usr/bin/date
DOMAINNAME=/usr/bin/domainname
DU=/usr/bin/du
ECHO=/usr/bin/echo
GREP=/usr/bin/grep
HOSTNAME=/usr/bin/hostname
ID=/usr/bin/id
LS=/usr/bin/ls
MV=/usr/bin/mv
NAWK=/usr/bin/nawk
PKGINFO=/usr/bin/pkginfo
PRTCONF=/usr/sbin/prtconf
RM=/usr/bin/rm
SED=/usr/bin/sed
STTY=/usr/bin/stty
UNIQ=/usr/bin/uniq
UNAME=/usr/bin/uname
WC=/usr/bin/wc

OMIT_CHAR='\c'
BELL_CHAR='\a'

ORIG_IFS=$IFS


###############################################
# Usage
###############################################
Usage() {
  $ECHO "perftune"
  $ECHO ""
  $ECHO "  Command line options:"
  $ECHO "    silent"
}

###############################################
# Check for ASCII characters
###############################################
CheckChars() {
  local VALID_CHARS=$1
  local STR=$2
  local TEST_RESULT=""

  if [ "$STR" != "" ]; then
    TEST_RESULT=`$ECHO $STR | $GREP "[^$VALID_CHARS]"`
    if [ "$TEST_RESULT" = "" ]; then
      return 0
    else
      return 1
    fi
  else
    return 1
  fi
}

###############################################
# Menu
###############################################
Menu() {
  local PROMPT=$1
  local MENU_ITEMS=$2
  local DEFAULT=""
  local DONE=""
  local ITEM=""
  local ITEMS=""
  local ITEM_COUNT=0
  local MENU_ANSWER=""
  local RETURN=""
  local RETURNS=""

  print "$PROMPT"

  DONE="n"
  while [ "$DONE" = "n" ]; do
    RETURNS=""
    let ITEM_COUNT=0
    ITEMS=$MENU_ITEMS
    while [ "$ITEMS" != "" ]; do
      let ITEM_COUNT+=1

      ITEM=${ITEMS%%;*}
      ITEMS=${ITEMS#*;}

      RETURN="${ITEMS%%;*}"
      ITEMS=${ITEMS#*;}

      print "$ITEM_COUNT) $ITEM"
      DEFAULT=1

      RETURNS="$RETURNS$RETURN;"
    done

    print "Choice? [$DEFAULT] $OMIT_CHAR"
    read MENU_ANSWER

    if [ "$MENU_ANSWER" = "" ]; then
      MENU_ANSWER=$DEFAULT
      DONE="y"
    else
      CheckChars "0-9" $MENU_ANSWER
      if [ $? -eq 0 ]; then
	if [ $MENU_ANSWER -ge 1 ] && [ $MENU_ANSWER -le $ITEM_COUNT ]; then
	  DONE="y"
	else
	  print "Invalid response! $BELL_CHAR"
	fi
      else
	print "Invalid response! $BELL_CHAR"
      fi
    fi
  done
  
  let ITEM_COUNT=0
  while [ "$RETURNS" != "" ]; do
    let ITEM_COUNT+=1
    ANSWER="${RETURNS%%;*};"
    RETURNS=${RETURNS#*;}
    if [ "$ITEM_COUNT" = "$MENU_ANSWER" ]; then
      RETURNS="";
    fi
  done
}

###############################################
# Question
###############################################
Question() {
  local PROMPT=$1
  local DEFAULT=$2

  print "$PROMPT [$DEFAULT] $OMIT_CHAR"
  read ANSWER
  if [ "$ANSWER" = "" ]; then
    ANSWER="$DEFAULT"
  fi
}

###############################################
# Yes or no
###############################################
YesNo() {
  local PROMPT=$1
  local DEFAULT=$2
  local DONE=""
  local FULL_ANSWER=""

  if [ "$SILENT_MODE" = "y" ]; then
    ANSWER=$DEFAULT
  else
    DONE="n"
    while [ "$DONE" = "n" ]; do
      if [ "$DEFAULT" = "y" ]; then
	eval print "$PROMPT [y]/n \$OMIT_CHAR"
	FULL_ANSWER="n"
      elif [ "$DEFAULT" = "n" ]; then
	eval print "$PROMPT y/[n] \$OMIT_CHAR"
	FULL_ANSWER="n"
      elif [ "$DEFAULT" = "yes" ]; then
	eval print "$PROMPT [yes]/no \$OMIT_CHAR"
	FULL_ANSWER="y"
      elif [ "$DEFAULT" = "no" ]; then
	eval print "$PROMPT yes/[no] \$OMIT_CHAR"
	FULL_ANSWER="y"
      else
	eval print "$PROMPT y/n \$OMIT_CHAR"
	FULL_ANSWER="n"
      fi

      read ANSWER

      if [ "$ANSWER" = "" ] && [ "$DEFAULT" != "" ]; then
	ANSWER=$DEFAULT
	DONE="y"
      else
	ANSWER=`$ECHO $ANSWER | $SED -e "y/YESNO/yesno/"`
	if [ "$FULL_ANSWER" = "n" ]; then
	  if [ "$ANSWER" = "yes" ]; then
	    ANSWER="y"
	  elif [ "$ANSWER" = "no" ]; then
	    ANSWER="n"
	  fi
	  if [ "$ANSWER" = "y" ]; then
	    DONE="y"
	  elif [ "$ANSWER" = "n" ]; then
	    DONE="y"
	  else
	    print "Invalid response! y/n only. $BELL_CHAR"
	  fi
	else
	  if [ "$ANSWER" = "yes" ]; then
	    DONE="y"
	  elif [ "$ANSWER" = "no" ]; then
	    DONE="y"
	  else
	    print "Invalid response! yes/no only. $BELL_CHAR"
	  fi
	fi
      fi
    done
  fi
}

###############################################
# Get password
###############################################
GetPassword() {
  local PROMPT=$1
  local ANSWER_REPEAT=""
  local DONE=""

  DONE="n"
  while [ "$DONE" = "n" ]; do
    print "$PROMPT $OMIT_CHAR"
    $STTY -echo
    read ANSWER
    $STTY echo
    if [ "$ANSWER" != "" ]; then
      print "Again? $OMIT_CHAR"
      $STTY -echo
      read ANSWER_REPEAT
      $STTY echo
      print ""
      if [ "$ANSWER" != "$ANSWER_REPEAT" ]; then
	print "Password verification failed! $BELL_CHAR"
      else
	DONE="y"
      fi
    else
      print ""
    fi
  done
}

###############################################
# Get configuration from file
###############################################
GrabConfig() {
  local FILE=$1
  local KEY=$2
  local SEPARATOR=$3

  ANSWER=`$GREP "^$KEY$SEPARATOR" $FILE | $UNIQ | $SED -e "s/$KEY$SEPARATOR//"`
}

###############################################
# Replace line in file
###############################################
ReplaceLine() {
  local FILE=$1
  local MATCH=$2
  local TEXT=$3

  $CP $FILE $FILE-tmp
  $SED -e "/$MATCH/ {
c\\
$TEXT
}" $FILE-tmp > $FILE
  $RM $FILE-tmp
}

###############################################
# Insert line in file
###############################################
InsertLine() {
  local FILE=$1
  local MATCH=$2
  local TEXT=$3

  $CP $FILE $FILE-tmp
  $SED -e "/$MATCH/ {
i\\
$TEXT
}" $FILE-tmp > $FILE
  $RM $FILE-tmp
}

###############################################
# Append line in file
###############################################
AppendLine() {
  local FILE=$1
  local MATCH=$2
  local TEXT=$3

  $CP $FILE $FILE-tmp
  $SED -e "/$MATCH/ {
a\\
$TEXT
}" $FILE-tmp > $FILE
  $RM $FILE-tmp
}

###############################################
# Delete block until blank line
###############################################
DeleteUntilBlankLine() {
  local FILE=$1
  local START_LINE=$2

  $CP $FILE $FILE-tmp
  $NAWK 'BEGIN {
           IN_REPLACE = 0;
         };
         {
           if (index($0, START_LINE) > 0) {
             IN_REPLACE = 1;
           } else if (length($0) == 0) {
             IN_REPLACE = 0;
           }
	   if (IN_REPLACE == 0) {
	     printf("%s\n", $0);
	   } else {
	     printf("# %s\n", $0);
	   }
         };
         END {};' START_LINE="$START_LINE" $FILE-tmp > $FILE
}

###############################################
# Replace xml block
###############################################
ReplaceXML() {
  local FILE=$1
  local START_TAG=$2
  local END_TAG=$3
  local NEW_TEXT=$4

  $CP $FILE $FILE-tmp
  $NAWK 'BEGIN {
           IN_REPLACE = 0;
         };
         {
           if (index($0, START_TAG) > 0) {
             printf("%s\n", $0);
             printf("%s", NEW_TEXT);
             IN_REPLACE = 1;
           } else if (index($0, END_TAG) > 0) {
             printf("%s\n", $0);
             IN_REPLACE = 0;
           } else {
             if (IN_REPLACE == 0) {
               printf("%s\n", $0);
             }
           }
         };
         END {};' START_TAG="$START_TAG" END_TAG="$END_TAG" NEW_TEXT="$NEW_TEXT" $FILE-tmp > $FILE
}

###############################################
# Replace after first marker
###############################################
ReplaceByMarker() {
  local FILE=$1
  local MARKER_TAG=$2
  local REPLACE_TAG=$3
  local NEW_TEXT=$4

  $CP $FILE $FILE-tmp
  $NAWK 'BEGIN {
           IN_REPLACE = 0;
         };
         {
           if (index($0, MARKER_TAG) > 0) {
             printf("%s\n", $0);
             if (IN_REPLACE == 0) {
               IN_REPLACE = 1;
             }
           } else {
             if (index($0, REPLACE_TAG) > 0) {
               if (IN_REPLACE == 1) {
                 printf("%s\n", NEW_TEXT);
                 IN_REPLACE = 2;
               } else {
                 printf("%s\n", $0);
               }
             } else {
               printf("%s\n", $0);
             }
           }
         };
         END {};' MARKER_TAG="$MARKER_TAG" REPLACE_TAG="$REPLACE_TAG" NEW_TEXT="$NEW_TEXT" $FILE-tmp > $FILE
  $RM -f $FILE-tmp
}

##############################################
# Set DN
###############################################
SetupDN() {
  local FILE=""

  FILE="/etc/opt/SUNWam/config/AMConfig.properties"
  if [ ! -f $FILE ]; then
     $ECHO "Error: Cannot find $FILE. $BELL_CHAR"
     exit 1
  fi
  ADMIN_DN=`$GREP "^com.sun.identity.authentication.super.user=" $FILE | $SED -e "s/com.sun.identity.authentication.super.user=//"`
  ROOT_DN=`$GREP "^com.iplanet.am.rootsuffix=" $FILE | $SED -e "s/com.iplanet.am.rootsuffix=//"`
  ORG_DN=`$GREP "^com.iplanet.am.defaultOrg=" $FILE | $SED -e "s/com.iplanet.am.defaultOrg=//"`
  if [ "$ORG_DN" != "$ROOT_DN" ]; then
    ORG_DN="$ORG_DN,$ROOT_DN"
  fi
}

##############################################
# Check if Memory required is available
###############################################
CheckMemory(){
  if [ $MEM_AVAILABLE -gt  $MEM_REQUIRED ]; then
    ENOUGH_MEM="y"
  else
    ENOUGH_MEM="n"
  fi
}


###############################################
# Stop DS
###############################################
StopDS() {
	local STOP_SLAPD=""

  	STOP_SLAPD="$DS_DIR/slapd-$DS_HOSTNAME/stop-slapd"
  	if [ -x $STOP_SLAPD ]; then
    	  $STOP_SLAPD > /dev/null 2>&1
  	else
    	  $ECHO "Error: Could not stop the Directory Server. $BELL_CHAR"
    	  exit 1
  	fi
}

###############################################
# Start DS
###############################################
StartDS() {
	local START_SLAPD=""

  	START_SLAPD="$DS_DIR/slapd-$DS_HOSTNAME/start-slapd"
  	if [ -x $START_SLAPD ]; then
    	  $START_SLAPD > /dev/null 2>&1
  	else
    	  $ECHO "Error: Could not stop the Directory Server. $BELL_CHAR"
    	  exit 1
  	fi
}
#TBD functions to start & Stop PS,IS & SRA


###############################################
# TCP/IP Tuning
###############################################
TuneTCPIP() {
YesNo "Tune TCP Parameters?" "y"
if [ "$ANSWER" = "y" ]; then
  FILE="/etc/rc2.d/S99ndd_tcp"
  $ECHO "#Webload performance settings " > $FILE
  $ECHO "ndd -set /dev/tcp tcp_time_wait_interval 60000" >> $FILE
  $ECHO "ndd -set /dev/tcp tcp_fin_wait_2_flush_interval 67500" >> $FILE
  $ECHO "ndd -set /dev/tcp tcp_conn_req_max_q 8192" >> $FILE
  $ECHO "ndd -set /dev/tcp tcp_conn_req_max_q0 8192" >> $FILE
  $ECHO "ndd -set /dev/tcp tcp_ip_abort_interval 60000" >> $FILE
  $ECHO "ndd -set /dev/tcp tcp_keepalive_interval 90000" >> $FILE
  $ECHO "ndd -set /dev/tcp tcp_rexmit_interval_max 6000" >> $FILE
  $ECHO "ndd -set /dev/tcp tcp_rexmit_interval_min 3000" >> $FILE
  $ECHO "ndd -set /dev/tcp tcp_rexmit_interval_initial 500" >> $FILE
  $ECHO "ndd -set /dev/tcp tcp_smallest_anon_port 1024" >> $FILE
  $ECHO "ndd -set /dev/tcp tcp_slow_start_initial 2" >> $FILE
  $ECHO "ndd -set /dev/tcp tcp_xmit_hiwat 32768" >> $FILE
  $ECHO "ndd -set /dev/tcp tcp_recv_hiwat 32768" >> $FILE
  $CHMOD +x $FILE
  $FILE
  $ECHO "TCP/IP Tuning complete."
  fi
}

###############################################
# Kernel Tuning
###############################################
TuneKernel() {
YesNo "Tune Kernel?" "y"
if [ "$ANSWER" = "y" ]; then

  NEED_REBOOT="y"
  FILE=/etc/system

  $CP /etc/system /etc/system-orig-`$DATE +%y%m%d`-$$

  FDMAX=`$GREP "rlim_fd_max" $FILE`
  if [ "$FDMAX" != "" ]; then
    ReplaceLine $FILE "rlim_fd_max" "set rlim_fd_max=16384"
  else
    $ECHO "set rlim_fd_max=16384" >> /etc/system
  fi

  FDCUR=`$GREP "rlim_fd_cur" $FILE`
  if [ "$FDCUR" != "" ]; then
    ReplaceLine $FILE "rlim_fd_cur" "set rlim_fd_cur=16384"
  else
    $ECHO "set rlim_fd_cur=16384" >> /etc/system
  fi

  SQMAX=`$GREP "sq_max_size" $FILE`
  if [ "$SQMAX" != "" ]; then
    ReplaceLine $FILE "sq_max_size" "set sq_max_size=0"
  else
    $ECHO "set sq_max_size=0" >> /etc/system
  fi

  TCPSIZE=`$GREP "tcp:tcp_conn_hash_size" $FILE`
  if [ "$TCPSIZE" != "" ]; then
    ReplaceLine $FILE "tcp:tcp_conn_hash_size" "set tcp:tcp_conn_hash_size=8192"
  else
    $ECHO "set tcp:tcp_conn_hash_size=8192" >> /etc/system
  fi
  $ECHO "Kernel Tuning complete."
fi
}

###############################################
# Directory Server Tuning
###############################################
TuneDS(){
$PKGINFO -q SUNWdsvr
if [ $? -eq 0 ]; then
  YesNo "Tune Directory Server?" "y"
  if [ "$ANSWER" = "y" ]; then
  
    Question "What is the Directory Server host?" "$HOST"
    DS_HOST=$ANSWER
    DS_HOSTNAME=${DS_HOST%%.*}

    Question "What is the Directory Server port?" "389"
    DS_PORT=$ANSWER

    Question "What is the Directory Server directory?" "/var/opt/mps/serverroot"
    DS_DIR=$ANSWER  

    DBCACHESIZE=`$DU -sk $DS_DIR/slapd-$DS_HOSTNAME/db/userRoot | $AWK '{print int($1*1024*1.2)}`
    CACHEMEMSIZE=`$DU -sk $DS_DIR/slapd-$DS_HOSTNAME/db/userRoot/userRoot_id2entry.db3 | $AWK '{print int($1*1024*3)}`
    MEM_REQUIRED=$DBCACHESIZE/1024+$CACHEMEMSIZE/1024
    CheckMemory
    
    NTHREADS=`$UNAME "-X" | $GREP NumCPU | $AWK '{print int($3*15+15)}'`

    StopDS
    
    FILE="$DS_DIR/slapd-$DS_HOSTNAME/config/dse.ldif"
    if [ -f $FILE ]; then
      $CP $FILE $FILE-orig-`$DATE +%y%m%d`-$$
      ReplaceLine $FILE "nsslapd-accesslog-logging-enabled:" "nsslapd-accesslog-logging-enabled: off"
      
      if [ "$NEED_REBOOT" = "y" ]; then 
        ReplaceLine $FILE "nsslapd-maxdescriptors:" "nsslapd-maxdescriptors: 16384"
      fi

      THREADNUM=`$GREP "nsslapd-threadnumber:" $FILE`
      if [ "$THREADNUM" != "" ]; then
	ReplaceLine $FILE "nsslapd-threadnumber:" "nsslapd-threadnumber: $NTHREADS"
      else
	AppendLine $FILE "nsslapd-accesslog-logging-enabled:" "nsslapd-threadnumber: $NTHREADS"
      fi

      DBHOME=`$GREP "nsslapd-db-home-directory:" $FILE`
      if [ "$DBHOME" != "" ]; then
	ReplaceLine $FILE "nsslapd-db-home-directory:" "nsslapd-db-home-directory: /tmp/slapd-dsame1"
      else
	AppendLine $FILE "nsslapd-dbcachesize:" "nsslapd-db-home-directory: /tmp/slapd-dsame1"
      fi

      MAXTHREADS=`$GREP "nsslapd-maxthreadsperconn:" $FILE`
      if [ "$MAXTHREADS" != "" ]; then
	ReplaceLine $FILE "nsslapd-maxthreadsperconn:" "nsslapd-maxthreadsperconn: 20"
      else
	AppendLine $FILE "nsslapd-dbcachesize:" "nsslapd-maxthreadsperconn: 20"
      fi
      
      if [ "$ENOUGH_MEM" = "y" ]; then 
        ReplaceLine $FILE "nsslapd-dbcachesize:" "nsslapd-dbcachesize: $DBCACHESIZE"
        ReplaceByMarker $FILE "dn: cn=userRoot,cn=ldbm database,cn=plugins,cn=config" "nsslapd-cachememsize:" "nsslapd-cachememsize: $CACHEMEMSIZE"
      else
        $ECHO "warning: Insufficient memory, skipping Directory server memory tuning"
        $ECHO $FILE
        $ECHO "unchanged nssldap-dbcachesize and nsslapd-cachememsize" 
      fi
    else
      $ECHO "warning: Directory server is not installed on this machine, skipping Directory server tuning" 
    fi
    StartDS
    $ECHO "Directory Server Tuning complete."
    
  fi
fi  
}

###############################################
# Identity Server Tuning
###############################################
TuneIdentityServer(){
$PKGINFO -q SUNWamsvc
if [ $? -eq 0 ]; then
  YesNo "Tune Identity Server?" "y"
  
  if [ "$ANSWER" = "y" ]; then
  
  Question "What is the Identity Server base directory?" "/opt"
  IDSAME_BASEDIR=$ANSWER

  GetPassword "What is the Identity Server administrator password?"
  IDSAME_ADMIN_PASSWORD=$ANSWER

  SetupDN

  AMADMIN="$IDSAME_BASEDIR/SUNWam/bin/amadmin"
  if [ ! -x $AMADMIN ]; then
    $ECHO "Error: Cannot find $AMADMIN. $BELL_CHAR"
    exit 1
  fi  

  INSTANCES_DSAME=`$LS -d /etc/opt/SUNWam/config/AMConfig*properties 2>&1`
  INSTANCES_COUNT=`$LS -d /etc/opt/SUNWam/config/AMConfig*properties | $WC -l`
  MEM_REQUIRED=MEM_REQUIRED*INSTANCES_COUNT

   # Max concurrent sessions for DSAME SDK cache size tuning
   # (calculation based on 300 KB mem footrint / portal session in average).
   # That is 3500 for optimum and 7000 on for large.
   MAX_CONCURRENT_SESSIONS=7000

    
    # DSAME_MAX_CACHE_SIZE based on DSAME & S1PS tuning guide recommendations
    # maxSize = (max number of concurrent sessions) * (2 + services registered)
    # See Tuning Guide for definition of max concurrent sessions
    # Where:
    #    - services registered = 3 (out of the box default).
    DSAME_MAX_CACHE_SIZE=`expr $MAX_CONCURRENT_SESSIONS \* 5`

    FILE="/etc/opt/SUNWam/config/serverconfig.xml"
    if [ -f $FILE ]; then
      $CP $FILE $FILE-orig-`$DATE +%y%m%d`-$$
      POOLSIZE=`$GREP "ConnPool" $FILE`
      POOLSIZE=`$ECHO $POOLSIZE | $SED -e 's#minConnPool="1"#minConnPool="10"#'`
      POOLSIZE=`$ECHO $POOLSIZE | $SED -e 's#maxConnPool="10"#maxConnPool="90"#'`
      ReplaceLine $FILE "ConnPool" "$POOLSIZE"
    fi

    for INSTANCE_DSAME in $INSTANCES_DSAME; do
      FILE="$INSTANCE_DSAME"
      if [ -f $FILE ]; then
        $CP $FILE $FILE-orig-`$DATE +%y%m%d`-$$
        ReplaceLine $FILE "com.iplanet.am.logstatus" "com.iplanet.am.logstatus=INACTIVE"
        ReplaceLine $FILE "com.iplanet.am.session.maxSessions" "com.iplanet.am.session.maxSessions=50000"
        ReplaceLine $FILE "com.iplanet.am.sdk.cache.maxSize" "com.iplanet.am.sdk.cache.maxSize=${DSAME_MAX_CACHE_SIZE}"
	ReplaceLine $FILE "com.iplanet.am.stats.interval" "com.iplanet.am.stats.interval=60"
	ReplaceLine $FILE "com.iplanet.services.stats.state" "com.iplanet.services.stats.state=file"
	ReplaceLine $FILE "com.iplanet.services.stats.directory" "com.iplanet.services.stats.directory=/var/opt/SUNWam/debug"
	ReplaceLine $FILE "com.iplanet.am.notification.threadpool.size=" "com.iplanet.am.notification.threadpool.size=50"
	ReplaceLine $FILE "com.iplanet.am.notification.threadpool.threshold=" "com.iplanet.am.notification.threadpool.threshold=200"
        ReplaceLine $FILE "com.iplanet.am.session.purgedelay" "com.iplanet.am.session.purgedelay=5"
	
	#
	# XXX - This causes problems with BEA Weblogic clustering.
	#
        ReplaceLine $FILE "com.iplanet.am.session.httpSession.enabled" "com.iplanet.am.session.httpSession.enabled=false"
      fi
    done

    FILE="/tmp/dsame-auth-core-tune.xml"
    $ECHO '<?xml version="1.0" encoding="ISO-8859-1"?>' > $FILE
    $ECHO '<!DOCTYPE Requests PUBLIC "-//iPlanet//Sun ONE Identity Server 6.0 Admin CLI DTD//EN" "file://'$IDSAME_BASEDIR'/SUNWam/dtd/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>10:90</Value>" >> $FILE
    $ECHO '</AttributeValuePair>' >> $FILE
    $ECHO '</ModifyDefaultValues>' >> $FILE
    $ECHO '</SchemaRequests>' >> $FILE
    $ECHO '</Requests>' >> $FILE
    $AMADMIN -u "$ADMIN_DN" --password "$IDSAME_ADMIN_PASSWORD" -t $FILE > /dev/null 2>&1
    $RM -f $FILE
    NEED_RESTART="y"
    IS_IDENTITY_SERVER_TUNED="y"
    $ECHO "Identity Server Tuning complete." 
  fi
fi
}

###############################################
# Webcontainer Tuning
###############################################
TuneAppContainer(){
Menu "What is the deployment type:" "Sun ONE Application Server;SUNONE;BEA WebLogic;WEBLOGIC;IBM WebSphere;WEBSPHERE;Sun ONE Web Server;IWS;"
DEPLOY_TYPE=`$ECHO $ANSWER | $SED -e "s/;//"`
CheckMemory
Question "What is the JDK directory?" "/usr/jdk/entsys-j2se"
JAVA_HOME=$ANSWER

if [ "$DEPLOY_TYPE" = "WEBLOGIC" ]; then
  
    Question "What is the Application Server directory?" "/opt/bea/wlserver6.1"
    DEPLOY_DIR=$ANSWER

    Question "What is the Application Server domain?" "mydomain"
    DEPLOY_DOMAIN=$ANSWER

    Question "What is the Application Server instance?" "myserver"
    DEPLOY_INSTANCE=$ANSWER

    Question "What is the Application Server administration protocol?" "http"
    DEPLOY_ADMIN_PROTOCOL=$ANSWER

    Question "What is the Application Server administration host?" "$HOST"
    DEPLOY_ADMIN_HOST=$ANSWER
    DEPLOY_ADMIN_HOSTNAME=${DEPLOY_ADMIN_HOST%%.*}

    Question "What is the Application Server administration port?" "7001"
    DEPLOY_ADMIN_PORT=$ANSWER

    GetPassword "What is the Application Server administrator password?"
    DEPLOY_ADMIN_PASSWORD=$ANSWER
  
    $JAVA_HOME/bin/java -classpath $DEPLOY_DIR/lib/weblogic.jar weblogic.Admin -url $DEPLOY_ADMIN_PROTOCOL://$DEPLOY_ADMIN_HOST:$DEPLOY_ADMIN_PORT -username system -password $DEPLOY_ADMIN_PASSWORD SET -mbean $DEPLOY_DOMAIN:Name=$DEPLOY_INSTANCE,Type=Server -property "AcceptBacklog" "8192" -property "LoginTimeout" "600000" > /dev/null

    NUMCPU=`$UNAME "-X" | $GREP NumCPU | $AWK '{print $3}'`
    if [ "$NUMCPU" -gt 3 ]; then
       let "THREADCOUNT = $NUMCPU + 4" 
       $JAVA_HOME/bin/java -classpath $DEPLOY_DIR/lib/weblogic.jar weblogic.Admin -url $DEPLOY_ADMIN_PROTOCOL://$DEPLOY_ADMIN_HOST:$DEPLOY_ADMIN_PORT -username system -password $DEPLOY_ADMIN_PASSWORD SET -mbean $DEPLOY_DOMAIN:Name=default,Server=$DEPLOY_INSTANCE,Type=ExecuteQueue -property "ThreadCount" "$THREADCOUNT" > /dev/null
    fi

    if [ "$DEPLOY_ADMIN_PORT" != "$SERVER_PORT" ]; then
	if [ "$SERVER_PROTOCOL" != "https" ]; then
           $JAVA_HOME/bin/java -classpath $DEPLOY_DIR/lib/weblogic.jar weblogic.Admin -url t3://$SERVER_HOST:$SERVER_PORT -username system -password $DEPLOY_ADMIN_PASSWORD SHUTDOWN 0 > /dev/null
        else
           $JAVA_HOME/bin/java -classpath $DEPLOY_DIR/lib/weblogic.jar weblogic.Admin -url t3s://$SERVER_HOST:$SERVER_PORT -username system -password $DEPLOY_ADMIN_PASSWORD SHUTDOWN 0 > /dev/null
        fi
    fi

    if [ "$DEPLOY_ADMIN_PROTOCOL" != "https" ]; then
       $JAVA_HOME/bin/java -classpath $DEPLOY_DIR/lib/weblogic.jar weblogic.Admin -url t3://$DEPLOY_ADMIN_HOST:$DEPLOY_ADMIN_PORT -username system -password $DEPLOY_ADMIN_PASSWORD SHUTDOWN 0 > /dev/null
    else
       $JAVA_HOME/bin/java -classpath $DEPLOY_DIR/lib/weblogic.jar weblogic.Admin -url t3s://$DEPLOY_ADMIN_HOST:$DEPLOY_ADMIN_PORT -username system -password $DEPLOY_ADMIN_PASSWORD SHUTDOWN 0 > /dev/null
    fi

    FILES="$DEPLOY_DIR/config/$DEPLOY_DOMAIN/startWebLogic.sh $DEPLOY_DIR/config/$DEPLOY_DOMAIN/startManagedWebLogic.sh"
    for FILE in $FILES; do
      $CP $FILE $FILE-orig-`$DATE +%y%m%d`-$$

      DeleteUntilBlankLine $FILE "Grab some file descriptors"

      if [ "$ENOUGH_MEM" = "y" ]; then 
	  MIN_HEAP_SIZE="3221225472"
	  MAX_HEAP_SIZE="3221225472"

 	  $CP $FILE $FILE-tmp
	  $NAWK 'BEGIN {
		 javaOptions = 0;
	       };
	       {
		 str = $0;
		 found = 0;
		 if (index(str, "JAVA_OPTIONS=") == 1) {
		   if (javaOptions == 0) {
		     printf("#%s\n", str);
		     printf("JAVA_OPTIONS=\"-ms%d -mx%d -XX:MaxPermSize=64M -XX:PermSize=64M -XX:+OverrideDefaultLibthread -XX:MaxNewSize=384M -XX:NewSize=384M\"\n", minHeapSize, maxHeapSize);
		     javaOptions = 1;
		     found = 1;
		   }
		 }
		 if (found == 0) {
		   printf("%s\n", str);
		 }
	       };
	       END {};' minHeapSize=$MIN_HEAP_SIZE maxHeapSize=$MAX_HEAP_SIZE $FILE-tmp > $FILE
      fi
	$RM $FILE-tmp
    done
elif [ "$DEPLOY_TYPE" = "SUNONE" ]; then

    Question "What is the Application Server directory?" "/opt/SUNWappserver7"
    DEPLOY_DIR=$ANSWER

    Question "What is the Application Server domain directory?" "/var/opt/SUNWappserver7/domains"
    DEPLOY_DOMAIN_DIR=$ANSWER

    Question "What is the Application Server domain?" "domain1"
    DEPLOY_DOMAIN="$DEPLOY_DOMAIN_DIR/$ANSWER"

    Question "What is the Application Server instance?" "server1"
    DEPLOY_INSTANCE=$ANSWER

    FILE="$DEPLOY_DOMAIN/$DEPLOY_INSTANCE/config/init.conf"
    $CP $FILE $FILE-orig-TEST-`$DATE +%y%m%d`-$$
    echo "Modifying file: $FILE"

    RQTHROTTLE=`$GREP "RqThrottle " $FILE`
    if [ "$RQTHROTTLE" != "" ]; then
	ReplaceLine $FILE "RqThrottle " "RqThrottle 256"
    else
	AppendLine $FILE "Security" "RqThrottle 256"
    fi

    RQTHROTTLEMIN=`$GREP "RqThrottleMin" $FILE`
    if [ "$RQTHROTTLEMIN" != "" ]; then
        ReplaceLine $FILE "RqThrottleMin" "RqThrottleMin 128"
    else
        AppendLine $FILE "Security" "RqThrottleMin 128"
    fi

    STACKSIZE=`$GREP "StackSize" $FILE`
    if [ "$STACKSIZE" != "" ]; then
        ReplaceLine $FILE "StackSize" "StackSize 393216"
    else
        AppendLine $FILE "Security" "StackSize 393216"
    fi

    THREADINC=`$GREP "ThreadIncrement" $FILE`
    if [ "$THREADINC" != "" ]; then
        ReplaceLine $FILE "ThreadIncrement" "ThreadIncrement 20"
    else
        AppendLine $FILE "Security" "ThreadIncrement 20"
    fi

    CONNQSIZE=`$GREP "ConnQueueSize" $FILE`
    if [ "$CONNQSIZE" != "" ]; then
        ReplaceLine $FILE "ConnQueueSize" "ConnQueueSize 4096"
    else
        AppendLine $FILE "Security" "ConnQueueSize 4096"
    fi

    LISTENQ=`$GREP "ListenQ" $FILE`
    if [ "$LISTENQ" != "" ]; then
        ReplaceLine $FILE "ListenQ" "ListenQ 4096"
    else
        AppendLine $FILE "Security" "ListenQ 4096"
    fi

    FILE="$DEPLOY_DOMAIN/$DEPLOY_INSTANCE/config/server.xml"
    $CP $FILE $FILE-orig-TEST-`$DATE +%y%m%d`-$$
    echo "Modifying JVM options in file: $FILE"

    if [ -f $FILE ]; then

    NUMCPU=`$UNAME "-X" | $GREP NumCPU | $AWK '{print $3}'`
    ACCEPTOR_THREADS=`$GREP "acceptor-threads" $FILE`
    ACCEPTOR_THREADS=`$ECHO $ACCEPTOR_THREADS | $SED -e 's#acceptor-threads="1"#acceptor-threads="'$NUMCPU'"#'`
    ReplaceLine $FILE "acceptor-threads" "$ACCEPTOR_THREADS"

      MIN_HEAP_SIZE="128M"
      MAX_HEAP_SIZE="128M"
      if [ "$ENOUGH_MEM" = "y" ]; then
          MIN_HEAP_SIZE="3G"
          MAX_HEAP_SIZE="3G"
      fi 
     ReplaceLine $FILE "<jvm-options> -Xms" "  <jvm-options>-Xms$MIN_HEAP_SIZE -Xmx$MAX_HEAP_SIZE</jvm-options>"
     
      $GREP "XX:+UseParNewGC" $FILE
      if [ $? -ne 0 ]; then
	InsertLine $FILE "java-config>" "    <jvm-options>-XX:+UseParNewGC</jvm-options>"
      fi

      $GREP "XX:+UseConcMarkSweepGC" $FILE
      if [ $? -ne 0 ]; then
	InsertLine $FILE "java-config>" "    <jvm-options>-XX:+UseConcMarkSweepGC</jvm-options>"
      fi

      $GREP "Xss" $FILE
      if [ $? -ne 0 ]; then
	InsertLine $FILE "java-config>" "    <jvm-options>-Xss128K</jvm-options>"
      fi

      $GREP "XX:MaxTenuringThreshold" $FILE
      if [ $? -ne 0 ]; then
	InsertLine $FILE "java-config>" "    <jvm-options>-XX:MaxTenuringThreshold=1</jvm-options>"
      fi

      $GREP "XX:SoftRefLRUPolicyMSPerMB" $FILE
      if [ $? -ne 0 ]; then
	InsertLine $FILE "java-config>" "    <jvm-options>-XX:SoftRefLRUPolicyMSPerMB=1</jvm-options>"
      fi

      $GREP "XX:+CMSClassUnloadingEnabled" $FILE
      if [ $? -ne 0 ]; then
	InsertLine $FILE "java-config>" "    <jvm-options>-XX:+CMSClassUnloadingEnabled</jvm-options>"
      fi

      $GREP "XX:+CMSPermGenSweepingEnabled" $FILE
      if [ $? -ne 0 ]; then
	InsertLine $FILE "java-config>" "    <jvm-options>-XX:+CMSPermGenSweepingEnabled</jvm-options>"
      fi

      $GREP "XX:+PrintGCTimeStamps" $FILE
      if [ $? -ne 0 ]; then
	InsertLine $FILE "java-config>" "    <jvm-options>-XX:+PrintGCTimeStamps</jvm-options>"
      fi

      $GREP "XX:+ShowMessageBoxOnError" $FILE
      if [ $? -ne 0 ]; then
	InsertLine $FILE "java-config>" "    <jvm-options>-XX:+ShowMessageBoxOnError</jvm-options>"
      fi
      
     $GREP "XX:MaxPermSize=" $FILE
      if [ $? -ne 0 ]; then
	InsertLine $FILE "java-config>" "    <jvm-options>-XX:MaxPermSize=64M</jvm-options>"
      fi

      $GREP "XX:PermSize=" $FILE
      if [ $? -ne 0 ]; then
	InsertLine $FILE "java-config>" "    <jvm-options>-XX:PermSize=64M</jvm-options>"
      fi

      $GREP "XX:+OverrideDefaultLibthread" $FILE
      if [ $? -ne 0 ]; then
        InsertLine $FILE "java-config>" "    <jvm-options>-XX:+OverrideDefaultLibthread</jvm-options>"
      fi
	$GREP "XX:+DisableExplicitGC" $FILE
	if [ $? -ne 0 ]; then
	InsertLine $FILE "java-config>" "    <jvm-options>-XX:+DisableExplicitGC</jvm-options>"
	fi

	$GREP "XX:+PrintGCDetails" $FILE
	if [ $? -ne 0 ]; then
	InsertLine $FILE "java-config>" "    <jvm-options>-XX:+PrintGCDetails</jvm-options>"
	fi

        $GREP "XX:+PrintClassHistogram" $FILE
        if [ $? -ne 0 ]; then
        InsertLine $FILE "java-config>" "    <jvm-options>-XX:+PrintClassHistogram</jvm-options>"
        fi

        $GREP "Xloggc:/var/opt/SUNWappserver7/domains/domain1/server1/logs/gclog" $FILE
        if [ $? -ne 0 ]; then
        InsertLine $FILE "java-config>" "    <jvm-options>-Xloggc:$DEPLOY_DOMAIN/$DEPLOY_INSTANCE/logs/gclog</jvm-options>"
        fi

      $GREP "XX:MaxNewSize=" $FILE
      if [ $? -ne 0 ]; then
        InsertLine $FILE "java-config>" "    <jvm-options>-XX:MaxNewSize=384M</jvm-options>"
      fi

      $GREP "XX:NewSize=" $FILE
      if [ $? -ne 0 ]; then
	InsertLine $FILE "java-config>" "    <jvm-options>-XX:NewSize=384M</jvm-options>"
      fi

        $GREP "Djava.security.policy=$DOMAIN_NAME/$DOMAIN_INSTANCE/config/server.policy" $FILE
	if [ $? -ne 0 ]; then
      	ReplaceLine $FILE "<jvm-options>-Djava.security.policy" "    <jvm-options>-Djava.security.policy=$DEPLOY_DOMAIN/$DEPLOY_INSTANCE/config/server.policy.NEVERUSED</jvm-options>"
        fi
  fi
elif [ "$DEPLOY_TYPE" = "IWS" ]; then
  YesNo "Tune Web Server?" "y"
    Question "What is the Web Server directory?" "/opt/SUNWwbsvr"
    DEPLOY_DIR=$ANSWER
    INSTANCES_WEB=`$LS -d $DEPLOY_DIR/https-* 2>&1`    
    for INSTANCE_WEB in $INSTANCES_WEB; do
      if [ "$INSTANCE_WEB" != "$DEPLOY_DIR/https-admserv" ]; then

	FILE="$INSTANCE_WEB/config/magnus.conf"
	if [ -f $FILE ]; then
	  $CP $FILE $FILE-orig-`$DATE +%y%m%d`-$$
          echo "Modifying file: $FILE"
            RQTHROTTLE=`$GREP "RqThrottle " $FILE`
            if [ "$RQTHROTTLE" != "" ]; then
	      ReplaceLine $FILE "RqThrottle " "RqThrottle 256"
	    else  
              AppendLine $FILE "StackSize" "RqThrottle 256"
            fi

            STACKSIZE=`$GREP "StackSize" $FILE`
            if [ "$STACKSIZE" != "" ]; then
	      ReplaceLine $FILE "StackSize" "StackSize 393216" 
            fi 
            
            THREADINC=`$GREP "ThreadIncrement" $FILE`
	    if [ "$THREADINC" != "" ]; then
	      ReplaceLine $FILE "ThreadIncrement" "ThreadIncrement 20"
	    else
	      AppendLine $FILE "StackSize" "ThreadIncrement 20"
	    fi

	    CONNQUEUE=`$GREP "ConnQueueSize" $FILE`
	    if [ "$CONNQUEUE" != "" ]; then
	      ReplaceLine $FILE "ConnQueueSize" "ConnQueueSize 4096"
	    else
	      AppendLine $FILE "StackSize" "ConnQueueSize 4096"
	    fi
	    LISTENQ=`$GREP "ListenQ" $FILE`
	    if [ "$LISTENQ" != "" ]; then
	      ReplaceLine $FILE "ListenQ" "ListenQ 4096"
	    else
	      AppendLine $FILE "StackSize" "ListenQ 4096"
	    fi
           RQTHROTTLEMIN=`$GREP "RqThrottleMin" $FILE`
            if [ "$RQTHROTTLEMIN" != "" ]; then
	      ReplaceLine $FILE "RqThrottleMin" "RqThrottleMin 128"
            else
              AppendLine $FILE "Security" "RqThrottleMin 128"
             fi
         fi  
        
    FILE="$INSTANCE_WEB/config/server.xml"
     if [ -f $FILE ]; then
	  $CP $FILE $FILE-orig-`$DATE +%y%m%d`-$$
          echo "Modifying file: $FILE"
          NUMCPU=`$UNAME "-X" | $GREP NumCPU | $AWK '{print $3}'`
          ACCEPTOR_THREADS=`$GREP "acceptorthreads" $FILE`
          ACCEPTOR_THREADS=`$ECHO $ACCEPTOR_THREADS | $SED -e 's#acceptorthreads="1"#acceptorthreads="'$NUMCPU'"#'`
          ReplaceLine $FILE "acceptorthreads" "$ACCEPTOR_THREADS"
       MIN_HEAP_SIZE="128M"
       MAX_HEAP_SIZE="128M"
      if [ "$ENOUGH_MEM" = "y" ]; then
		  MIN_HEAP_SIZE="3G"
		  MAX_HEAP_SIZE="3G"
        ReplaceLine $FILE "<JVMOPTIONS>-Xmx256" "<JVMOPTIONS>-Xms$MIN_HEAP_SIZE -Xmx$MAX_HEAP_SIZE</JVMOPTIONS>" 
      fi 
     
      $GREP "Djava.security.policy=$INSTANCE_WEB/config/server.policy" $FILE
      if [ $? -ne 0 ]; then
         AppendLine $FILE "<JVMOPTIONS>-Djava.util.logging.manager=com.iplanet.ias.server.logging.ServerLogManager" "   <JVMOPTIONS>-Djava.security.policy=$INSTANCE_WEB/config/server.policy.NEVERUSED</JVMOPTIONS>"
      fi
      
      $GREP "Xss" $FILE
      if [ $? -ne 0 ]; then
        AppendLine $FILE "<JVMOPTIONS>-Djava.util.logging.manager=com.iplanet.ias.server.logging.ServerLogManager" "    <JVMOPTIONS>-Xss128K</JVMOPTIONS>"
      fi

      $GREP "XX:+UseParNewGC" $FILE
      if [ $? -ne 0 ]; then
	     AppendLine $FILE "<JVMOPTIONS>-Djava.util.logging.manager=com.iplanet.ias.server.logging.ServerLogManager" "    <JVMOPTIONS>-XX:+UseParNewGC</JVMOPTIONS>"
      fi

      $GREP "XX:+UseConcMarkSweepGC" $FILE
      if [ $? -ne 0 ]; then
	     AppendLine $FILE "<JVMOPTIONS>-Djava.util.logging.manager=com.iplanet.ias.server.logging.ServerLogManager" "    <JVMOPTIONS>-XX:+UseConcMarkSweepGC</JVMOPTIONS>"
      fi

      $GREP "XX:MaxTenuringThreshold" $FILE
      if [ $? -ne 0 ]; then
	     AppendLine $FILE "<JVMOPTIONS>-Djava.util.logging.manager=com.iplanet.ias.server.logging.ServerLogManager" "    <JVMOPTIONS>-XX:MaxTenuringThreshold=1</JVMOPTIONS>"
      fi

      $GREP "XX:SoftRefLRUPolicyMSPerMB" $FILE
      if [ $? -ne 0 ]; then
	     AppendLine $FILE "<JVMOPTIONS>-Djava.util.logging.manager=com.iplanet.ias.server.logging.ServerLogManager" "    <JVMOPTIONS>-XX:SoftRefLRUPolicyMSPerMB=1</JVMOPTIONS>"
      fi


      $GREP "XX:+CMSClassUnloadingEnabled" $FILE
      if [ $? -ne 0 ]; then
	     AppendLine $FILE "<JVMOPTIONS>-Djava.util.logging.manager=com.iplanet.ias.server.logging.ServerLogManager" "    <JVMOPTIONS>-XX:+CMSClassUnloadingEnabled</JVMOPTIONS>"
      fi

      $GREP "XX:+CMSPermGenSweepingEnabled" $FILE
      if [ $? -ne 0 ]; then
	     AppendLine $FILE "<JVMOPTIONS>-Djava.util.logging.manager=com.iplanet.ias.server.logging.ServerLogManager" "    <JVMOPTIONS>-XX:+CMSPermGenSweepingEnabled</JVMOPTIONS>"
      fi

      $GREP "XX:+PrintGCTimeStamps" $FILE
      if [ $? -ne 0 ]; then
	     AppendLine $FILE "<JVMOPTIONS>-Djava.util.logging.manager=com.iplanet.ias.server.logging.ServerLogManager" "    <JVMOPTIONS>-XX:+PrintGCTimeStamps</JVMOPTIONS>"
      fi

      $GREP "XX:+ShowMessageBoxOnError" $FILE
      if [ $? -ne 0 ]; then
	     AppendLine $FILE "<JVMOPTIONS>-Djava.util.logging.manager=com.iplanet.ias.server.logging.ServerLogManager" "    <JVMOPTIONS>-XX:+ShowMessageBoxOnError</JVMOPTIONS>"
      fi

      $GREP "XX:MaxPermSize=" $FILE
      if [ $? -ne 0 ]; then
	     AppendLine $FILE "<JVMOPTIONS>-Djava.util.logging.manager=com.iplanet.ias.server.logging.ServerLogManager" "    <JVMOPTIONS>-XX:MaxPermSize=64M</JVMOPTIONS>"
      fi

      $GREP "XX:PermSize=" $FILE
      if [ $? -ne 0 ]; then
	     AppendLine $FILE "<JVMOPTIONS>-Djava.util.logging.manager=com.iplanet.ias.server.logging.ServerLogManager" "    <JVMOPTIONS>-XX:PermSize=64M</JVMOPTIONS>"
      fi

      $GREP "XX:+OverrideDefaultLibthread" $FILE
	if [ $? -ne 0 ]; then
	AppendLine $FILE "<JVMOPTIONS>-Djava.util.logging.manager=com.iplanet.ias.server.logging.ServerLogManager" "    <JVMOPTIONS>-XX:+OverrideDefaultLibthread</JVMOPTIONS>"
      fi

	$GREP "XX:+DisableExplicitGC" $FILE
	if [ $? -ne 0 ]; then
	AppendLine $FILE "<JVMOPTIONS>-Djava.util.logging.manager=com.iplanet.ias.server.logging.ServerLogManager" "    <JVMOPTIONS>-XX:+DisableExplicitGC</JVMOPTIONS>"
      fi

        $GREP "XX:+PrintGCDetails" $FILE
   	if [ $? -ne 0 ]; then
   	AppendLine $FILE "<JVMOPTIONS>-Djava.util.logging.manager=com.iplanet.ias.server.logging.ServerLogManager" "    <JVMOPTIONS>-XX:+PrintGCDetails</JVMOPTIONS>"
   	fi

        $GREP "XX:+PrintClassHistogram" $FILE
   	if [ $? -ne 0 ]; then
   	AppendLine $FILE "<JVMOPTIONS>-Djava.util.logging.manager=com.iplanet.ias.server.logging.ServerLogManager" "    <JVMOPTIONS>-XX:+PrintClassHistogram</JVMOPTIONS>"
   	fi

        $GREP "Xloggc:$INSTANCE_WEB/logs/gclog" $FILE
   	if [ $? -ne 0 ]; then
   	AppendLine $FILE "<JVMOPTIONS>-Djava.util.logging.manager=com.iplanet.ias.server.logging.ServerLogManager" "    <JVMOPTIONS>-Xloggc:$INSTANCE_WEB/logs/gclog</JVMOPTIONS>"
   	fi
       
      $GREP "XX:MaxNewSize=" $FILE
      if [ $? -ne 0 ]; then
   	AppendLine $FILE "<JVMOPTIONS>-Djava.util.logging.manager=com.iplanet.ias.server.logging.ServerLogManager" "    <JVMOPTIONS>-XX:MaxNewSize=384M</JVMOPTIONS>"
      fi

      $GREP "XX:NewSize=" $FILE
      if [ $? -ne 0 ]; then
	AppendLine $FILE "<JVMOPTIONS>-Djava.util.logging.manager=com.iplanet.ias.server.logging.ServerLogManager" "    <JVMOPTIONS>-XX:NewSize=384M</JVMOPTIONS>"
      fi
    fi
  fi
  done

elif [ "$DEPLOY_TYPE" = "WEBSPHERE" ]; then
   Question "What is the Application Server directory?" "/opt/WebSphere/AppServer"
    DEPLOY_DIR=$ANSWER

    Question "What is the Application Server Virtual Host?" "default_host"
    DEPLOY_VIRTUAL_HOST=$ANSWER

    Question "What is the Application Server Node?" `$HOSTNAME`
    DEPLOY_NODE=$ANSWER

    Question "What is the Application Server instance?" "Default Server"
    DEPLOY_INSTANCE="$ANSWER"
    MIN_HEAP_SIZE="128"
    MAX_HEAP_SIZE="128"

    if [ "$ENOUGH_MEM" = "y" ]; then
          MIN_HEAP_SIZE="3072"
          MAX_HEAP_SIZE="3072"
    fi

    FILE="/tmp/perftune.xml"
    $ECHO "
<?xml version=\"1.0\"?>
<!DOCTYPE websphere-sa-config SYSTEM \"file:///\$XMLConfigDTDLocation\$\$dsep\$xmlconfig.dtd\" >
<websphere-sa-config>
  <node action=\"update\" name=\"$DEPLOY_NODE\">
    <application-server action=\"update\" name=\"$DEPLOY_INSTANCE\">
      <jvm-config>
        <initial-heap-size>$MIN_HEAP_SIZE</initial-heap-size>
        <max-heap-size>$MAX_HEAP_SIZE</max-heap-size>
        <additional-command-line-arguments>-XX:MaxPermSize=64M -XX:PermSize=64M -XX:+OverrideDefaultLibthread -XX:MaxNewSize=384M -XX:NewSize=384M</additional-command-line-arguments>
      </jvm-config>
    </application-server>
  </node>
</websphere-sa-config>
" > $FILE
    $DEPLOY_DIR/bin/XMLConfig.sh -adminNodeName "$DEPLOY_NODE" -import $FILE > /dev/null

  fi
  NEED_RESTART="y"
  $ECHO "Application Server Container Tuning complete."

}


###############################################
# Identity SDK Tuning
###############################################
TuneIdentitySDK(){
$PKGINFO -q SUNWamsdk
if [ $? -eq 0 ]; then
  YesNo "Tune Identity Server SDK?" "y"
  if [ "$ANSWER" = "y" ]; then
  INSTANCES_DSAME=`$LS -d /etc/opt/SUNWam/config/AMConfig*properties 2>&1`
  INSTANCES_COUNT=`$LS -d /etc/opt/SUNWam/config/AMConfig*properties | $WC -l`
  MEM_REQUIRED=MEM_REQUIRED*INSTANCES_COUNT
  
   # Max concurrent sessions for DSAME SDK cache size tuning
   # (calculation based on 300 KB mem footrint / portal session in average).
   # That is 3500 for optimum and 7000 on for large.
   MAX_CONCURRENT_SESSIONS=7000

    
    # DSAME_MAX_CACHE_SIZE based on DSAME & S1PS tuning guide recommendations
    # maxSize = (max number of concurrent sessions) * (2 + services registered)
    # See Tuning Guide for definition of max concurrent sessions
    # Where:
    #    - services registered = 3 (out of the box default).
    DSAME_MAX_CACHE_SIZE=`expr $MAX_CONCURRENT_SESSIONS \* 5`
    
    for INSTANCE_DSAME in $INSTANCES_DSAME; do
      FILE="$INSTANCE_DSAME"
      if [ -f $FILE ]; then
        $CP $FILE $FILE-orig-`$DATE +%y%m%d`-$$
        ReplaceLine $FILE "com.iplanet.am.logstatus" "com.iplanet.am.logstatus=INACTIVE"
        ReplaceLine $FILE "com.iplanet.am.sdk.cache.maxSize" "com.iplanet.am.sdk.cache.maxSize=${DSAME_MAX_CACHE_SIZE}"
        ReplaceLine $FILE "com.iplanet.am.session.purgedelay" "com.iplanet.am.session.purgedelay=5"
        ReplaceLine $FILE "com.iplanet.am.session.client.polling.enable" "com.iplanet.am.session.client.polling.enable=true"
	ReplaceLine $FILE "com.iplanet.am.session.client.polling.period" "com.iplanet.am.session.client.polling.period=600"
      fi
    done
    NEED_RESTART="y"
    $ECHO "Identity SDK Tuning complete."
  fi
fi
}

################################################################
# Portal desktop Tuning
################################################################
TunePortalDesktop(){
$PKGINFO -q SUNWps
if [ $? -eq 0 ]; then
  YesNo "Tune Portal Server desktop service?" "y"
  
  if [ "$ANSWER" = "y" ]; then
      Question "What is the Identity Server base directory?" "/opt"
      IDSAME_BASEDIR=$ANSWER

      GetPassword "What is the Identity Server administrator password?"
      IDSAME_ADMIN_PASSWORD=$ANSWER

      SetupDN

      AMADMIN="$IDSAME_BASEDIR/SUNWam/bin/amadmin"
      if [ ! -x $AMADMIN ]; then
        $ECHO "Error: Cannot find $AMADMIN. $BELL_CHAR"
        exit 1
      fi    
      FILE="/etc/opt/SUNWps/desktop/desktopconfig.properties"
      
      if [ -f $FILE ]; then
        $CP $FILE $FILE-orig-`$DATE +%y%m%d`-$$
        ReplaceLine $FILE "callerPoolMinSize" "callerPoolMinSize=128"
        ReplaceLine $FILE "callerPoolMaxSize" "callerPoolMaxSize=512"
        ReplaceLine $FILE "callerPoolPartitionSize" "callerPoolPartitionSize=32"
        ReplaceLine $FILE "templateScanInterval" "templateScanInterval=3600"		
      fi  
      
    REAP=300
    SESSIONTIME=1500

    FILE="/tmp/ps-desktop-tune.xml"
    $ECHO '<?xml version="1.0" encoding="ISO-8859-1"?>' > $FILE
    $ECHO '<!DOCTYPE Requests PUBLIC "-//iPlanet//Sun ONE Identity Server 6.0 Admin CLI DTD//EN" "file://'$IDSAME_BASEDIR'/SUNWam/dtd/amAdmin.dtd">' >> $FILE
    $ECHO '<!--  MODIFY REQUESTS -->' >> $FILE
    $ECHO '<Requests>' >> $FILE
    $ECHO '<SchemaRequests serviceName="SunPortalDesktopService" SchemaType="global">' >> $FILE
    $ECHO '<ModifyDefaultValues>' >> $FILE
    $ECHO '<AttributeValuePair>' >> $FILE
    $ECHO '<Attribute name="sunPortalDesktopDpIsValidating"/>' >> $FILE
    $ECHO '<Value>false</Value>' >> $FILE
    $ECHO '</AttributeValuePair>' >> $FILE
    $ECHO '</ModifyDefaultValues>' >> $FILE
    $ECHO '</SchemaRequests>' >> $FILE
    $ECHO '</Requests>' >> $FILE
    $AMADMIN -u "$ADMIN_DN" --password "$IDSAME_ADMIN_PASSWORD" -t $FILE >/dev/null 2>&1
    $RM -f $FILE
    NEED_RESTART="y"
    $ECHO "Portal Desktop Tuning complete."
  fi
fi
}


################################################################
# SecureRemoteAccess Tuning
################################################################
TuneSRA(){
$PKGINFO -q SUNWpsgw
if [ $? -eq 0 ]; then
  YesNo "Tune Secure Remote Access?" "y"
  if [ "$ANSWER" = "y" ]; then
    GW_PKGINFO_FILE="/var/sadm/pkg/SUNWpsgw/pkginfo"
    GrabConfig $GW_PKGINFO_FILE "BASEDIR" "="
    if [ "$ANSWER" != "" ]; then
      GW_BASEDIR=$ANSWER
    else
       $ECHO "Error: Cannot determine BASEDIR. $BELL_CHAR"
    exit 1
    fi
       
    INSTANCES_SRA=`$LS -d /etc/opt/SUNWps/platform.conf.* 2>&1`
    INSTANCES_COUNT=`$LS -d /etc/opt/SUNWps/platform.conf.* | $WC -l`

    GATEWAY="/etc/init.d/gateway"
    if [ ! -x $GATEWAY ]; then
      $ECHO "Error: Cannot find $GATEWAY. $BELL_CHAR"
      exit 1
    fi
    
    NEED_RESTART="y"
    GrabConfig $FILE_GW_INSTANCE_SETUP.$INSTANCE "gateway.jdk.dir" "="
    JAVA_HOME=$ANSWER    
    
     $CP $GW_BASEDIR/SUNWps/bin/gateway $GW_BASEDIR/SUNWps/bin/gateway-orig-`$DATE + %y%m%d`-$$
     $CP /etc/init.d/gateway /etc/init.d/gateway-orig-`$DATE + %y%m%d`-$$
     ReplaceLine "$GW_BASEDIR/SUNWps/bin/gateway" "export LD_LIBRARY_PATH" "    LD_LIBRARY_PATH=/usr/lib/lwp:\$JAVA_HOME/jre/lib/sparc/server:\$LD_LIBRARY_PATH;export LD_LIBRARY_PATH"
 
     CheckMemory
   
     if [ "$ENOUGH_MEM" = "y" ]; then 
       ReplaceLine "$GW_BASEDIR/SUNWps/bin/gateway" "CMD=\"\$JAVA_HOME\/bin\/java \$NATIVE_THREAD -ms64m -mx128m -classpath \$CLASSPATH \$DEFINES1 \$DEFINES2 \$DEFINES3 \$DEFINES4 \$DEFINES5 \$PROXY_DEFINES \$BOOT_CLASSPATH com.sun.portal.netlet.eproxy.EProxy\"" " CMD=\"\$JAVA_HOME\/bin\/java -server -Xms3G -Xmx3G -XX:+OverrideDefaultLibthread -Xss128K -XX:MaxPermSize=64M -XX:PermSize=64M -XX:MaxNewSize=512M -XX:NewSize=512M -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=1 -XX:SoftRefLRUPolicyMSPerMB=1 -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintClassHistogram -XX:+ShowMessageBoxOnError -XX:+DisableExplicitGC -Xloggc:/var/opt/SUNWps/debug/gclog.\$GW_INSTANCE -classpath \$CLASSPATH \$DEFINES1 \$DEFINES2 \$DEFINES3 \$DEFINES4 \$DEFINES5 \$PROXY_DEFINES \$BOOT_CLASSPATH com.sun.portal.netlet.eproxy.EProxy\"" 
       $CP $GW_BASEDIR/SUNWps/bin/gateway /etc/init.d/gateway
       $ECHO "SRA Tuning complete."
     else
       $ECHO "Enough Memory not available for tuning"
     fi
    for INSTANCE_SRA in $INSTANCES_SRA; do
      FILE="$INSTANCE_SRA"
      if [ -f $FILE ]; then
        $CP $FILE $FILE-orig-`$DATE +%y%m%d`-$$
        ReplaceLine $FILE "gateway.cdm.cacheSleepTime" "gateway.cdm.cacheSleepTime=86460000"
        ReplaceLine $FILE "gateway.userProfile.cacheCleanupTime" "gateway.userProfile.cacheCleanupTime=360000"
        ReplaceLine $FILE "gateway.userProfile.cacheSize" "gateway.userProfile.cacheSize=10000"
        ReplaceLine $FILE "gateway.userProfile.cacheSleepTime" "gateway.userProfile.cacheSleepTime=360000"
        ReplaceLine $FILE "gateway.cdm.cacheCleanupTime" "gateway.cdm.cacheCleanupTime=86400000"	
      fi
    done
    
  fi  
fi


}
###############################################
# Main Setup environment
###############################################

if [ `$ID | $AWK '{print $1}'` != "uid=0(root)" ]; then
  $ECHO "You must be root user. $BELL_CHAR"
  exit 1
fi

HOST="`$HOSTNAME`.`$DOMAINNAME`"

Menu "What do you want to tune:" "All;ALL;Directory Server;DS;Identity Server;IS;Portal Server;PS;Secure Remote Access;SRA;"
PERF_TYPE=`$ECHO $ANSWER | $SED -e "s/;//"`

echo $PERF_TYPE

if [ "$1" = "silent" ]; then
    SILENT_MODE="y"
fi  


################################################################
# Check for kernel patch if Solaris 8
################################################################

OS_VERSION=`$UNAME -r`
if [ "$OS_VERSION" = "5.8" ]; then
  BAD_OS_PATCH_LEVEL="n"

  OS_PATCH=`$UNAME -v`

  $ECHO $OS_PATCH | $GREP "Generic_108528-" > /dev/null 2>&1
  if [ $? -eq 0 ]; then
    IFS="-"
    set $OS_PATCH
    IFS=$ORIG_IFS
    MINOR=$2

    if [ $MINOR -lt 22 ]; then
      BAD_OS_PATCH_LEVEL="y"
    fi
  else
    BAD_OS_PATCH_LEVEL="y"
  fi

  if [ "$BAD_OS_PATCH_LEVEL" = "y" ]; then
    $ECHO "Upgrade kernel patch to 108528-22 or greater."
    exit 1
  fi
fi

################################################################
# Calculate memory requirement.
################################################################

typeset -i MEM_AVAILABLE MEM_REQUIRED

MEM_AVAILABLE=`$PRTCONF | $GREP "Memory size" | $AWK '{print $3*1024}`

if [ "$PERF_TYPE" != "DS" ]; then
    MEM_REQUIRED=3*1024*1024
fi

MEM_REQUIRED=$MEM_REQUIRED+250*1024

IS_IDENTITY_SERVER_TUNED="n"
IS_PS_ON_SEPERATE_CONTAINERS="n"

NEED_RESTART="n"
if [ "$PERF_TYPE" = "ALL" ]; then
	echo "Tuning TCP/IP, Kernel, Directory Server, Identity Server, Portal Server on the same node." 
        YesNo "Is the Portal Server and the Identity Server deployed on different Containers?" "n"
        if [ "$ANSWER" = "y" ]; then
 	   IS_PS_ON_SEPERATE_CONTAINERS="y"
        fi	
	TuneTCPIP
	TuneKernel
	TuneDS
	TuneIdentityServer
        if [ "$IS_PS_ON_SEPERATE_CONTAINERS" = "y" ]; then
           YesNo "Tune Identity Server Container?" "y"
	   if [ "$ANSWER" = "y" ]; then
	     TuneAppContainer
           fi
	fi  
	
	if [ "$IS_IDENTITY_SERVER_TUNED" = "n" ]; then
 	   TuneIdentitySDK
	fi
	TunePortalDesktop
        if [ "$IS_PS_ON_SEPERATE_CONTAINERS" = "y" ]; then
           YesNo "Tune Portal Server Container?" "y"
	   if [ "$ANSWER" = "y" ]; then
	     TuneAppContainer
           fi
	fi
	
        if [ "$IS_PS_ON_SEPERATE_CONTAINERS" = "n" ]; then
           YesNo "Tune Identity/Portal Server Container?" "y"
	   if [ "$ANSWER" = "y" ]; then
	     TuneAppContainer
	   fi  
	fi
	TuneSRA
elif [ "$PERF_TYPE" = "DS" ]; then
	echo "Tuning TCP/IP, Kernel, Directory Server" 
	TuneTCPIP
	TuneKernel
	TuneDS
elif [ "$PERF_TYPE" = "IS" ]; then
	echo "Tuning TCP/IP, Kernel, Identity Server" 
	TuneTCPIP
	TuneKernel
	TuneIdentityServer
        YesNo "Tune Identity Server Container?" "y"
        if [ "$ANSWER" = "y" ]; then
	   TuneAppContainer
        fi
elif [ "$PERF_TYPE" = "PS" ]; then
	echo "Tuning TCP/IP, Kernel, Identity SDK, Portal Server" 
	TuneTCPIP
	TuneKernel
	TuneIdentitySDK
	TunePortalDesktop
        YesNo "Tune Portal Server Container?" "y"
        if [ "$ANSWER" = "y" ]; then
	   TuneAppContainer
        fi
elif [ "$PERF_TYPE" = "SRA" ]; then
	echo "Tuning TCP/IP, Kernel, Identity SDK, Portal Server" 
	TuneTCPIP
	TuneKernel
	TuneIdentitySDK
	TuneSRA
fi

if [ "$NEED_RESTART" = "y" ]; then 
  $ECHO "Note: Restart $PERF_TYPE server(s) for the changes to take effect."
fi

if [ "$NEED_REBOOT" = "y" ]; then 
  $ECHO "Note: /etc/system is modified, reboot system for the changes to take effect."
fi
