#!/bin/sh 

# Copyright  2004 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, the Sun logo, Java and Sun[tm] ONE are trademarks or
# registered trademarks of Sun Microsystems, Inc. in the U.S. and other
# countries. 
# 
# Copyright  2004 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, le logo Sun, Java et Sun[tm] ONE 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
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'
fi
AMCONFIG=$CONFIG_DIR/AMConfig.properties
export DEF_UMASK
export PATH
export GREP
export CP
export RM
export AWK
export CUT
export ECHO
export NECHO
export gettext
export DATE

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

OPEN='('
CLOSE=')'

LOGSUFFIX=`$DATE '+%m%d%H%M'`
if [ ! -d $LOGDIR ]; then
    MKDIR $LOGDIR
fi
LOGFILE=${LOGDIR}/Sun_Java_System_Identity_Server_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"
    $ECHO "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
    $ECHO "BASEDIR = $BASEDIR" >> $LOGFILE
    $ECHO "PRODUCT_DIR = $PRODUCT_DIR" >> $LOGFILE
    $ECHO "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=//"`
    AMADMIN_DN=`$GREP "com.sun.identity.authentication.super.user=" $CONFIG_DIR/AMConfig.properties | sed -e "s/.*super.user=//"`
    export AMADMIN_DN
    $ECHO "get_AMConfig_info: DS_HOST=$DS_HOST, DS_PORT=$DS_PORT" >> $LOGFILE
    $ECHO "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
    $ECHO "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
    $ECHO "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
        if [ "$?" = "0" ]; then
            tmp=`$RPM -q --queryformat "%{PREFIXES}" $PKGNAME`
	fi
    else
        $PKGINFO $PKGNAME
        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
    $ECHO "SUNWjss_BASE_DIR = $JSS_BASE_DIR" >> $LOGFILE
    $ECHO "SUNWtls_BASE_DIR = $NSS_BASE_DIR" >> $LOGFILE
    $ECHO "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 from
#
##############################################################################

get_from_service_revision() {
    from_version="10"
}	

##############################################################################
#
# get service revision to upgrade to
#
# TODO: determing the service revision from
# the version directories.
##############################################################################

get_to_service_revision() {
    to_version="20"
}	
##############################################################################
#
# 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"
    SVC_VERSION_TO="20"
    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'`
   echo "SVC_VERSION_IN_DIT $SVC_VERSION_IN_DIT"  >> $LOGFILE
   export SVC_VERSION_IN_DIT
}

##############################################################################
# start upgrade
##############################################################################
start_upgrade() {
    get_from_service_revision
    get_to_service_revision
    NEW_SERVICE_DIR="s_10"
    export NEW_SERVICE_DIR
    SERVICE_VERSION_DIR="${from_version}_${to_version}"
    export SERVICE_VERSION_DIR
    SERVICES_DIR="${UPGRADE_DIR}/services"
    export SERVICES_DIR
    for file in $SVCS_TO_IMPORT
    do
	get_service_revision_number $file
	SVC_TO_IMPORT=$file
	export SVC_TO_IMPORT

	if [ "$SVC_TO_IMPORT" != "" ]; then
	    if [ "$to_version" = "$SVC_VERSION_IN_DIT" ]; then
		eval $ECHO "`$gettext '$file service has already been upgraded'`" 
		eval $ECHO "`$gettext '$file service has already been upgraded'`" >> $LOGFILE
	    else
		if [ -d $SERVICES_DIR/${file}/$NEW_SERVICE_DIR ]; then
		    MIGRATION_SCRIPT_DIR=${SERVICES_DIR}/${file}/${NEW_SERVICE_DIR}
		    XML_DIR=${SERVICES_DIR}/${file}/${NEW_SERVICE_DIR}/data
		else
		    MIGRATION_SCRIPT_DIR=${SERVICES_DIR}/${file}/${SERVICE_VERSION_DIR}
		    XML_DIR=${SERVICES_DIR}/${file}/${SERVICE_VERSION_DIR}/data
		fi
		eval $ECHO "`$gettext 'MIGRATION SCRIPT DIR ${MIGRATION_SCRIPT_DIR}'`" >> $LOGFILE
		execute_service_migration_scripts $MIGRATION_SCRIPT_DIR
	    fi
	    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
       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
}


##############################################################################
#
# 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_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
##
$ECHO "`$gettext 'Upgrading Access Manager 2005Q1 schema.'`"
$ECHO "`$gettext 'Upgrading Access Manager 2005Q1 schema.'`" >> $LOGFILE
#
## get the service list
#
get_services_list

#
##start the upgrade process
#
start_upgrade
#
$ECHO "`$gettext 'Upgrade completed.'`"
$ECHO "`$gettext 'YOU MUST RESTART THE WEB CONTAINERS FOR THE UPGRADE CHANGES TO TAKE EFFECT.'`"
