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

#########################################
# 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

}

#########################################
# create_help_links
#
#########################################

create_help_links() {

  USER=$1
  GROUP=$2
  mkdir $VAR_ADM/manual/help
  chown $USER:$GROUP $VAR_ADM/manual/help

  list_help_files=`(cd $USR_ADM/manual/help/; ls 2> /dev/null)`

  if [ x"$list_help_files" != x ] ; then
     for helpFile in ${list_help_files} ; do
        make_link $LOCAL_USR_ADM/manual/help/${helpFile} $VAR_ADM/manual/help/${helpFile} $USER $GROUP
     done
  fi

}

#########################################
# create_locale_product_link
#
#########################################

create_locale_product_link() {

    locale=$1
    product=$2
    USER=$3
    GROUP=$4
    ret=0

    if [ -d $USR_ADM/manual/${locale}/${product} ] ; then
	if [ ! -d $VAR_ADM/manual/${locale} ]; then
	   mkdir -p $VAR_ADM/manual/${locale}
	   chown $USER:$GROUP $VAR_ADM/manual/${locale}
	   if [ $? -ne 0 ]; then
	      ret=1
           fi  
        fi
        if [ $ret -eq 0 ] ; then
              make_link $LOCAL_USR_ADM/manual/${locale}/${product} $VAR_ADM/manual/${locale}/${product} $USER $GROUP
	      if [ $? -ne 0 ]; then
	        ret=1
              fi
        fi
    fi

 return $ret
}

#########################################
# create_links
# 
#########################################
create_links() {
	# Step2= link creation from server root to binaries for sync-product-cds; sync-admin-cds; sync-admin

	rc=0

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


	# makes sense only if we are comming from OR1/rtm
	if [ $CURRENTSYNCLEVEL -eq "1" ]; then
    
	    binLinks="
		shared/bin/sync-product-cds
		shared/bin/cert-convert
		shared/bin/sync-version
    		shared/bin/ldapmodify
		shared/bin/ldapsearch
		shared/bin/ldapdelete
		shared/bin/ldapcompare
		shared/bin/admin_ip.pl
		shared/bin/modutil
		bin/admin/sync-admin-cds
		bin/admin/sync-admin
		"	

	    # updating links for NSS3.3.4 => NSS3.3.6	   	   
	    sslLib="
		libssl3.so
		libnss3.so
		libsmime3.so		
		"

	    sslLibSparc="
			libfreebl_hybrid_3.so
			libfreebl_pure32_3.so
			"
	    # updating links related to SUNWpr delivery that moved to secv1 directory
	    prLib="
		libplc4.so
		libplds4.so
		libnspr4.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/${fileName} $VAR_ADM/lib/${fileName} $SYSTEMUSER $SYSTEMGROUP
		if [ $? -ne 0 ]; then
		    rc=1
		fi
	    done

	    make_link $LOCAL_TLS_LIBDIR/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/${fileName} $VAR_ADM/lib/${fileName} $SYSTEMUSER $SYSTEMGROUP
		  if [ $? -ne 0 ]; then
		    rc=1
		  fi
	        done
	    fi
	 
	    for fileName in ${prLib}; do
		make_link $LOCAL_PR_LIBDIR/${fileName} $VAR_ADM/lib/${fileName} $SYSTEMUSER $SYSTEMGROUP
		if [ $? -ne 0 ]; then
		    rc=1
		fi
	    done

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

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

	    # links for admin servers and shared bin
	    for fileName in ${binLinks}; do
		if [ -f $USR_ADM/${fileName} ] && [ ! -h $VAR_ADM/${fileName} ]; then 
		    make_link $LOCAL_USR_ADM/${fileName} $VAR_ADM/${fileName} $SYSTEMUSER $SYSTEMGROUP
		    if [ $? -ne 0 ]; then
			rc=1
		    fi
		fi
	    done
	fi

	# adds the links under <server root>/java/jars/admserv52.jar by the new jar file name
	jar_list=`(cd  $USR_ADM/java/jars/ ; ls admserv522*.jar  2> /dev/null)`

	if [ x"$jar_list" != x ] ; then

	    for fileName in ${jar_list}; do
		dest=$VAR_ADM/java/jars/$fileName
		localsrc=$LOCAL_USR_ADM/java/jars/$fileName

		make_link $localsrc $dest $SYSTEMUSER $SYSTEMGROUP
		if [ $? -ne 0 ]; then
		    rc=1
		fi
	    done
	fi
        
	# adds the links concerning to on-line help's

	locale_list=`(cd $USR_ADM/manual/ ; ls 2> /dev/null)`

	if [ -h $VAR_ADM/manual ]; then

	     # if manual is a link
 
	     rm -f $VAR_ADM/manual
	     mkdir -p $VAR_ADM/manual
	     chown $SYSTEMUSER:$SYSTEMGROUP $VAR_ADM/manual

             if [ x"$locale_list" != x ] ; then

		for fileName in ${locale_list}; do
		   if [ $fileName = "help" ] ; then
		     create_help_links $SYSTEMUSER $SYSTEMGROUP
		   else
                      product_list=`(cd $USR_ADM/manual/$fileName ; ls 2> /dev/null)`
		      if [ x"$product_list" != x ] ; then
		         for productName in ${product_list} ; do
			     mkdir -p $VAR_ADM/manual/${fileName}
                	     chown $SYSTEMUSER:$SYSTEMGROUP $VAR_ADM/manual/${fileName}
                             srcFile=$LOCAL_USR_ADM/manual/${fileName}/${productName}
			     destFile=$VAR_ADM/manual/${fileName}/${productName}
			     make_link $srcFile $destFile $SYSTEMUSER $SYSTEMGROUP
		             if [ $? -ne 0 ]; then
		               rc=1
		             fi
		         done
                      fi
		   fi
		done
             fi
	else 
          # manual not a link
          if [ x"$locale_list" != x ] ; then

             for localeName in ${locale_list}; do
		if [ $fileName = "help" ] && [ ! -d $VAR_ADM/manual/help ] ; then
                   create_help_links $SYSTEMUSER $SYSTEMGROUP
                else
                   create_locale_product_link ${localeName} console $SYSTEMUSER $SYSTEMGROUP
                   rc=$?
                   if [ $rc -eq 0 ] ; then
                      create_locale_product_link ${localeName} admin $SYSTEMUSER $SYSTEMGROUP
                      rc=$?
                   fi
                fi
             done
          fi
	fi

	return $rc

}

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


#########################################
# 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=$PKGBASEDIR/usr/lib/mps/secv1
   LOCAL_TLS_LIBDIR=$LOCAL_BASEDIR/usr/lib/mps/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=$PKGBASEDIR/usr/lib/mps/secv1
   LOCAL_PR_LIBDIR=$LOCAL_BASEDIR/usr/lib/mps/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=$LOCAL_BASEDIR/usr/lib/mps/secv1
   LOCAL_JSS_SHARED_LIBDIR=$LOCAL_BASEDIR/usr/share/lib/mps/secv1

   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

   LOCAL_VAR_ADM=$LOCAL_AS_BASEDIR/var/mps/serverroot
   if [ -f $ETC_ADM/shared/config/serverroot.conf ]; then
      LOCAL_VAR_ADM=`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
}



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

set_env_vars

# sync the admin ...

is_configured

if [ $? -eq 0 ]; then
	
	# creates the link from the server to the files delivered by patch
	create_links
	create_links_status=$?

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

	#echo "Synchronizing data with the soft (from $CURRENTSYNCLEVEL to $NEWVERSION)."
	
	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=$?

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


PATHNUM=`env | grep PatchNum`
if [ -f  /var/tmp/.shouldRestartAS_prepatch_${PATHNUM} ]
then
	echo "Postpatch script is starting Administration Server..."
	USER=`cat /var/tmp/.shouldRestartAS_prepatch_${PATHNUM}`
	su ${USER} -c "${LOCAL_AS_BASEDIR}/usr/sbin/mpsadmserver start"
	rm -f /var/tmp/.shouldRestartAS_prepatch_${PATHNUM}

	AS_BASEDIR=${ROOTDIR}/`pkginfo -R ${ROOTDIR} -r SUNWasvu`
	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
		echo "Postpatch script has started Administration Server."
    else
		echo "Postpatch script failed to start Administration Server."
	fi
else
	if [ "x${ROOTDIR}" != x ] && [ "x${ROOTDIR}" != "x/" ]
	then
		is_configured
		if [ $? -eq 0 ]; then
            		echo ""
            		echo "Postpatch script cannot start Administration Server when option -R is used."
	    		echo "If you need to start Administration Server,"
	    		echo "log in to the system where Administration Server is installed"
	    		echo "and run the following command:"
	    		echo "${LOCAL_AS_BASEDIR}/usr/sbin/mpsadmserver start" | sed "s,//*,/,g"
		fi
	fi
fi

is_configured
if [ $? -eq 0 ]; then
	echo ""
	echo "Warning"
	echo "        Upgrade of remote configuration data is not complete."
	echo "        Log in to the system where this patch is "
	echo "        installed and run the following command:"
	echo "        ${LOCAL_AS_BASEDIR}/usr/sbin/mpsadmserver sync-cds [-f {absolute path to credentials file}]"| sed "s,//*,/,g"
	echo ""
fi
