#!/bin/sh

#
# Copyright 2004-2006 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
# ident "$Revision: 1.1 $ SMI"
#

cacao_clean_path () {
    path_to_clean=$1
    
    
    # this awk statement will also remove occurence of '//'
    # a side effect will also remove leading slash
    # -> empty field but the last one will be skip 
    echo "$path_to_clean" | /usr/bin/awk -F/ '{
	realpath="";
	skip_it=0;
	for (i=NF; i>0; i--) { 
		if ($i         == ".")              continue;
		if (length($i) == 0&& i != 1)       continue;
		if ($i         == "..") {skip_it++; continue;}
		if (skip_it    > 0 )    {
			skip_it--;
			continue;
		}
		if (length(realpath) > 0) {
                   realpath=$i"/"realpath;
                } else {
                   realpath=$i;
                }
	}
    } END {print realpath}' 2>/dev/null

   
}

cacao_resolve_link () {
    l_source=$1
    target=`/bin/ls -ld "${l_source}" 2>/dev/null | /usr/bin/awk  '/^l/ {print $NF ; exit}'`
    if [ -n "${target}" ]
    then
	#if the link's target is not absolute (i.e ../../blu/bla)
	#resolve it before return
	case ${target} in
	    /*)
		;;
	    *)
	        #prepend dirname of te link 
		target=`/usr/bin/dirname ${l_source}`/${target}
		target=`cacao_clean_path ${target}`
		;;
	esac
	echo "${target}"
	return 0
    else
	echo "$1"
	return 1
    fi
}

cacao_get_base_dir () {
    current_exe_name=$1

    if [ -z "${current_exe_name}" ]
    then
	return 1
    fi

    our_cwd=`pwd 2>/dev/null`
    if [ $? -ne 0 ]
    then
	#something is really wrong
	return 1
    fi

    #first resolve relative path : not beginnig by '/'
    case ${current_exe_name} in
	/*) 
	    ;;
	*)
	   current_exe_name="${our_cwd}/${current_exe_name}"
	   ;;
    esac
    
    real_exe_file=`cacao_find_real_target ${current_exe_name}`
    
    #clean the path from any relative part
    real_exe_file=`cacao_clean_path ${real_exe_file}`
    
    real_exe_parent=`dirname ${real_exe_file}`
    
    echo ${real_exe_parent}
    
}

cacao_find_real_target () {
	link_to_resolve=$1

	status=0

	while [ ${status} -eq 0 ]
	do
		link_to_resolve=`cacao_resolve_link ${link_to_resolve}`
		status=$?		
	done
	
	echo ${link_to_resolve}
	return 0
}

cacao_set_files_mode () {

    target_path=$1
    file_mode=$2
    dir_mode=$3


    if [ -f "${target_path}" ]
    then
	${CHMOD} ${file_mode} ${target_path} 2>/dev/null
	if [ $? -ne 0 ]
        then
	    cacao_print_error_message "${CACAO_MSG_ERROR_FILE_MODE}" "${target_path}"
	    return ${CACAO_CR_ERROR}
	else
	    return ${CACAO_CR_SUCCESS}
        fi
    fi

    # set mode for all files
    for __i in `${FIND} ${target_path} -type f 2>/dev/null`
    do
        ${CHMOD} ${file_mode} ${__i} 2>/dev/null
        if [ $? -ne 0 ]
        then
	    cacao_print_error_message "${CACAO_MSG_ERROR_FILE_MODE}" "${__i}"
	    return ${CACAO_CR_ERROR}
        fi
    done

    # set mode for all directories
    for __i in `${FIND} ${target_path} -type d 2>/dev/null`
    do
        ${CHMOD} ${dir_mode} ${__i} 2>/dev/null
        if [ $? -ne 0 ]
        then
	    cacao_print_error_message "${CACAO_MSG_ERROR_FILE_MODE}" "${__i}"
	    return ${CACAO_CR_ERROR}
        fi
    done

    return ${CACAO_CR_SUCCESS}
}

#ensure current user ownership and rigths
cacao_tar_init_layout () {

    # set initial modes to prevent bad mode settings
    cacao_set_files_mode ${tar_rt_base_dir}/usr/share/man 444 755
    if [ $? -ne ${CACAO_CR_SUCCESS} ]
    then 
        return ${CACAO_CR_ERROR}
    fi

    cacao_set_files_mode ${tar_rt_base_dir}/usr/lib/cacao/bin 644 755
    if [ $? -ne ${CACAO_CR_SUCCESS} ]
    then 
        return ${CACAO_CR_ERROR}
    fi

    cacao_set_files_mode ${tar_rt_base_dir}/usr/lib/cacao/lib 444 755
    if [ $? -ne ${CACAO_CR_SUCCESS} ]
    then 
        return ${CACAO_CR_ERROR}
    fi

    cacao_set_files_mode ${tar_rt_base_dir}/usr/lib/cacao/lib 444 755
    if [ $? -ne ${CACAO_CR_SUCCESS} ]
    then 
        return ${CACAO_CR_ERROR}
    fi

    cacao_set_files_mode ${tar_rt_base_dir}/usr/lib/cacao/lib/tools 444 755
    if [ $? -ne ${CACAO_CR_SUCCESS} ]
    then 
        return ${CACAO_CR_ERROR}
    fi

    cacao_set_files_mode ${tar_rt_base_dir}/usr/lib/cacao/lib/tools/cacaocsc 04511 755
    if [ $? -ne ${CACAO_CR_SUCCESS} ]
    then 
        return ${CACAO_CR_ERROR}
    fi

    cacao_set_files_mode ${tar_rt_base_dir}/usr/lib/cacao/lib/tools/launch 555 755
    if [ $? -ne ${CACAO_CR_SUCCESS} ]
    then 
        return ${CACAO_CR_ERROR}
    fi

    cacao_set_files_mode ${tar_rt_base_dir}/usr/lib/cacao/lib/tools/suexec 511 755
    if [ $? -ne ${CACAO_CR_SUCCESS} ]
    then 
        return ${CACAO_CR_ERROR}
    fi

    cacao_set_files_mode ${tar_rt_base_dir}/usr/lib/cacao/ext 444 755
    if [ $? -ne ${CACAO_CR_SUCCESS} ]
    then 
        return ${CACAO_CR_ERROR}
    fi

    cacao_set_files_mode ${tar_rt_base_dir}/usr/lib/cacao/lib/tools/template/config 644 755
    if [ $? -ne ${CACAO_CR_SUCCESS} ]
    then 
        return ${CACAO_CR_ERROR}
    fi

    cacao_set_files_mode ${tar_rt_base_dir}/usr/lib/cacao/lib/tools/template/modules 644 755
    if [ $? -ne ${CACAO_CR_SUCCESS} ]
    then 
        return ${CACAO_CR_ERROR}
    fi

    cacao_set_files_mode ${tar_rt_base_dir}/usr/lib/cacao/lib/tools/template/startup 644 755
    if [ $? -ne ${CACAO_CR_SUCCESS} ]
    then 
        return ${CACAO_CR_ERROR}
    fi

    ${CHOWN} -R ${current_user_name}:${current_user_gname} ${tar_rt_base_dir} 2>/dev/null
    if [ $? -ne 0 ]
    then
	cacao_print_error_message "${CACAO_MSG_ERROR_FILE_ATTR}" "${current_user_name}" \
                                  "${current_user_gname}" "${tar_rt_base_dir}"
	return ${CACAO_CR_ERROR}
    fi

    if [ ${have_to_make_link} -eq ${CACAO_TRUE} ]
    then
        ${MKDIR} -p ${cacaoadm_home} 2>/dev/null
        if [ $? -ne 0 ]
        then
            cacao_print_error_message "${CACAO_MSG_ERROR_DIR_CREATE}" "${cacaoadm_home}"
            return ${CACAO_CR_ERROR}
        fi
        if [ ! -h ${cacaoadm} ]
        then
            ${LN} -s ../../${cacaoadm_cmd_sfx} ${cacaoadm} 2>/dev/null
            if [ $? -ne 0 ]
            then
            cacao_print_error_message "${CACAO_MSG_ERROR_FILE_LN}" \
                "${cacaoadm}" "../../${cacaoadm_cmd_sfx}"
            return ${CACAO_CR_ERROR}
            fi
        fi
    fi

    if [ ${have_to_keep_backward_compatibility} -eq ${CACAO_TRUE} ]
    then
        __cacaoadm_legacy_path="${tar_rt_base_dir}/cacao/bin"
        __cacaoadm_legacy_cmd="${__cacaoadm_legacy_path}/cacaoadm"
        if [ ! -d ${__cacaoadm_legacy_path} ]; then
            ${MKDIR} -p ${__cacaoadm_legacy_path} 2>/dev/null
            if [ $? -ne 0 ]
            then
                cacao_print_error_message "${CACAO_MSG_ERROR_DIR_CREATE}" "${__cacaoadm_legacy_path}"
                return ${CACAO_CR_ERROR}
            fi
            if [ ! -h ${__cacaoadm_legacy_cmd} ]
            then
                ${LN} -s ../../${cacaoadm_cmd_sfx} ${__cacaoadm_legacy_cmd} 2>/dev/null
                if [ $? -ne 0 ]
                then
                    cacao_print_error_message "${CACAO_MSG_ERROR_FILE_LN}" \
                        "${__cacaoadm_legacy_cmd}" "../../${cacaoadm_cmd_sfx}"
                    return ${CACAO_CR_ERROR}
                fi
            fi
        fi
    fi

    ${CHMOD} a+x ${cacaoadm} 2>/dev/null
    if [ $? -ne 0 ]
	then
	cacao_print_error_message "${CACAO_MSG_ERROR_FILE_MODE}" "${cacaoadm}"
	return ${CACAO_CR_ERROR}
    fi
    
    ${CHMOD} a+x ${private_home}/cacaocsc  2>/dev/null
    if [ $? -ne 0 ]
    then
	cacao_print_error_message "${CACAO_MSG_ERROR_FILE_MODE}" \
                                  "${private_home}/cacaocsc"
	return ${CACAO_CR_ERROR}
    fi
    ${CHMOD} u+s ${private_home}/cacaocsc  2>/dev/null
    if [ $? -ne 0 ]
    then
	cacao_print_error_message "${CACAO_MSG_ERROR_FILE_SUID}" \
                                  "${private_home}/cacaocsc"
	cacao_print_error_message "${CACAO_TARBALL_SUID_WARNING}" \
	                          "${current_user_name}" "${current_user_gname}"
	${CHMOD} u+x ${private_home}/cacaocsc  2>/dev/null
	if [ $? -ne 0 ]
	then
	    cacao_print_error_message "${CACAO_MSG_ERROR_FILE_MODE}" \
                                  "${private_home}/cacaocsc"
	    return ${CACAO_CR_ERROR}
	fi
    fi

    ${CHMOD} a+x ${private_home}/launch  2>/dev/null
    if [ $? -ne 0 ]
    then
	cacao_print_error_message "${CACAO_MSG_ERROR_FILE_MODE}" \
                                  "${private_home}/launch"
	return ${CACAO_CR_ERROR}
    fi
    
    ${CHMOD} a+x ${private_home}/suexec 2>/dev/null
    if [ $? -ne 0 ]
    then
	cacao_print_error_message "${CACAO_MSG_ERROR_FILE_MODE}" \
                                  "${private_home}/suexec"
	return ${CACAO_CR_ERROR}
    fi

    if [ ${have_sysunconfig} -eq ${CACAO_TRUE} ]
    then
	${CHMOD} a+x ${private_home}/sys-unconfig-cacao-instances 2>/dev/null
	if [ $? -ne 0 ]
	then
	    cacao_print_error_message "${CACAO_MSG_ERROR_FILE_MODE}" \
                "${private_home}/sys-unconfig-cacao-instances"
	    return ${CACAO_CR_ERROR}
	fi
    fi
    

    #  In HPUX execute library permissions has to be done
    if [ -f ${private_lib}/libcacao_cacao.sl ]
    then
        ${CHMOD} u+x ${private_lib}/libcacao_cacao.sl 2>/dev/null
        if [ $? -ne 0 ]
        then
            cacao_print_error_message "${CACAO_MSG_ERROR_FILE_MODE}" \
                                  "${private_lib}/libcacao_cacao.sl"
            return ${CACAO_CR_ERROR}
        fi
    fi

    # cacao_smf file installed only on Solaris platforms
    if [ -f ${private_home}/scripts/cacao_smf ]
    then
        ${CHMOD} u+x ${private_home}/scripts/cacao_smf 2>/dev/null
        if [ $? -ne 0 ]
	then
            cacao_print_error_message "${CACAO_MSG_ERROR_FILE_MODE}" \
                                      "${private_home}/scripts/cacao_smf"
            return ${CACAO_CR_ERROR}
        fi
    fi

    # cacao_smf_start file installed only on Solaris platforms
    if [ -f ${private_home}/scripts/cacao_smf_start ]
    then
        ${CHMOD} u+x ${private_home}/scripts/cacao_smf_start 2>/dev/null
        if [ $? -ne 0 ]
	then
            cacao_print_error_message "${CACAO_MSG_ERROR_FILE_MODE}" \
                "${private_home}/scripts/cacao_smf_start"
            return ${CACAO_CR_ERROR}
         fi
    fi

    #tarball's verify config won't be able to check all the wellknown module
    #repository : ensure it is well created
    
    ${MKDIR} -p ${wellknown_module_dir} 2>/dev/null
    if [ $? -ne 0 ]
    then
	cacao_print_error_message "${CACAO_MSG_ERROR_DIR_CREATE}" \
	    "${wellknown_module_dir}"
	return ${CACAO_CR_ERROR}
    fi
    
    ${CHMOD} -R ${CACAO_INSTANCE_DIR_MOD} ${wellknown_module_dir} 2>/dev/null
    if [ $? -ne 0 ]
    then
	cacao_print_error_message "${CACAO_MSG_ERROR_FILE_MODE}" \
                                  "${wellknown_module_dir}"
	return ${CACAO_CR_ERROR}
    fi

    # globals must be user writable to allow set property function
    ${CHMOD} u+w ${globals_file} 2>/dev/null
    if [ $? -ne 0 ]
    then
	cacao_print_error_message "${CACAO_MSG_ERROR_FILE_MODE}" \
                                  "${globals_file}"
	return ${CACAO_CR_ERROR}
    fi

    ${CHMOD} u+w ${globals_spec_file} 2>/dev/null
    if [ $? -ne 0 ]
    then
	cacao_print_error_message "${CACAO_MSG_ERROR_FILE_MODE}" \
                                  "${globals_spec_file}"
	return ${CACAO_CR_ERROR}
    fi

    return ${CACAO_CR_SUCCESS}
}

cacao_tar_init() {
    tar_rt_base_dir=`cacao_get_base_dir ${tar_cmd_line}`
    if [ -z "${tar_rt_base_dir}" ]
    then
	echo "cannot get the common agent container base directory"
	return 1
    fi
    
    cacaoadm_cmd_sfx=usr/lib/cacao/bin//cacaoadm
    cacaoadm_cmd=${tar_rt_base_dir}/${cacaoadm_cmd_sfx}
    helpers_home=${tar_rt_base_dir}/usr/lib/cacao/lib/tools/scripts
    template_home=${tar_rt_base_dir}/usr/lib/cacao/lib/tools/template
    private_home=${tar_rt_base_dir}/usr/lib/cacao/lib/tools
    private_lib=${tar_rt_base_dir}/usr/lib/cacao/private/lib
    
    messages_catalog=${helpers_home}/messages.cfg
    error_codes=${helpers_home}/error_codes.cfg
    cmd_defs=${helpers_home}/commands_definition.cfg
    globals_file=${helpers_home}/globals.cfg
    globals_spec_file=${helpers_home}/globals_specific.cfg
    helpers=${helpers_home}/helpers
    helpers_spec=${helpers_home}/helpers_specific
    utils=${helpers_home}/utils
    
    return 0
}


cacao_tar_update_files() {
    #update templates

    cacao_prop_template=${template_home}/config/private/cacao.properties

    cacao_set_property_to_file ${cacao_prop_template} "${CACAO_INSTALL_NONROOT_KEY}" ${CACAO_TRUE_VALUE}
    if [ $? -ne ${CACAO_CR_SUCCESS} ]
    then
	cacao_print_error_message "${CACAO_MSG_ERROR_PROPERTY_SET}" "${CACAO_INSTALL_NONROOT_KEY}"
	return ${CACAO_CR_ERROR}
    fi

    cacao_set_property_to_file ${cacao_prop_template} "${CACAO_PROCESS_USERNAME_KEY}" ${current_user_name}
    if [ $? -ne ${CACAO_CR_SUCCESS} ]
    then
	cacao_print_error_message "${CACAO_MSG_ERROR_PROPERTY_SET}" "${CACAO_PROCESS_USERNAME_KEY}"
	return ${CACAO_CR_ERROR}
    fi

    cacao_set_property_to_file ${cacao_prop_template} "${CACAO_PROCESS_GROUPNAME_KEY}" ${current_user_gname}
    if [ $? -ne ${CACAO_CR_SUCCESS} ]
    then
	cacao_print_error_message "${CACAO_MSG_ERROR_PROPERTY_SET}" "${CACAO_PROCESS_GROUPNAME_KEY}"
	return ${CACAO_CR_ERROR}
    fi

    cacao_set_property_to_file ${globals_file} "CACAO_ADMIN_USER" ${current_user_name}
    if [ $? -ne ${CACAO_CR_SUCCESS} ]
    then
	cacao_print_error_message "${CACAO_MSG_ERROR_PROPERTY_SET}" "CACAO_ADMIN_USER"
	return ${CACAO_CR_ERROR}
    fi
    cacao_set_property_to_file ${globals_file} "CACAO_ADMIN_UID" ${current_user_id}
    if [ $? -ne ${CACAO_CR_SUCCESS} ]
    then
	cacao_print_error_message "${CACAO_MSG_ERROR_PROPERTY_SET}" "CACAO_ADMIN_UID"
	return ${CACAO_CR_ERROR}
    fi

    cacao_set_property_to_file ${globals_spec_file} "CACAO_ADMIN_GROUP" ${current_user_gname}
    if [ $? -ne ${CACAO_CR_SUCCESS} ]
    then
	cacao_print_error_message "${CACAO_MSG_ERROR_PROPERTY_SET}" "CACAO_ADMIN_UID"
	return ${CACAO_CR_ERROR}
    fi
    cacao_set_property_to_file ${globals_spec_file} "CACAO_SECURITY_FILE_OWNER_GROUP" ${current_user_gname}
    if [ $? -ne ${CACAO_CR_SUCCESS} ]
    then
	cacao_print_error_message "${CACAO_MSG_ERROR_PROPERTY_SET}" "CACAO_SECURITY_FILE_OWNER_GROUP"
	return ${CACAO_CR_ERROR}
    fi

    cacao_set_property_to_file ${globals_file} "CACAO_SECURITY_FILE_OWNER_USER" ${current_user_name}
    if [ $? -ne ${CACAO_CR_SUCCESS} ]
    then
	cacao_print_error_message "${CACAO_MSG_ERROR_PROPERTY_SET}" "CACAO_SECURITY_FILE_OWNER_USER"
	return ${CACAO_CR_ERROR}
    fi
    
    return ${CACAO_CR_SUCCESS}
}

tar_cmd_line=$0

cacao_tar_init
if [ $? -ne 0 ]
then
    exit 1
fi

if [ -f ${tar_rt_base_dir}/.configured ]
then
    #nothing to be done
    exit 0
fi

cacao_tmp_dir=/tmp

. ${messages_catalog}
. ${error_codes}
. ${globals_file}
. ${cmd_defs}
. ${helpers}
. ${helpers_spec}
. ${utils}

current_user_id=`cacao_get_user_id`
current_user_name=`cacao_get_user_id_name`
current_user_gname=`cacao_get_user_gid_name`

current_os=`uname -s  | tr "[a-z]" "[A-Z]" 2>/dev/null`
if [ x${current_os} = x ]
then
    echo "cannot get current OS name."
    exit ${CACAO_CR_ERROR}
fi 

if [ ${current_os} = "SUNOS" ]
then
    cacaoadm_home=${tar_rt_base_dir}/usr/sbin/
    cacaoadm=${cacaoadm_home}/cacaoadm
    have_to_make_link=${CACAO_TRUE}
    have_sysunconfig=${CACAO_TRUE}
    have_to_keep_backward_compatibility=${CACAO_FALSE}
else
    cacaoadm=${cacaoadm_cmd}
    cacaoadm_home=`dirname ${cacaoadm}`
    have_to_make_link=${CACAO_FALSE}
    have_sysunconfig=${CACAO_FALSE}
    have_to_keep_backward_compatibility=${CACAO_TRUE}
fi

wellknown_module_dir=${tar_rt_base_dir}//etc/cacao/instances/default/modules/

cacao_tar_init_layout
if [ $? -ne ${CACAO_CR_SUCCESS} ]    
then
    cacao_print_error_message "${CACAO_INIT_FAILED}"
    exit ${CACAO_CR_ERROR}
fi

cacao_tar_update_files
if [ $? -ne ${CACAO_CR_SUCCESS} ]    
then
    cacao_print_error_message "${CACAO_INIT_FAILED}"
    exit ${CACAO_CR_ERROR}
fi

cacao_print_message "${CACAO_TARBALL_SETUP_OK}" "${current_user_name}" "${current_user_gname}"

${TOUCH} ${tar_rt_base_dir}/.configured 2>/dev/null

exit ${CACAO_CR_SUCCESS}
