#!/bin/sh
#
# Copyright (c) 2004 by Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#


#set -x


#########################################
# debug
# 
#########################################
debug() {
    if [ "x"$VERBOSE != "x" ] ; then
	echo $1
    fi
}

#########################################
# get_previous_sync_level
#
#########################################
get_previous_sync_level () {
	versionConfFile=$VAR_ADM/admin-serv/upgrade/versions.conf
	versionConfDir=$VAR_ADM/admin-serv/upgrade
	
	if [ ! -d $versionConfDir ] || [ ! -f $versionConfFile ]; then
	    PREVIOUSSYNCLEVEL="1"
	else
	
	    PREVIOUSSYNCLEVEL=`cat $versionConfFile | awk '{ print $1; }' $versionConfFile`
	    if [ ${PREVIOUSSYNCLEVEL:="undefined"} = "undefined" ] || [ $PREVIOUSSYNCLEVEL = "1" ]; then
		# should never occurs ...
		PREVIOUSSYNCLEVEL="1"
	    fi
	fi

	
}

#########################################
# make_link
#
# remove exiting link at dest if necessary
# create the link
# set the owner id ans group of the link 
#     that just have been created.
# source: $1 
# dest: $2
# owner id of the link: $3 and 
# owner group of the link:$4
#########################################
make_link () {

rc=0

src=$1
dest=$2
USER=$3
GROUP=$4

# if the dest link already exists: remove it
if [ -h $dest ]; then 
    rm -f $dest
    if [ $? -ne 0 ];then 
	rc=1
	echo "Removal of $dest link failed"
    fi
fi

# create the link
ln -s $src $dest

if [ $? -ne 0 ];then 
    rc=1
    echo "Creation of $dest link failed"
else
    if [ "x${USER}" != x ] && [ "x${GROUP}" != x ]; then
	# set the owner id and group of the link.
	chown -h $USER:$GROUP $dest
	    if [ $? -ne 0 ];then 
		rc=1
		echo "Update of $dest link owner failed"
	    fi
    fi
fi

return $rc

}

#########################################
# removes_link
# 
#########################################
removes_link() {
	          
	rc=0

	# removes the links under <server root>/java/jars/admserv522*.jar
	jar_list=`ls $VAR_ADM/java/jars/admserv522*.jar 2> /dev/null`
	if [ x"$jar_list" != x ]; then	    
	    rm -f $jar_list
	fi

	icon_list=`ls $VAR_ADM/java/jars/admserv522*.icon 2> /dev/null`
	if [ x"$icon_list" != x ]; then	    
	    rm -f $icon_list
	fi

       	# temporarely : waiting for a tool that can tell if I am comming back to OR1/rtm version.
	get_previous_sync_level

	# removes links to symc-admin; sync-admin-cds and sync-rpoduct-cds if we are downgrading to OR1/rtm
	if [ $PREVIOUSSYNCLEVEL -eq "1" ]; then

	    binLinks="
		shared/bin/sync-product-cds
		shared/bin/cert-convert
		shared/bin/sync-version
		bin/admin/sync-admin-cds
		bin/admin/sync-admin
		"
	# if the link on ns-slapd does not exist, we assume that DS is not configured anymore.
 	# and so, we can remove the links on ldap tools.
	ns_slapd_location="$VAR_ADM/bin/slapd/server/ns-slapd"
	if [ ! -h $ns_slapd_location ]; then
	    binLinks="$binLinks
		      shared/bin/ldapmodify
		      shared/bin/ldapsearch
		      shared/bin/ldapdelete
		      shared/bin/ldapcompare
		      shared/bin/admin_ip.pl
		      shared/bin/modutil
		      "
	fi
 
	    # updating links related to SUNWpr delivery that used to be in 'mps' and not under 'mps/secv1' directory
	    prLib="
		libplc4.so
		libplds4.so
		libnspr4.so		
		"

	    # updating links to NSS3.3.4 libs
	    sslLib="
		libssl3.so
		libnss3.so
		libsmime3.so		
		"
   	
	    sslLibSparc="
			libfreebl_hybrid_3.so
			libfreebl_pure32_3.so
			"

	    ssusersConfFile=$VAR_ADM/shared/config/ssusers.conf
	    if [ -f $ssusersConfFile ]; then
		SYSTEMUSER=`cat $ssusersConfFile | awk '/^SuiteSpotUser/ { print $2; }' `
	        SYSTEMGROUP=`cat $ssusersConfFile | awk '/^SuiteSpotGroup/ { print $2; }' `
	    fi

	    for fileName in ${sslLib}; do
		make_link $LOCAL_TLS_LIBDIR_334/${fileName} $VAR_ADM/lib/${fileName} $SYSTEMUSER $SYSTEMGROUP
		if [ $? -ne 0 ]; then
		    rc=1
		fi
	    done

	    make_link $LOCAL_TLS_LIBDIR_334/libnssckbi.so $VAR_ADM/alias/libnssckbi.so $SYSTEMUSER $SYSTEMGROUP
	    if [ $? -ne 0 ]; then
		rc=1
	    fi
		
	    if [ `uname -p` = "sparc" ]; then
		for fileName in ${sslLibSparc}; do
		    make_link $LOCAL_TLS_LIBDIR_334/${fileName} $VAR_ADM/lib/${fileName} $SYSTEMUSER $SYSTEMGROUP
		    if [ $? -ne 0 ]; then
			rc=1
		    fi
	      done
	    fi

	    make_link $LOCAL_JSS_LIBDIR_334/libjss3.so $VAR_ADM/lib/jss/libjss3.so $SYSTEMUSER $SYSTEMGROUP
	    if [ $? -ne 0 ]; then
		rc=1
	    fi

	    make_link $LOCAL_JSS_SHARED_LIBDIR_334/jss3.jar $VAR_ADM/java/jss3.jar $SYSTEMUSER $SYSTEMGROUP
	    if [ $? -ne 0 ]; then
		rc=1
	    fi

	    for fileName in ${prLib}; do
		make_link $LOCAL_PR_LIBDIR_334/${fileName} $VAR_ADM/lib/${fileName} $SYSTEMUSER $SYSTEMGROUP
		if [ $? -ne 0 ]; then
		    rc=1
		fi
	    done

	    # links for admin servers and shared bin
	    for fileName in ${binLinks}; do
		if [ -h $VAR_ADM/${fileName} ]; then 
		    rm -f $VAR_ADM/${fileName}
		    if [ $? -ne 0 ];then 
			rc=1
			echo "Removal of $VAR_ADM/${fileName} link failed"
		    fi
		fi
	    done

	    if [ ! -h $VAR_ADM/manual ]; then
		rm -rf $VAR_ADM/manual
                if [ $? -ne 0 ];then
        		rc=1
                        echo "Removal of $VAR_ADM/manual failed"
		fi
		make_link $LOCAL_USR_ADM/manual $VAR_ADM/manual $SYSTEMUSER $SYSTEMGROUP
     		if [ $? -ne 0 ]; then
       			rc=1
		fi
	    fi

	fi

	return $rc

}

#########################################
# getPkgBase
#
# sets PKGNAME variable 
##########################################
get_pkgname() {
    debug "get_pkgname $1"
    PKG=$1
    pkginfo -R $ROOTDIR $PKG.\* 1>/dev/null 2>&1
    if [ $? -ne 0 ]; then
	debug "No package $1 installed"
	return 1
    else
	PKGNAME=`pkginfo -R ${ROOTDIR} $1.\* | awk '{print $2}'`
    fi
    debug "get_pkgname returns $PKGNAME"
    return 0
}


#########################################
# pkg_get_basedir
#
# set PKGBASEDIR variable 
##########################################
pkg_get_basedir() {
    debug "get_basedir $1"    
    get_pkgname $1
    if [ $? -ne 0 ]; then
	return 1
    else
	LOCAL_BASEDIR=`pkginfo -R ${ROOTDIR} -r $PKGNAME`
	if [ ${ROOTDIR} != '/' ] ; then
	    PKGBASEDIR=${ROOTDIR}/${LOCAL_BASEDIR}
	else
	    PKGBASEDIR=${LOCAL_BASEDIR}
	fi
    fi
    debug "get_basedir returns $PKGBASEDIR"
    return 0
}



#########################################
# set_env_vars
#
#########################################
set_env_vars () {
      pkg_get_basedir SUNWasvu
   AS_BASEDIR=$PKGBASEDIR
   LOCAL_AS_BASEDIR=$LOCAL_BASEDIR
   USR_ADM=$AS_BASEDIR/usr/sadm/mps/admin/v5.2
   ETC_ADM=$AS_BASEDIR/etc/mps/admin/v5.2

   LOCAL_USR_ADM=$LOCAL_AS_BASEDIR/usr/sadm/mps/admin/v5.2
   LOCAL_ETC_ADM=$LOCAL_AS_BASEDIR/etc/mps/admin/v5.2

   pkg_get_basedir SUNWtls
   TLS_LIBDIR_334=$PKGBASEDIR/usr/lib/mps
   LOCAL_TLS_LIBDIR_334=$LOCAL_BASEDIR/usr/lib/mps
   TLS_LIBDIR=$TLS_LIBDIR_334/secv1
   LOCAL_TLS_LIBDIR=$LOCAL_TLS_LIBDIR_334/secv1

   pkg_get_basedir SUNWldk
   LDK_LIBDIR=$PKGBASEDIR/usr/lib/mps  
   LOCAL_LDK_LIBDIR=$LOCAL_BASEDIR/usr/lib/mps  

   pkg_get_basedir SUNWpr
   PR_LIBDIR_334=$PKGBASEDIR/usr/lib/mps
   LOCAL_PR_LIBDIR_334=$LOCAL_BASEDIR/usr/lib/mps
   PR_LIBDIR=$PR_LIBDIR_334/secv1
   LOCAL_PR_LIBDIR=$LOCAL_PR_LIBDIR_334/secv1

   pkg_get_basedir SUNWsasl
   SASL_LIBDIR=$PKGBASEDIR/usr/lib/mps/sasl2
   LOCAL_SASL_LIBDIR=$LOCAL_BASEDIR/usr/lib/mps/sasl2

   pkg_get_basedir SUNWicu
   ICU_LIBDIR=$PKGBASEDIR/lib/
   LOCAL_ICU_LIBDIR=$LOCAL_BASEDIR/lib/

   pkg_get_basedir SUNWjss
   LOCAL_JSS_LIBDIR_334=$LOCAL_BASEDIR/usr/lib/mps
   LOCAL_JSS_SHARED_LIBDIR_334=$LOCAL_BASEDIR/usr/share/lib/mps

   VAR_ADM=$AS_BASEDIR/var/mps/serverroot
   if [ -f $ETC_ADM/shared/config/serverroot.conf ]; then
      VAR_ADM=$ROOTDIR/`cat $ETC_ADM/shared/config/serverroot.conf`
   fi
}

#########################################
# is_configured 
#
# return non-zero if configuration has been done
#
##########################################
is_configured () {

    if [ -f $VAR_ADM/admin-serv/config/adm.conf ]; then
	return 0
    fi
    return 1
}

#########################################
# stop server instance
##########################################
stop_server() {
stop_patch=no
cmd_torun_admin=

# as instance under the server root must be stopped.
#


AS_BASEDIR=${ROOTDIR}/`pkginfo -R ${ROOTDIR} -r SUNWasvu`
# BugId 4943278: Error 'cat: cannot open /[...]/serverroot.conf' when patchadd 115614-01
#    add existence file test
if [ -f ${AS_BASEDIR}/etc/mps/admin/v5.2/shared/config/serverroot.conf ] ; then
    SERVER_ROOT=${ROOTDIR}/`cat ${AS_BASEDIR}/etc/mps/admin/v5.2/shared/config/serverroot.conf`
fi

if [ -f ${SERVER_ROOT}/admin-serv/logs/pid  ]
then
    stop_patch=yes
    cmd_torun_admin="${LOCAL_AS_BASEDIR}/usr/sbin/mpsadmserver stop\n"
else
   return 0
fi

if [ ${stop_patch} = yes ]
then  
    if [ "x${ROOTDIR}" = x ] || [ "x${ROOTDIR}" = "x/" ]
    then
	echo "Prebackout script is stopping Administration Server..."
    USER=`/usr/bin/ls -l ${SERVER_ROOT}/admin-serv/logs/pid | awk '{print $3}'`
	echo ${cmd_torun_admin} | sh
	if [ $? -ne 0 ]
	then
		echo "Prebackout script failed to stop Administration Server." 
		return 1
	fi

	PATHNUM=`env | grep PatchNum`
 	echo ${USER} > /var/tmp/.shouldRestartAS_prepatch_${PATHNUM}
	echo "Administration Server stopped."
	return 0
    else
	echo "Prebackout script cannot stop Administration Server when option -R is used."
	echo "Log in to the system where Administration Server is running"
	echo "and run the following command:"
	echo "${cmd_torun_admin}" | sed "s,//*,/,g"
	return 1
    fi
fi

}

#########################################
# main 
##########################################

set_env_vars
   
stop_server
if [ $? -ne 0 ]; then
    exit 1
fi

# sync the admin ...

is_configured

if [ $? -eq 0 ]; then

	#sync-admin { upgrade | downgrade } -r {serverRootPath}
	OPTIONS="downgrade -r $VAR_ADM"     

	REMOTE_LD_LIBRARY_PATH=$TLS_LIBDIR:$LDK_LIBDIR:$PR_LIBDIR:$SASL_LIBDIR:$ICU_LIBDIR:$USR_ADM/lib:$LD_LIBRARY_PATH	
	env LD_LIBRARY_PATH=$REMOTE_LD_LIBRARY_PATH $USR_ADM/bin/admin/sync-admin $OPTIONS
	sync_admin_status=$?

	# removes the link from the server to the files delivered by the patch
	removes_link
        remove_links_status=$?

	echo "Reverting to prepatch certificate database."
	echo "Certificates added after patching the server must be downgraded manually."
	echo "See 'Installation and Migration Guide' or patch README for instructions."

	if [ $sync_admin_status -eq 1 ] || [ $remove_links_status -eq 1 ]; then
	    echo "Prebackout script failed to downgrade configuration data."	    
	else
	    echo "Prebackout script completed downgrade of configuration data."
	fi
	#else
	# No Data to synchronize (Admin server not currently configured)."
fi
