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

### NOTE : This script currently does only an upgrade from 6.2 TO 6.3. 
#
#  set shell variables
#

DEF_UMASK=022
PATH=/bin:/usr/bin:/sbin:/usr/sbin
OS=`uname`
if [ $OS = "Linux" ]; then
    GREP=/bin/grep
    ECHO="/bin/echo -n"
    NECHO="/bin/echo"
    CP="/bin/cp -p"
    RM=/bin/rm
    AWK=/usr/bin/awk
    gettext=/usr/bin/gettext
    CUT=/usr/bin/cut
    DATE=/bin/date
    DOMAINNAME=/bin/domainname
    SORT=/bin/sort
    MKDIR="/bin/mkdir -p"
    LOGDIR=/var/log
    RPM=/bin/rpm
    PRODUCT_DIR=identity
    CONFIG_DIR=/etc/opt/sun/identity/config
    TOUCH=/bin/touch
    SED=/bin/sed
    EGREP=/bin/egrep
    CAT=/bin/cat
    LS=/bin/ls
else
    GREP=/usr/bin/grep
    ECHO=/usr/bin/echo
    NECHO=/usr/bin/echo
    CP="/usr/bin/cp -p"
    RM=/usr/bin/rm
    AWK=/usr/bin/awk
    gettext=/usr/bin/gettext
    CUT=/usr/bin/cut
    DATE=/usr/bin/date
    DOMAINNAME=/usr/bin/domainname
    SORT=/usr/bin/sort
    MKDIR="/usr/bin/mkdir -p"
    LOGDIR=/var/sadm/install/logs
    PKGINFO=/usr/bin/pkginfo
    PRODUCT_DIR=SUNWam
    CONFIG_DIR=/etc/opt/SUNWam/config
    OMIT='\c'
    TOUCH=/usr/bin/touch
    SED=/usr/bin/sed
    EGREP=/usr/bin/egrep
    CAT=/usr/bin/cat
    LS=/usr/bin/ls
fi
TR=/usr/bin/tr
AMCONFIG=$CONFIG_DIR/AMConfig.properties
REQUEST_DIR=$CONFIG_DIR/request
export TR
export DEF_UMASK
export PATH
export GREP
export CP
export RM
export AWK
export CUT
export ECHO
export NECHO
export gettext
export DATE
export TOUCH
export SED
export EGREP
export CAT
export LS

TEXTDOMAIN=upgradescripts
TEXTDOMAINDIR=./locale
NLSPATH=$TEXTDOMAINDIR
export TEXTDOMAIN
export TEXTDOMAINDIR
export NLSPATH

OPEN='('
CLOSE=')'
LEFT_BRACKET='['
RIGHT_BRACKET=']'

LOGSUFFIX=`$DATE '+%m%d%H%M'`
if [ ! -d $LOGDIR ]; then
    MKDIR $LOGDIR
fi
LOGFILE=${LOGDIR}/Sun_Java_System_Access_Manager_upgrade_dit_log.$LOGSUFFIX
export LOGSUFFIX
export LOGFILE
export CONFIG_DIR
SVC_XML_DIR_IMPORT=${CONFIG_DIR}/xml
export SVC_XML_DIR_IMPORT

###############################################
#
# test for root user
#
###############################################

check_root_user() {
    if test `id | $AWK '{print $1}'` != "uid=0(root)"
    then
	eval $ECHO "`$gettext 'You must be root user to run $0.'`"
	exit 1
    fi
}


###############################################
#
# get hostname info
#

get_host_info() {
    HOSTNAME_FULL="`/bin/uname -n`"
    HOSTNAME=`$ECHO "$HOSTNAME_FULL" | $CUT -d. -f1`
    fulldomain=`$DOMAINNAME`

    HOSTNAME_FULL="$HOSTNAME.$fulldomain"
    $NECHO "HOSTNAME_FULL = $HOSTNAME.$fulldomain" >> $LOGFILE
}


##############################################################################
# 
#  output message and pause for answer
#
pause_for_answer() {
    print $1
    print "`$gettext 'Hit return when ready.'`"
    read ans
}


##############################################################################
#
#  get BASEDIR from SUNWamsvc package
#
get_SUNWamsvc_info() {
    BASEDIR="No SUNWamsvc"
    if [ $OS = "Linux" ]; then
	$RPM -q sun-identity-services
    else
        $PKGINFO SUNWamsvc
    fi
    if [ "$?" -eq "0" ];
    then
        if [ $OS = "Linux" ]; then
	    BASEDIR=`$GREP com.iplanet.am.installdir= $AMCONFIG \
               | $SED -e 's/\/identity//g' | $SED -e 's/com.iplanet.am.installdir=//g'`
	else
	    BASEDIR=`$PKGINFO -r SUNWamsvc`
	fi
    fi

    PKGDIR=$BASEDIR/$PRODUCT_DIR
    export PKGDIR
    $NECHO "BASEDIR = $BASEDIR" >> $LOGFILE
    $NECHO "PRODUCT_DIR = $PRODUCT_DIR" >> $LOGFILE
    $NECHO "PKGDIR = $PKGDIR" >> $LOGFILE
}

##############################################################################
#
#  get information from $CONFIG_DIR/AMConfig.properties
#  make sure that get_SUNWamsvc_info is called first, to get INSTALL_DIR
#
get_AMConfig_info() {
    DS_HOST=`$GREP "com.iplanet.am.directory.host=" $CONFIG_DIR/AMConfig.properties | $SED  -e "s/.*directory.host=//"`
    export DS_HOST
    DS_PORT=`$GREP "com.iplanet.am.directory.port=" $CONFIG_DIR/AMConfig.properties | $SED -e "s/.*directory.port=//"`
    export DS_PORT
    ROOT_AM_SUFFIX=`$GREP "com.iplanet.am.rootsuffix=" $CONFIG_DIR/AMConfig.properties | $SED -e "s/.*rootsuffix=//"`
    export ROOT_AM_SUFFIX
    AMADMIN_DN=`$GREP "com.sun.identity.authentication.super.user=" $CONFIG_DIR/AMConfig.properties | $SED -e "s/.*super.user=//"`
    export AMADMIN_DN
    $NECHO "get_AMConfig_info: DS_HOST=$DS_HOST, DS_PORT=$DS_PORT" >> $LOGFILE
    $NECHO "get_AMConfig_info: ROOT_AM_SUFFIX=$ROOT_AM_SUFFIX, AMADMIN_DN=$AMADMIN_DN" >> $LOGFILE
}


##############################################################################
#
#  get directory server hostname and port number
#
get_directory_server_info() {
    #
    #  check in /var/sadm/pkg/SUNWamsdk/pkginfo
    #
    eval $ECHO "`$gettext 'Directory Server fully-qualified hostname ${OPEN} $DS_HOST ${CLOSE}: ${OMIT}'`"
    read tmp
    if [ "$tmp" != "" ]
    then
	DS_HOST=$tmp
    fi
    eval $ECHO "`$gettext 'Directory Server port ${OPEN} $DS_PORT ${CLOSE}: ${OMIT}'`"
    read tmp
    if [ "$tmp" != "" ]
    then
	DS_PORT=$tmp
    fi
    $ECHO "get_directory_server_info: DS_HOST = $DS_HOST, DS_PORT = $DS_PORT" >> $LOGFILE
}


##############################################################################
#
#  get amadmin_dn
#
get_amadmin_dn() {
    #
    #  get it from AMConfig.properties
    #

    eval $ECHO "`$gettext 'Top-Level Administrator DN ${OPEN} $AMADMIN_DN ${CLOSE}: ${OMIT}'`"
    read tmp
    if [ "$tmp" != "" ]
    then
	AMADMIN_DN="$tmp"
    fi
    $NECHO "get_amadmin_dn: AMADMIN_DN = $AMADMIN_DN" >> $LOGFILE
}


##############################################################
#
#  get Directory Manager DN password
#
get_directory_mgr_dn_passwd() {
    eval $ECHO "`$gettext 'Directory Manager DN ${OPEN} $DIRMGRDN ${CLOSE}: ${OMIT}'`"
    read tmp
    if [ "$tmp" != "" ]
    then
	DIRMGRDN="$tmp"
    fi
    export DIRMGRDN
    $NECHO "get_directory_mgr_dn_passwd: DIRMGRDN=$DIRMGRDN" >> $LOGFILE

    eval $ECHO "`$gettext 'Directory Manager ${OPEN} $DIRMGRDN ${CLOSE} password: ${OMIT}'`"
    stty -echo
    read DIRMGRPASSWD
    stty echo
    DIRMGRPASSWD=`$ECHO "$DIRMGRPASSWD" | $SED -e 's/ *$//'`
    export DIRMGRPASSWD
    $NECHO
}

##############################################################
#
#
#
get_admin_password() {
    eval $ECHO "`$gettext 'Top-Level Administrator ${OPEN} $AMADMIN_DN ${CLOSE} password: ${OMIT}'`"
    stty -echo
    read ADMINPASSWD
    stty echo
    ADMINPASSWD=`$ECHO "$ADMINPASSWD" | $SED -e 's/ *$//'`
    $NECHO
}

##############################################################################
#
#  get package path
#
get_pkg_path() {
    PKGNAME=$1
    tmp="/"
    if [ $OS = "Linux" ]; then
	$RPM -q $PKGNAME >> $LOGFILE
        if [ "$?" = "0" ]; then
            tmp=`$RPM -q --queryformat "%{PREFIXES}" $PKGNAME`
	fi
    else
        $PKGINFO $PKGNAME >> $LOGFILE
        if [ "$?" = "0" ]; then
            tmp=`$PKGINFO -r $PKGNAME`
	fi
    fi
    export tmp
}
##############################################################################
#
#  get package paths
#
#
get_security_pkg_paths() {
    if [ $OS = "Linux" ]; then
	get_pkg_path sun-jss
    else
	get_pkg_path SUNWjss
    fi
    JSS_BASE_DIR=$tmp

    if [ $OS = "Linux" ]; then
	get_pkg_path sun-nss
    else
        get_pkg_path SUNWtls
    fi
    NSS_BASE_DIR=$tmp

    if [ $OS = "Linux" ]; then
	get_pkg_path sun-nspr
    else
        get_pkg_path SUNWpr
    fi
    NSPR_BASE_DIR=$tmp

    export JSS_BASE_DIR
    export NSS_BASE_DIR
    export NSPR_BASE_DIR
    $NECHO "SUNWjss_BASE_DIR = $JSS_BASE_DIR" >> $LOGFILE
    $NECHO "SUNWtls_BASE_DIR = $NSS_BASE_DIR" >> $LOGFILE
    $NECHO "SUNWpr_BASE_DIR  = $NSPR_BASE_DIR" >> $LOGFILE
}


##############################################################################
#
# get list of services to import
#
##############################################################################

get_services_list() {
    SVCS_TO_IMPORT=`$LS -1 ${PKGDIR}/upgrade/services | $SORT`
}


##############################################################################
#
# get service revision to upgrade to
#
##############################################################################

get_to_service_revision() {
    service_dir=${UPGRADE_DIR}/services/$1
    dit_version=$2

    $NECHO "get_to_service_revision: serviceDir: $service_dir" >> $LOGFILE
    $NECHO "get_to_service_revision: dit_version: $dit_version" >> $LOGFILE
    cd $service_dir
    $LS -1d * > /tmp/servdir.tmp


    to_version=`$AWK 'BEGIN {FS="_"}{i=0;while (i<=NR) { if (($1 != "s") && ($1 > $2) && ($1 > max)) {max=$1}  else if ($2 > max) {max=$2} i++}}  END {print max}' /tmp/servdir.tmp`

    $NECHO "to_version is : $to_version" >> $LOGFILE
    $RM /tmp/servdir.tmp
}	
##############################################################################
#
# get the service revision in DIT
#
##############################################################################

get_service_revision_number() {
    SERVICE_NAME=`$ECHO $1 | $AWK -F_ '{print $2}'`
    export SERVICE_NAME
    REV_FILE_NAME="${PKGDIR}/upgrade/scripts/getServiceRevisionNumber.xml"
    RREV_FILE_NAME="/tmp/getService.xml"
    $SED 's/SERVICE_NAME/'$SERVICE_NAME'/' $REV_FILE_NAME > $RREV_FILE_NAME
    $ADMIN_CLI --runasdn "$AMADMIN_DN" -w "$ADMINPASSWD" -c -t ${RREV_FILE_NAME}  > /tmp/serviceRevNumber
    SVC_VERSION_IN_DIT=`$CAT /tmp/serviceRevNumber | $SED -n ' 1,1 p'`
    if [ "$SVC_VERSION_IN_DIT" = "Success 0: Successfully completed." ]; then
       from_version="s"
    else
       from_version=$SVC_VERSION_IN_DIT
    fi
    get_to_service_revision $1 $from_version
    $NECHO "from_version is SVC_VERSION_IN_DIT : $SVC_VERSION_IN_DIT"  >> $LOGFILE
    export SVC_VERSION_IN_DIT
}

##############################################################################
# start upgrade
##############################################################################
start_upgrade() {
    NEW_SERVICE_DIR="s_10"
    export NEW_SERVICE_DIR
    SERVICES_DIR="${UPGRADE_DIR}/services"
    export SERVICES_DIR
    for file in $SVCS_TO_IMPORT
    do
	dirlist=""
	$NECHO "=========================================================================" >> $LOGFILE
        $NECHO "Service to migrate : $file " >> $LOGFILE
        get_service_revision_number $file

        ### cover up for the amadmin crash on linux
        ### don't try to execute anything in that case
        ### since it messes up the upgrade of the service
	### REMOVE these lines when amadmin is fixed.
        if [ "$from_version" = "#" ]; then
            from_version="${to_version}"
	fi
        ### END REMOVE
        if [ "$from_version" = "$to_version" ]; then
                $NECHO "$file Service upgrade not required." >> $LOGFILE
        else if [ "$from_version" = "s" ]; then
	    dirlist="${UPGRADE_DIR}/services/$file/${NEW_SERVICE_DIR}"
            if [ "$to_version" != "10" ]; then
		intversion="10"
                while [ $intversion != $to_version ]; do
		    tversion=`$ECHO $intversion | $AWK '{x=$1+10;print x}'`
                    dirlist="${dirlist} ${UPGRADE_DIR}/services/$file/${intversion}_${tversion}"
                    intversion="$tversion"
		done
	    fi
	else
	    $NECHO "$file Service Upgrade Required" >> $LOGFILE
   	    inversion=`$ECHO $from_version | $AWK '{x=$1 + 10 ; print x}'`
	    if [ "$inversion" = "$to_version" ]; then
                SERVICE_VERSION_DIR="${from_version}_${to_version}"
                dirlist="${UPGRADE_DIR}/services/$file/${SERVICE_VERSION_DIR}"
            fi
            if [ "$dirlist" = "" ]; then
		### get directories to update
                dirlist=""
                int_version=`$ECHO $from_version | $AWK '{x=$1 + 10 ; print x}'`
                while [ "$int_version" != "$to_version" ]; do
		    dirlist="${dirlist} ${UPGRADE_DIR}/services/$file/${from_version}_${int_version}  ${UPGRADE_DIR}/services/$file/${int_version}_${to_version}"
                    int=$int_version
                    int_version=`$ECHO $int | $AWK '{x=$1 + 10;print x}'`
		done
	    fi
	fi
	$NECHO "List of Directories to upgrade for $file  : $dirlist" >> $LOGFILE
	for dirfile in $dirlist
	do
	    MIGRATION_SCRIPT_DIR=${dirfile}
	    export MIGRATION_SCRIPT_DIR
	    SERVICE_VERSION_DIR=${dirfile}
	    export SERVICE_VERSION_DIR
	    XML_DIR=${dirfile}/data
	    export XML_DIR
	    $NECHO "MIGRATION DIR IS : $MIGRATION_SCRIPT_DIR" >> $LOGFILE
	    $NECHO "SERVICE VERSION  DIR IS : $SERVICE_VERSION_DIR" >> $LOGFILE
	    $NECHO "XML DIR IS : $XML_DIR" >> $LOGFILE
	    execute_service_migration_scripts $MIGRATION_SCRIPT_DIR
	    if [ "$SERVICE_UPGRADE_SUCCESS" = "true" ]; then
		if [ "$from_version" != "s" ]; then
                    if [ -f ${XML_DIR}/setServiceRevision.xml ]; then
                        import_service_data ${XML_DIR}/setServiceRevision.xml
                    fi
                fi
	    fi
	done
    fi
    done
}

##############################################################################
#
# execute the error script onerror.sh 
#
##############################################################################
execute_on_error_script() {
    MIGRATION_DIR=$1
    if [ -f ${MIGRATION_DIR}/onerror.sh ]; then
	${UPGRADE_DIR}/$SERVICE_VERSION_DIR/onerror.sh $2 $3
    fi
}

##############################################################################
#
# execute service migration scripts 
# premigrate.sh , migrate.sh and postmigrate.sh
#
##############################################################################

execute_service_migration_scripts() {

    MIGRATION_DIR=$1
    if [ -f $MIGRATION_DIR/premigrate.sh ];
    then
	${MIGRATION_DIR}/premigrate.sh -y
	if [ $? -ne 0 ]; then
	    execute_on_error_script $MIGRATION_SCRIPT_DIR ${MIGRATION_DIR}/premigrate.sh $?
	else 
	    SERVICE_UPGRADE_SUCCESS="true"
	fi
    fi
    if [ -f ${MIGRATION_DIR}/migrate.sh ];
    then
	${MIGRATION_DIR}/migrate.sh -y
	if [ $? -ne 0 ]; then
	    execute_on_error_script $MIGRATION_SCRIPT_DIR ${MIGRATION_DIR}/migrate.sh $?
	else 
	    SERVICE_UPGRADE_SUCCESS="true"
	fi
    fi
    if [ -f $MIGRATION_DIR/postmigrate.sh ]
    then
	${MIGRATION_DIR}/postmigrate.sh -y
	if [ $? -ne 0 ]; then
	    execute_on_error_script $MIGRATION_SCRIPT_DIR ${MIGRATION_DIR}/postmigrate.sh $?
	else 
	    SERVICE_UPGRADE_SUCCESS="true"
	fi
    fi
}


### get realm mode
get_realm_mode() {
    realm_enabled="n"
    eval $ECHO "`$gettext 'Enable Realm Mode ${OPEN}y/n${CLOSE} ${LEFT_BRACKET}${realm_enabled}${RIGHT_BRACKET} : ${OMIT} '`"
    read tmp
    if [ "$tmp" != "" ]
    then
        realm_enabled=$tmp
    fi
}
##############################################################################
#
# starting Main routine
#

umask ${DEF_UMASK}

check_root_user

get_host_info
#
get_SUNWamsvc_info
if [ "$BASEDIR" = "No SUNWamsvc" ]
then
    #
    #  uh-oh
    #
    $ECHO "`$gettext 'Cannot find Access Manager package SUNWamsvc.'`"
    exit 2
fi

#
if [ -f $CONFIG_DIR/AMConfig.properties ]
then
    get_AMConfig_info
else
    eval $ECHO "`$gettext 'Cannot find $CONFIG_DIR/AMConfig.properties'`"
    exit 3
fi
#
get_directory_server_info
#
get_directory_mgr_dn_passwd
#
get_amadmin_dn
export AMADMIN_DN
#
get_admin_password
export ADMINPASSWD

get_realm_mode
#
get_security_pkg_paths
JSS_PATH="${SUNWjss_BASE_DIR}/usr/lib/mps/secv1"
NSS_PATH="${SUNWtls_BASE_DIR}/usr/lib/mps/secv1"
NSPR_PATH="${SUNWpr_BASE_DIR}/usr/lib/mps/secv1"
JSS_JAR_PATH="${SUNWjss_BASE_DIR}/usr/share/lib/mps/secv1"

if [ "$LD_LIBRARY_PATH" = "" ]
then
    LD_LIBRARY_PATH=${PKGDIR}/ldaplib/ldapsdk:$JSS_PATH:$NSS_PATH:$NSPR_PATH:${BASEDIR}/${PRODUCT_DIR}/lib
else
    LD_LIBRARY_PATH=${PKGDIR}/ldaplib/ldapsdk:$JSS_PATH:$NSS_PATH:$NSPR_PATH:${BASEDIR}/${PRODUCT_DIR}/lib:$LD_LIBRARY_PATH
fi

export LD_LIBRARY_PATH

ADMIN_CLI=${PKGDIR}/bin/amadmin
export ADMIN_CLI

UPGRADE_DIR=${PKGDIR}/upgrade
export UPGRADE_DIR

AM_SCRIPTS_DIR=${PKGDIR}/upgrade/scripts
export AM_SCRIPTS_DIR

. ${AM_SCRIPTS_DIR}/amupgradeutils

#
##  upgrade the schema
##
$NECHO "`$gettext 'Upgrading Access Manager 7.0 2005Q4 schema.'`"
$NECHO "`$gettext 'Upgrading Access Manager 7.0 2005Q4 schema.'`" >> $LOGFILE
#
## get the service list
#
get_services_list

#
##start the upgrade process
#
start_upgrade
#
if [ "$realm_enabled" = "y" ]; then
    migrate_to_realm
fi
$ECHO "`$gettext 'Upgrade completed.'`"
$ECHO "`$gettext 'YOU MUST RESTART THE WEB CONTAINERS FOR THE UPGRADE CHANGES TO TAKE EFFECT.'`"
