HEX
Server: Apache/2.4.34 (Red Hat) OpenSSL/1.0.2k-fips
System: Linux WORDPRESS 3.10.0-1160.118.1.el7.x86_64 #1 SMP Thu Apr 4 03:33:23 EDT 2024 x86_64
User: digital (1020)
PHP: 7.2.24
Disabled: NONE
Upload Files
File: //usr/openv/pdde/pdag/scripts/pddeupgrade.sh
#!/bin/sh
###############################################################################
# The pddeupgrade script performs upgrades on the PDDE storage
###############################################################################
# Copyright (C) 2015 Symantec
# All Rights Reserved
#
# THIS SOURCE CODE IS AN UNPUBLISHED PROPRIETARY TRADE SECRET OF
# Symantec
#
# The copyright notice above does not evidence any actual or intendent
# publication of such source code.
#
###############################################################################

INSTALL_PATH="/usr/openv/pdde"
OSTPLUGINS_PATH="/usr/openv/lib/ost-plugins"
PDCFG="${INSTALL_PATH}/pdag/bin/pdcfg"
STCONV="${INSTALL_PATH}/pdcr/bin/stconv"
BACKUP_DATE=`date +%F_%H:%M:%S`
TIMESTAMP=`date +%F_%H:%M`
LOGDIR="/var/log/puredisk"
if [ ! -d "${LOGDIR}" ] ; then
    mkdir -p ${LOGDIR}
fi
LOGFILE=${LOGDIR}/${TIMESTAMP}-pddeupgrade.log

# Remove group and world writable permissions
umask 0022

if [ $# -gt 0 ] ; then
    INSTALL_TYPE=$1
    case "$1" in
        'all')
            INSTALL_TYPE="all"
        ;;
        'agent')
            INSTALL_TYPE="agent"
        ;;
        'server')
            INSTALL_TYPE="server"
        ;;
        *)
            INSTALL_TYPE="help"
        ;;
    esac
else
    INSTALL_TYPE="all"
fi

if [ "${INSTALL_TYPE}" = "help" ] ; then
    echo "$0: Upgades the PDDE configuration to the current installed version."
    echo "Usage: $0 [agent|server]"
    echo "Options:"
    echo "    all        Upgrade both agent and server components (default)"
    echo "    agent      Upgrade agent components only"
    echo "    server     Upgrade server components only"
    exit 0
fi

###############################################################################
# Helper function that uses pdcfg to modify config files
#     Parameters:
#         1: The config file to change (required)
#         2: The template config file to fetch default values from (optional, use "")
#         3: The section in the config file
#         4: The option in the config file
#         5: The value to use in the config file
#         6: 1 means always write, 0 means do not overwrite current value
###############################################################################
Set_Cfg_Parameter()
{
    CONFIG_FILE=${1}     # Required
    DEF_CONFIG_FILE=${2} # Optional: "" means don't check template for default value
    CFG_SECTION=${3}     # Required
    CFG_OPTION=${4}      # Required
    CFG_VALUE=${5}       # Required
    OVERWRITE=${6}       # Required: 0: Do not overwrite if parameter is present
                         #           1: Change whatever value is present to $CFG_VALUE

    if [ "X${DEF_CONFIG_FILE}" != "X" -a -f "${DEF_CONFIG_FILE}" ]; then
        TEMP="`${PDCFG} --read=${DEF_CONFIG_FILE} --section=${CFG_SECTION} --option=${CFG_OPTION}`"
        if [ "X$TEMP" = "X" ]; then
            echo "Warning, could not read [${CFG_SECTION}]${CFG_OPTION} from ${DEF_CONFIG_FILE}, using default value ${CFG_VALUE} instead"
        elif [ "$TEMP" != "$CFG_VALUE" ]; then
            echo "Warning, the specified [${CFG_SECTION}]${CFG_OPTION} is different with the default value in ${DEF_CONFIG_FILE}"
        fi
    fi

    if [ -f "${CONFIG_FILE}" ]; then
        SETVALUE=1
        if [ "${OVERWRITE}" -ne "1" ] ; then
            TEMP=`${PDCFG} --read="${CONFIG_FILE}" --section=${CFG_SECTION} --option=${CFG_OPTION} 2>/dev/null`
            if [ "X$TEMP" != "X" ]; then
                SETVALUE=0
                echo "[${CFG_SECTION}]${CFG_OPTION} already exists in ${CONFIG_FILE} (value: ${TEMP}).  Skipping..."
            fi
        fi
        if [ ${SETVALUE} -eq 1 ]; then
            echo "Updating ${CONFIG_FILE}: [${CFG_SECTION}]${CFG_OPTION} = ${CFG_VALUE}"
            ${PDCFG} --write="${CONFIG_FILE}" --section=${CFG_SECTION} --option=${CFG_OPTION} --value="${CFG_VALUE}"
            if [ $? -ne 0 ] ; then
                echo "Failed to upgrade [${CFG_SECTION}]${CFG_OPTION} to ${CONFIG_FILE}"
            fi
        fi
        if [ -f "${DEF_CONFIG_FILE}" ]; then
            ${PDCFG} --write="${CONFIG_FILE}" --section=${CFG_SECTION} --option=${CFG_OPTION} --commentfile="${DEF_CONFIG_FILE}"
        fi
    else
        echo "Warning, could not locate ${CONFIG_FILE}"
    fi
}

Deprecate_Parameter()
{
    CONFIG_FILE=${1}
    CFG_SECTION=${2}
    CFG_OPTION=${3}
    echo "Deprecate [${CFG_SECTION}]${CFG_OPTION}"
    ${PDCFG} --write="${CONFIG_FILE}" --section=${CFG_SECTION} --option=${CFG_OPTION} --clear-comment >/dev/null 2>&1
    ${PDCFG} --write="${CONFIG_FILE}" --section=${CFG_SECTION} --option=${CFG_OPTION} --add-comment=" Deprecated" >/dev/null 2>&1
}

Check_Generate_Identity()
{
    if [ "X${DATA_PATH}" != "X" ] ; then
        echo "Found data path: ${DATA_PATH}"

        if [ -d "${DATA_PATH}" ] ; then
            echo "Checking for .identity file"

            if [ -f "${DATA_PATH}/.identity" ] ; then
                echo ".identity file exists, no action needed"
            else
                echo "Attempting to run spoold --genidentity"
                ${INSTALL_PATH}/pdcr/bin/spoold --genidentity -v --trace "${LOG_PATH}/spoold/genidentity.log"
                if [ $? -ne 0 ] ; then
                    echo "spoold --genidentity failed"
                else
                    echo "spoold --genidentity was successful"
                fi
            fi
        fi
    fi
}

###############################################################################
# Helper function that modifies pd.conf
#     Parameters:
#         1: The name of the config parameter to change (required)
#         2: The value to use for this parameter (required)
###############################################################################
Set_Pd_Conf_Parameter()
{
    PARAMVAL="$1 = $2"
    sed -e "s/$1.*/${PARAMVAL}/g" ${OSTPLUGINS_PATH}/pd.conf > ${OSTPLUGINS_PATH}/pd.conf.tmp
    mv -f ${OSTPLUGINS_PATH}/pd.conf.tmp ${OSTPLUGINS_PATH}/pd.conf
    chmod o-w ${OSTPLUGINS_PATH}/pd.conf
}

Upgrade_Pd_Conf()
{
    PD_CONF_PATH=${1}

    PD_CONF_ENTRY_CHECK=`grep "FIBRECHANNEL" ${PD_CONF_PATH}`
    if [ "$?" -ne "0" ]; then
        echo "#" >> ${PD_CONF_PATH}
        echo "# Enable FC Transportation (0=disable, 1=enable)" >> ${PD_CONF_PATH}
        echo "FIBRECHANNEL = 0" >> ${PD_CONF_PATH}
    else
        echo "FIBRECHANNEL already in pd.conf"
    fi

    PD_CONF_ENTRY_CHECK=`grep "FILE_KEEP_ALIVE_INTERVAL" ${PD_CONF_PATH}`
    if [ "$?" -ne "0" ]; then
        echo "#" >> ${PD_CONF_PATH}
        echo "# Interval (seconds) that specifies how often we should perform a keep-alive" >> ${PD_CONF_PATH}
        echo "# on idle sockets.  By default, the plugin will attempt to determine a suitable" >> ${PD_CONF_PATH}
        echo "# value based on network resiliency settings." >> ${PD_CONF_PATH}
        echo "# Allowed values: 60-7200 seconds. 0 = disabled" >> ${PD_CONF_PATH}
        echo "# FILE_KEEP_ALIVE_INTERVAL=1440" >> ${PD_CONF_PATH}
    else
        echo "FILE_KEEP_ALIVE_INTERVAL already in pd.conf"
    fi

    PD_CONF_ENTRY_CHECK=`grep "FP_CACHE_LOCAL" ${PD_CONF_PATH}`
    if [ "$?" -ne "0" ]; then
        echo "#" >> ${PD_CONF_PATH}
        echo "# Load fingerprint cache if on local storage server (0=Off, 1=On)" >> ${PD_CONF_PATH}
        echo "FP_CACHE_LOCAL = 1" >> ${PD_CONF_PATH}
    else
        echo "Updating pd.conf with value 1 for parameter FP_CACHE_LOCAL"
        Set_Pd_Conf_Parameter FP_CACHE_LOCAL 1
    fi

    PD_CONF_ENTRY_CHECK=`grep "FP_CACHE_PERIOD_REBASING_THRESHOLD" ${PD_CONF_PATH}`
    if [ "$?" -ne "0" ]; then
        echo "#" >> ${PD_CONF_PATH}
        echo "# Period client side rebasing threshold (MB)." >> ${PD_CONF_PATH}
        echo "# The period client side rebasing will run each period, and it works same with client side " >> ${PD_CONF_PATH}
        echo "# rebasing except period client side rebasing using large threshold" >> ${PD_CONF_PATH}
        echo "# Allowed values: 0-50 MB. 0 = disabled" >> ${PD_CONF_PATH}
        echo "FP_CACHE_PERIOD_REBASING_THRESHOLD = 16" >> ${PD_CONF_PATH}
    else
        echo "Updating pd.conf with value 16 for parameter FP_CACHE_PERIOD_REBASING_THRESHOLD"
        Set_Pd_Conf_Parameter FP_CACHE_PERIOD_REBASING_THRESHOLD 16
    fi

    PD_CONF_ENTRY_CHECK=`grep "FP_CACHE_REBASING_THRESHOLD" ${PD_CONF_PATH}`
    if [ "$?" -ne "0" ]; then
        echo "#" >> ${PD_CONF_PATH}
        echo "# Client side rebasing threshold (MB), when image data in container less than the threshold," >> ${PD_CONF_PATH}
        echo "# all of the image data in this container will be resent to server to achieve good locality" >> ${PD_CONF_PATH}
        echo "# Allowed values: 0-50 MB. 0 = disabled" >> ${PD_CONF_PATH}
        echo "FP_CACHE_REBASING_THRESHOLD = 4" >> ${PD_CONF_PATH}
    else
        echo "Updating pd.conf with value 4 for parameter FP_CACHE_REBASING_THRESHOLD"
        Set_Pd_Conf_Parameter FP_CACHE_REBASING_THRESHOLD 4
    fi

    PD_CONF_ENTRY_CHECK=`grep "MAX_LOG_MBSIZE" ${PD_CONF_PATH}`
    if [ "$?" -ne "0" ]; then
        echo "#" >> ${PD_CONF_PATH}
        echo "# Debug Log File Max Size (MB, 1-2048)" >> ${PD_CONF_PATH}
        echo "MAX_LOG_MBSIZE = 100" >> ${PD_CONF_PATH}
    else
        echo "Updating pd.conf with value 100 for parameter MAX_LOG_MBSIZE"
        Set_Pd_Conf_Parameter MAX_LOG_MBSIZE 100
    fi

    PD_CONF_ENTRY_CHECK=`grep "META_SEGKSIZE" ${PD_CONF_PATH}`
    if [ "$?" -ne "0" ]; then
        echo "#" >> ${PD_CONF_PATH}
        echo "# Segment size for meta data streams (KB)" >>  ${PD_CONF_PATH}
        echo "# Size must be a multiple of 32 and fall in the range 32-16384" >>  ${PD_CONF_PATH}
        echo "META_SEGKSIZE = 16384" >> ${PD_CONF_PATH}
    else
        echo "META_SEGKSIZE already in pd.conf"
    fi

    PD_CONF_ENTRY_CHECK=`grep "MTSTRM_BACKUP_CLIENTS" ${PD_CONF_PATH}`
    if [ "$?" -ne "0" ]; then
        echo "#" >> ${PD_CONF_PATH}
        echo "# If set, limits backups using the multi-threaded agent to specified clients" >> ${PD_CONF_PATH}
        echo "# Format is a comma-separated list of clients, treated as case insensitive" >> ${PD_CONF_PATH}
        echo "# MTSTRM_BACKUP_CLIENTS = client1,client2,client3" >> ${PD_CONF_PATH}
    else
        echo "MTSTRM_BACKUP_CLIENTS already in pd.conf" | tee -a ${LOGFILE}
    fi

    PD_CONF_ENTRY_CHECK=`grep "MTSTRM_BACKUP_ENABLED" ${PD_CONF_PATH}`
    if [ "$?" -ne "0" ]; then
        echo "#" >> ${PD_CONF_PATH}
        echo "# Run backups through the multi-threaded streaming agent (1=On, 0=Off)" >> ${PD_CONF_PATH}
        echo "MTSTRM_BACKUP_ENABLED = 0" >> ${PD_CONF_PATH}
    else
        echo "MTSTRM_BACKUP_ENABLED already in pd.conf" | tee -a ${LOGFILE}
    fi

    PD_CONF_ENTRY_CHECK=`grep "MTSTRM_BACKUP_POLICIES" ${PD_CONF_PATH}`
    if [ "$?" -ne "0" ]; then
        echo "#" >> ${PD_CONF_PATH}
        echo "# If set, limits backups using the multi-threaded agent to specified policies" >> ${PD_CONF_PATH}
        echo "# Format is a comma-separated list of policy names, treated as case sensitive" >> ${PD_CONF_PATH}
        echo "# MTSTRM_BACKUP_POLICIES = policy1,policy2,policy3" >> ${PD_CONF_PATH}
    else
        echo "MTSTRM_BACKUP_POLICIES already in pd.conf" | tee -a ${LOGFILE}
    fi

    PD_CONF_ENTRY_CHECK=`grep "MTSTRM_IPC_TIMEOUT" ${PD_CONF_PATH}`
    if [ "$?" -ne "0" ]; then
        echo "#" >> ${PD_CONF_PATH}
        echo "# Number of seconds to wait for responses from the multi-threaded streaming process before timing out with an error" >> ${PD_CONF_PATH}
        echo "# Values:  1-86400" >> ${PD_CONF_PATH}
        echo "MTSTRM_IPC_TIMEOUT = 1200" >> ${PD_CONF_PATH}
    else
        echo "MTSTRM_IPC_TIMEOUT already in pd.conf"
    fi

    PD_CONF_ENTRY_CHECK=`grep "PREFETCH_SIZE" ${PD_CONF_PATH}`
    if [ "$?" -ne "0" ]; then
        echo "#" >> ${PD_CONF_PATH}
        echo "# Buffer size to use when prefetching data for restore operations" >>  ${PD_CONF_PATH}
        echo "PREFETCH_SIZE = 33554432" >> ${PD_CONF_PATH}
    else
        echo "PREFETCH_SIZE already in pd.conf"
    fi

    PD_CONF_ENTRY_CHECK=`grep "RESTORE_DECRYPT_LOCAL" ${PD_CONF_PATH}`
    if [ "$?" -ne "0" ]; then
        echo "#" >> ${PD_CONF_PATH}
        echo "# Agent side decryption and decompression on restore (0=off, 1=on)" >> ${PD_CONF_PATH}
        echo "RESTORE_DECRYPT_LOCAL = 1" >> ${PD_CONF_PATH}
    else
        echo "Updating pd.conf with value 1 for parameter RESTORE_DECRYPT_LOCAL"
        Set_Pd_Conf_Parameter RESTORE_DECRYPT_LOCAL 1
    fi
}

Set_Recommended_Mtstrm_Config_Values()
{
    # Save IFS
    OLDIFS=$IFS
    IFS=","

    MTSTRMCTL="${INSTALL_PATH}/pdag/bin/mtstrmctl"

    if [ ! -f ${MTSTRMCTL} ]; then
        echo "${MTSTRMCTL} not found, skipping generation of recommended settings for mtstrm.conf and pd.conf"
    else
        TMPFILE="${OSTPLUGINS_PATH}/mtstrmctl_output.csv"
        MTSTRMCONF_PATH="${OSTPLUGINS_PATH}/mtstrm.conf"

        echo "Running the mtstrmctl utility to generate recommended settings for ${MTSTRMCONF_PATH}"
        ${MTSTRMCTL} --get-recommended-settings ${TMPFILE}

        if [ "$?" -eq "0" ]; then
            echo "Parsing ${TMPFILE}"
            if [ ! -f ${TMPFILE} ]; then
                echo "${TMPFILE} not found, default values will be used instead"
            else
                echo "$TMPFILE found, reading.."
                while read filename section param value
                do
                    if [ "$filename" = "mtstrm.conf" ]; then
                        echo "Updating $filename with value $value for parameter $param in section $section"
                        Set_Cfg_Parameter ${MTSTRMCONF_PATH} "" ${section} ${param} ${value} 1
                    elif [ "$filename" = "pd.conf" ]; then
                        echo "Updating $filename with value $value for parameter $param"
                        Set_Pd_Conf_Parameter $param $value
                    else
                        echo "Invalid filename $filename. Can only update mtstrm.conf and pd.conf"
                    fi
                done < $TMPFILE

                # Remove the tmp file
                rm $TMPFILE > /dev/null 2>&1
            fi
        else
            echo "mtstrmctl failed to generate recommended settings for ${MTSTRMCONF_PATH}, default values will be used instead"
        fi
    fi

    # Revert to the original state
    IFS=$OLDIFS
}

###############################################################################
# Start of upgrade code!
###############################################################################
echo "Checking to see if the PDDE configuration needs upgrading"

if [ ! -x "${PDCFG}" ] ; then
    echo "Unable to use ${PDCFG}, which is required by this script."
    echo "Is the PDDE agent package installed?"
    exit 1
fi

# Server components
if [ "${INSTALL_TYPE}" = "all" -o "${INSTALL_TYPE}" = "server" -a -f /etc/pdregistry.cfg ] ; then
    AGENT_CFG_PATH=`${PDCFG} --read /etc/pdregistry.cfg --section="Symantec/PureDisk/Agent" --option=configfilepath 2> /dev/null`
    SPA_CFG_PATH=`${PDCFG} --read /etc/pdregistry.cfg --section="Symantec/PureDisk/StoragePoolAuthority" --option=configfilepath 2> /dev/null`
    CR_CFG_PATH=`${PDCFG} --read /etc/pdregistry.cfg --section="Symantec/PureDisk/ContentRouter" --option=configfilepath 2> /dev/null`
    AGENT_CFG_TEMPLATE_PATH="$INSTALL_PATH/pdcr/etc/agent.cfg"
    CR_CFG_TEMPLATE_PATH="$INSTALL_PATH/pdcr/etc/contentrouter.cfg"
    DATA_PATH=`${PDCFG} --read="${CR_CFG_PATH}" --section=StorageDaemon --option=Storage`
    DATABASES_PATH=`${PDCFG} --read="${SPA_CFG_PATH}" --section=StorageDatabase --option=Path 2> /dev/null`
    HISTORY_PATH="`${PDCFG} --read="${CR_CFG_PATH}" --section=StorageDaemon --option=HistoryPath`"
    LOG_PATH=`${PDCFG} --read="${CR_CFG_PATH}" --section=Logging --option=LogPath`
    STORAGE_PATH=`${PDCFG} --read="${SPA_CFG_PATH}" --section=Paths --option=Storage`

    # contentrouter.cfg
    if [ "X${CR_CFG_PATH}" != "X" ] ; then
        if [ -f "${CR_CFG_PATH}" ] ; then
            echo "Found content router config file.  Checking for upgrades..."
            cp "${CR_CFG_PATH}" "${CR_CFG_PATH}.${BACKUP_DATE}" > /dev/null 2>&1

            Check_Generate_Identity

            Deprecate_Parameter "${CR_CFG_PATH}"                       Cache CacheLoadThreadNum
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH Cache CachePartitionNum "64" 0
            Deprecate_Parameter "${CR_CFG_PATH}"                       ContentRouter BatchCommitInterval
            Deprecate_Parameter "${CR_CFG_PATH}"                       ContentRouter BatchCommitMinTasks
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH ContentRouter FPDCIDMemCacheSize "500" 0
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH ContentRouter MaxDoSize "1024MiB" 1
            Deprecate_Parameter "${CR_CFG_PATH}"                       ContentRouter RecoverCRDB
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH ContentRouter WorkerThreads "128" 1
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH CRDataStore CheckStoreBusyInterval "20" 0
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH CRDataStore CompactBatchNum "400" 1
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH CRDataStore CompactFreeSpaceThreshold "10%" 0
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH CRDataStore CompactLBound "16Mib" 1
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH CRDataStore CompactSizeLBound "32Mib" 1
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH CRDataStore CompactThreshold "80%" 0
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH CRDataStore DCHeaderHashSize "500000" 0
            Deprecate_Parameter "${CR_CFG_PATH}"                       CRDataStore DeleteSpaceThreshold
            Deprecate_Parameter "${CR_CFG_PATH}"                       CRDataStore DelUpdateThreshold
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH CRDataStore EnableCompactCandidateCheck "true" 0
            Deprecate_Parameter "${CR_CFG_PATH}"                       CRDataStore EnableContainerTruncate
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH CRDataStore LoadAllContainers "true" 0
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH CRDataStore LoadBalanceAlgorithm "1" 0
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH CRDataStore LoadBalanceInterval "86400" 0
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH CRDataStore MaxBufSize "32Mib" 1
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH CRDataStore MaxFileSize "64Mib" 1
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH CRDataStore MaxNumCaches "1024" 1
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH CRDataStore MaxNumRecvBufs "8" 1
            Deprecate_Parameter "${CR_CFG_PATH}"                       CRDataStore PercentFromDSToFS
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH CRDataStore PersistSourceMapInterval "3600" 0
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH CRDataStore PrefetchThreadNum "8" 1
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH CRDataStore ReadBufferSize "4194304" 1
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH CRDataStore RebaseMaxPercentage "5" 0
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH CRDataStore RebaseMaxTime "60" 1
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH CRDataStore RebaseMinContainers "20" 1
            Deprecate_Parameter "${CR_CFG_PATH}"                       CRDataStore RebaseQuota
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH CRDataStore RebaseScatterThreshold "1MiB" 1
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH CRDataStore RebaseLocalityThreshold "120" 1
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH CRDataStore SampledCheckCRC "false" 0
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH CRDataStore UseDirectIO "true" 0
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH CRDataStore WriteBufferSize "2097152" 1
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH CRDataStore WriteThreadNum "2" 1
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH DataCheck CRCCheckBatchNum "20" 0
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH DataCheck CRCCheckSleepSeconds "20" 1
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH DataCheck EnableCRCCheck "true" 0
            Deprecate_Parameter "${CR_CFG_PATH}"                       DataCheck EnableDataCheckWarningAlert
            Deprecate_Parameter "${CR_CFG_PATH}"                       DataCheck EnableDCHeaderCheck
            Deprecate_Parameter "${CR_CFG_PATH}"                       DataCheck GarbageCheckRemainDCCount
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH DataCheck ShutdownCRWhenError "false" 0
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH Logging HistoryAge "180" 0
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH Logging Retention "90" 0
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH ReferenceDatabase LockPoolSize "102400" 1
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH ReferenceDatabase MaxDCRefCount "2000" 0
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH Spooler LowSpaceThreshold "4%" 0
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH Spooler NumSpoolerContext "64" 0
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH Spooler Timeout "60" 1
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH Spooler VeryLowSpaceThreshold "3%" 0
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH Spooler WarningSpaceThreshold "5%" 0
            Set_Cfg_Parameter   "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH StorageDaemon CRQPBatchRefOpCount "40000000" 0
            Deprecate_Parameter "${CR_CFG_PATH}"                       StorageDaemon DelLogMaxNum
            Deprecate_Parameter "${CR_CFG_PATH}"                       StorageDaemon DelLogMaxSize
            Deprecate_Parameter "${CR_CFG_PATH}"                       StorageDaemon DelLogPath
            Deprecate_Parameter "${CR_CFG_PATH}"                       StorageDaemon MaxReservedSize
            Deprecate_Parameter "${CR_CFG_PATH}"                       StorageDaemon ObjectsPartitions
            Deprecate_Parameter "${CR_CFG_PATH}"                       StorageDaemon SortThreads
            Deprecate_Parameter "${CR_CFG_PATH}"                       StorageLeakCheck CheckExpirationDays
            Deprecate_Parameter "${CR_CFG_PATH}"                       StorageLeakCheck EnableStorageLeakCheck
            Deprecate_Parameter "${CR_CFG_PATH}"                       StorageLeakCheck StorageLeakCheckInterval

            # ServerOptions: Add "verify_so_references" if it's not there
            SERVER_OPTIONS=`${PDCFG} --read="${CR_CFG_PATH}" --section="ContentRouter" --option="ServerOptions" 2> /dev/null`
            echo $SERVER_OPTIONS | grep verify_so_references > /dev/null 2>&1
            if [ $? -ne 0 ] ; then
                Set_Cfg_Parameter "${CR_CFG_PATH}" $CR_CFG_TEMPLATE_PATH ContentRouter ServerOptions "verify_so_references,$SERVER_OPTIONS" 1
            fi

            cmp -s "${CR_CFG_PATH}" "${CR_CFG_PATH}.${BACKUP_DATE}" > /dev/null 2>&1
            if [ $? -eq 0 ] ; then
                rm "${CR_CFG_PATH}.${BACKUP_DATE}" > /dev/null 2>&1
            fi
            chmod o-w "${CR_CFG_PATH}"
        else
            echo "WARN: Missing content router config file! Path found from pdregistry.cfg: ${CR_CFG_PATH}"
        fi
    fi

    # spa.cfg
    if [ "X${SPA_CFG_PATH}" != "X" ] ; then
        if [ -f "${SPA_CFG_PATH}" ] ; then
            echo "Found SPA config file.  Checking for upgrades..."
            cp "${SPA_CFG_PATH}" "${SPA_CFG_PATH}.${BACKUP_DATE}" > /dev/null 2>&1

            Set_Cfg_Parameter   "${SPA_CFG_PATH}" "" DataCheck DataCheckDays "14" 1
            Set_Cfg_Parameter   "${SPA_CFG_PATH}" "" DataCheck DataCheckStartTime "20:00" 0
            Set_Cfg_Parameter   "${SPA_CFG_PATH}" "" DataCheck EnableDataCheck "true" 0
            Set_Cfg_Parameter   "${SPA_CFG_PATH}" "" DataCheck EnableDataCheckAlert "true" 0
            Set_Cfg_Parameter   "${SPA_CFG_PATH}" "" DataCheck EnableRecentBackupCheck "true" 0
            Set_Cfg_Parameter   "${SPA_CFG_PATH}" "" Events AgeLimit "0" 0
            Set_Cfg_Parameter   "${SPA_CFG_PATH}" "" Events CountLimit "50000" 1
            Set_Cfg_Parameter   "${SPA_CFG_PATH}" "" Events TlogFileWarningAge "14" 0
            Set_Cfg_Parameter   "${SPA_CFG_PATH}" "" Logging HistoryAge "30" 0
            Set_Cfg_Parameter   "${SPA_CFG_PATH}" "" Logging HistoryPath "${HISTORY_PATH}" 0
            Set_Cfg_Parameter   "${SPA_CFG_PATH}" "" Logging Retention "90" 0
            Set_Cfg_Parameter   "${SPA_CFG_PATH}" "" StorageDatabase CatalogBackupVersions "5" 0
            Set_Cfg_Parameter   "${SPA_CFG_PATH}" "" StorageDatabase CatalogShadowPath "${DATABASES_PATH}/catalogshadow" 0
            Set_Cfg_Parameter   "${SPA_CFG_PATH}" "" StorageDatabase CatalogShadowPoolSize "64" 0
            Set_Cfg_Parameter   "${SPA_CFG_PATH}" "" StorageDatabase EnableCatalogAutoRecover "true" 0

            cmp -s "${SPA_CFG_PATH}" "${SPA_CFG_PATH}.${BACKUP_DATE}" > /dev/null 2>&1
            if [ $? -eq 0 ] ; then
                rm "${SPA_CFG_PATH}.${BACKUP_DATE}" > /dev/null 2>&1
            fi
            chmod o-w "${SPA_CFG_PATH}"
        else
            echo "WARN: Missing SPA config file! Path found from pdregistry.cfg: ${SPA_CFG_PATH}"
        fi
    fi

    # agent.cfg
    if [ "X${AGENT_CFG_PATH}" != "X" ] ; then
        if [ -f "${AGENT_CFG_PATH}" ] ; then
            echo "Found agent config file.  Checking for upgrades..."
            cp "${AGENT_CFG_PATH}" "${AGENT_CFG_PATH}.${BACKUP_DATE}" > /dev/null 2>&1

            Set_Cfg_Parameter   "${AGENT_CFG_PATH}" ${AGENT_CFG_TEMPLATE_PATH} contentrouter SharedMemoryBufferSize "262144" 0
            Set_Cfg_Parameter   "${AGENT_CFG_PATH}" ${AGENT_CFG_TEMPLATE_PATH} contentrouter SharedMemoryEnabled "1" 0
            Set_Cfg_Parameter   "${AGENT_CFG_PATH}" ${AGENT_CFG_TEMPLATE_PATH} contentrouter SharedMemoryTimeout "300" 1
            Set_Cfg_Parameter   "${AGENT_CFG_PATH}" ${AGENT_CFG_TEMPLATE_PATH} contentrouter SharedMemoryTimeoutRetries "300" 0
            Set_Cfg_Parameter   "${AGENT_CFG_PATH}" ${AGENT_CFG_TEMPLATE_PATH} replication FibreChannel "0" 0

            cmp -s "${AGENT_CFG_PATH}" "${AGENT_CFG_PATH}.${BACKUP_DATE}" > /dev/null 2>&1
            if [ $? -eq 0 ] ; then
                rm "${AGENT_CFG_PATH}.${BACKUP_DATE}" > /dev/null 2>&1
            fi
            chmod o-w "${AGENT_CFG_PATH}"
        else
            echo "WARN: Missing agent config file! Path found from pdregistry.cfg: ${AGENT_CFG_PATH}"
        fi
    fi

    # Check if storage conversion needs to be run.  Just log it here.
    # The DPA installer should be the one to actually start the conversion utility.
    if [ -x "${STCONV}" ] ; then
        ${STCONV} --comparestorageformat >/dev/null 2>&1
        if [ $? -eq 0 ] ; then
            echo "PDDE storage requires conversion!"
        else
            echo "PDDE storage does not require conversion."
        fi
    fi

    # Update running version file with the current version
    if [ ! -z "$STORAGE_PATH" ] ; then
        echo "U" `cat ${INSTALL_PATH}/pdag/version.txt` >> "$STORAGE_PATH/etc/runningversion.log"
        chmod o-w "$STORAGE_PATH/etc/runningversion.log"
    fi
fi

# Agent components
if [ "${INSTALL_TYPE}" = "all" -o "${INSTALL_TYPE}" = "agent" ] ; then
    # pd.conf
    if [ -f "${OSTPLUGINS_PATH}/pd.conf" ] ; then
        echo "Found pd.conf.  Checking for upgrades..."
        cp "${OSTPLUGINS_PATH}/pd.conf" "${OSTPLUGINS_PATH}/pd.conf.${BACKUP_DATE}" > /dev/null 2>&1

        Upgrade_Pd_Conf "${OSTPLUGINS_PATH}/pd.conf"

        cmp -s "${OSTPLUGINS_PATH}/pd.conf" "${OSTPLUGINS_PATH}/pd.conf.${BACKUP_DATE}" > /dev/null 2>&1
        if [ $? -eq 0 ] ; then
            rm "${OSTPLUGINS_PATH}/pd.conf.${BACKUP_DATE}" > /dev/null 2>&1
        fi
        chmod o-w "${OSTPLUGINS_PATH}/pd.conf"
    fi

    # mtstrm.conf
    if [ -f "${OSTPLUGINS_PATH}/mtstrm.conf" ] ; then
        echo "Found mtstrm.conf.  Checking for upgrades..."

        # mtstrm.conf [Logging]LogPath is set to CHANGEME in the template.
        # Set it to the right default path for this platform.
        MTSTRM_LOG_PATH="`${PDCFG} --read=${OSTPLUGINS_PATH}/mtstrm.conf --section=Logging --option=LogPath`" > /dev/null
        if [ "${MTSTRM_LOG_PATH}" = "MTSTRM_DEFAULT_LOG_PATH" ] ; then
            Set_Cfg_Parameter "${OSTPLUGINS_PATH}/mtstrm.conf" "" Logging LogPath "/var/log/puredisk" 1
            Set_Recommended_Mtstrm_Config_Values
        fi
        Set_Cfg_Parameter "${OSTPLUGINS_PATH}/mtstrm.conf" "" Process MaxConcurrentSessions "4" 0
        Set_Cfg_Parameter "${OSTPLUGINS_PATH}/mtstrm.conf" "" Threads BackupFpThreads "4" 0
        chmod o-w "${OSTPLUGINS_PATH}/mtstrm.conf"
    fi
fi

exit 0