Nueva creación de un entorno antiguo de EPM Cloud para auditorías

Utilice el script de esta sección para crear una solución de autoservicio para mantener una biblioteca actualizada de instantáneas para su entorno de Oracle Enterprise Performance Management Cloud. Necesita un entorno dedicado al propósito de actualizar y mantener una biblioteca de instantáneas actualizadas.

EPM Cloud soporta la compatibilidad con instantáneas solo para un ciclo mensual. Puede migrar instantáneas de mantenimiento del entorno de prueba al de producción y viceversa. Sin embargo, es posible que los requerimientos de auditoría de algunos clientes necesiten restaurar instantáneas de varios años en el entorno más reciente, y acceder a la aplicación en un periodo de tiempo breve.

Debe programar este script para que se ejecute una vez al mes a fin de convertir las instantáneas disponibles y hacerlas compatibles con el nivel de revisión más reciente de EPM Cloud. Oracle recomienda que ejecute un script después del tercer viernes del mes para asegurarse de que todos los problemas del entorno de producción se han resuelto.

Nota:

No puede utilizar este script para actualizar las instantáneas de Narrative Reporting, Account Reconciliation y Oracle Enterprise Data Management Cloud.

Funcionamiento del script

Por cada instantánea que el cliente almacena, el script actualizado realiza estas tareas mediante el uso de EPM Automate:
  1. Con la información del archivo input.properties, se conecta a un entorno.
  2. Utiliza el comando recreate volver a crear el entorno.
  3. Importa la instantánea en el entorno.
  4. Ejecuta el mantenimiento diario en un entorno, lo que convierte la instantánea al formato compatible con el nivel de parche de EPM Cloud actual.
  5. Descarga Artifact Snapshot (la instantánea de mantenimiento) en una carpeta. Si ha recreado un entorno 18.05 cargando instantáneas de snapshots/18.05, Artifact Snapshot se descarga en snapshots/18.06.
  6. Envía por correo electrónico el resultado de la nueva creación de entornos antiguos a una dirección de correo electrónico si se especifica.

Ejecución del script

  1. Cree el archivo input.properties y actualícelo con información de su entorno. Guarde el archivo en un directorio local. Este directorio lo denominaremos parentsnapshotdirectory. El contenido de este archivo difiere según su sistema operativo.

    Asegúrese de que tiene privilegios de escritura en este directorio. Para Windows, puede que necesite iniciar PowerShell mediante la opción Ejecutar como administrador para poder ejecutar los scripts.

  2. Cree el script upgradeSnapshots.ps1 (Windows PowerShell) o upgradeSnapshots.sh (Linux/UNIX) y guárdelo en parentsnapshotdirectory, donde se ubica input.properties.
  3. Cree un subdirectorio, por ejemplo, snapshots, en parentsnapshotdirectory.
  4. En el directorio que ha creado en el paso anterior (snapshots), cree un subdirectorio para la instantánea mensual que desea convertir para hacerla compatible con el nivel de parche de EPM Cloud actual. Asigne un nombre al directorio con el formato YY.MM; por ejemplo, 18.05 para el directorio en el que se almacenan las instantáneas de mayo de 2018.
  5. Copie las instantáneas en el subdirectorio adecuado. Por ejemplo, copie las instantáneas de mayo de 2018 en snapshots/18.05.
  6. Inicie el script.
    • Linux/UNIX: ejecute ./upgradeSnapshots.sh.
    • Windows PowerShell: ejecute upgradeSnapshots.ps1.

Windows

Cree los scripts input.properties y upgradeSnapshots.ps1 copiando los scripts de esta sección.

Creación de input.properties

username=exampleAdmin
userpassword=examplePassword
serviceurl=exapleURL
proxyserverusername=proxyServerUserName
proxyserverpassword=proxyPassword
proxyserverdomain=proxyDoamin
parentsnapshotdirectory=C:/some_directory/snapshots
emailtoaddress=exampleAdmin@oracle.com

Actualización de input.properties

Nota:

Si authentication at proxy server no está activado para su entorno de red de Windows, elimine las propiedades proxyserverusername, proxyserverpassword y proxyserverdomain del archivo input.properties.

Tabla 3-8 Parámetros de input.properties

Parámetro Descripción
username Nombre de usuario de un administrador del servicio.
userpassword Contraseña del administrador de servicio.
serviceurl URL del entorno que se usa en esta actividad.
proxyserverusername Nombre de usuario utilizado para autentificar una sesión segura con el servidor proxy que controla el acceso a Internet.
proxyserverpassword Contraseña para autentificar el usuario con el servidor proxy.
proxyserverdomain Nombre del dominio definido para el servidor proxy.
parentsnapshotdirectory Ruta de acceso absoluta del directorio que se utilizará como el directorio padre del directorio en el que se almacenan las instantáneas que se van a procesar. Utilice barras inclinadas (/) como separadores de directorio.
emailtoaddress Opcionalmente, dirección de correo electrónico a la que se van a enviar los resultados de la nueva creación de entornos antiguos. El resultado se envía por correo electrónico solo si se especifica este valor.

Ejemplo: john.doe@example.com

Nota:

Si su contraseña contiene caracteres especiales, consulte Manejo de caracteres especiales.

Creación de upgradeSnapshots.ps1

Utilice este script de ejemplo para crear upgradeSnapshots.ps1.

# Script for recreating an old EPM Cloud environment

# read in key/value pairs from input.properties file
$inputproperties=ConvertFrom-StringData(Get-Content ./input.properties -raw)

# Global variables
$parentsnapshotdirectory="$($inputproperties.parentsnapshotdirectory)"
$username="$($inputproperties.username)"
$userpassword="$($inputproperties.userpassword)"
$serviceurl="$($inputproperties.serviceurl)"
$proxyserverusername="$($inputproperties.proxyserverusername)"
$proxyserverpassword="$($inputproperties.proxyserverpassword)"
$proxyserverdomain="$($inputproperties.proxyserverdomain)"
$emailtoaddress="$($inputproperties.emailtoaddress)"
$operationmessage="EPM Automate operation:"
$operationfailuremessage="EPM Automate operation failed:"
$operationsuccessmessage="EPM Automate operation completed successfully:"
$epmautomatescript="epmautomate.bat"

$workingdir="$pwd"
$logdir="$workingdir/logs/"
$logfile="$logdir/epmautomate-upgradesnapshots.log"

function LogMessage 
{
    $message=$args[0]
    $_mydate=$(get-date -f dd_MM_yy_HH_mm_ss)

    echo "[$_mydate] $message" >> $logfile
}

function LogAndEchoMessage
{
    $message=$args[0]
    $_mydate=$(get-date -f dd_MM_yy_HH_mm_ss)

    echo "[$_mydate] $message" | Tee-Object -Append -FilePath $logfile
}

function LogOutput
{
    $_mydate=$(get-date -f dd_MM_yy_HH_mm_ss)
    $op=$args[0]
    $opoutput=$args[1]
    $returncode=$args[2]

    #If error
    if ($returncode -ne 0) {
        $failmessage="[$_mydate] $operationfailuremessage $op"
        LogMessage $failmessage
        LogMessage $opoutput
        LogMessage "return code: $returncode"
    } else { 
        $successmessage="[$_mydate] $operationsuccessmessage $op"
        LogMessage $successmessage
        LogMessage $opoutput
        LogMessage "return code: $returncode"
    }
}

function ExecuteCommand
{
    $op=$args[0]
    $epmautomatecall="$epmautomatescript $op"
    $date=$(get-date -f dd_MM_yy_HH_mm_ss)

    LogMessage "$operationmessage $epmautomatecall"
    $operationoutput=iex "& $epmautomatecall" >> $logfile 2>&1
    LogOutput $op $operationoutput $LastExitCode
}

function ProcessCommand
{
    $command=$args[0]
    $date=$(get-date -f dd_MM_yy_HH_mm_ss)

    if (!([string]::IsNullOrWhitespace($command))) {
        if (!($command.StartsWith("#"))) {
            ExecuteCommand $command
        }
    }
}

function Init
{
    $logdirexists=Test-Path $logdir
    if (!($logdirexists)) {
        mkdir $logdir 2>&1 | out-null
    }

    # removing existing epmautomate debug logs
    rm ./*.log

    $logfileexists=Test-Path $logfile
    # remove existing log file
    if ($logfileexists) {
        rm $logfile
    }
}

function GetNextDate
{
    $latestyearmonth=$args[0]
    LogMessage "latest year.month: $latestyearmonth"
    $latestyear,$latestmonth=$latestyearmonth.split('\.')
    LogMessage "latest year: $latestyear"
    LogMessage "latest month: $latestmonth"
    $intlatestyear=[int]$latestyear
    $intlatestmonth=[int]$latestmonth

    if ($intlatestmonth -eq 12) {
        $intnextmonth=1
        $intnextyear=$intlatestyear+1
    } else {
        $intnextmonth=$intlatestmonth+1
        $intnextyear=$intlatestyear
    }

    $nextyear="{0:D2}" -f $intnextyear
    $nextmonth="{0:D2}" -f $intnextmonth

    echo "$nextyear.$nextmonth"
}

function ProcessSnapshot
{
    $snapshotfile=$args[0]
    LogMessage "snapshotfile: $snapshotfile"
    $nextdate=$args[1]
    LogMessage "nextdate: $nextdate"
    $snapshotfilename=$snapshotfile.split('/')[-1]
    LogMessage "snapshotfilename: $snapshotfilename"
    $snapshotname=$snapshotfilename.split('.')[0]
    LogMessage "snapshotname: $snapshotname"

    ProcessCommand "login $username $userpassword $serviceurl $proxyserverusername $proxyserverpassword $proxyserverdomain"
    ProcessCommand "recreate -f"
    ProcessCommand "uploadfile $snapshotfile"
    ProcessCommand "importsnapshot $snapshotname"
    ProcessCommand "runDailyMaintenance skipNext=true -f"
    ProcessCommand "downloadfile 'Artifact Snapshot'"
    ProcessCommand "deletefile $snapshotname"
    ProcessCommand "logout"

    $nextdatedirexists=Test-Path $parentsnapshotdirectory/$nextdate
    if (!($nextdatedirexists)) {
        mkdir $parentsnapshotdirectory/$nextdate 2>&1 | out-null
    }

    LogMessage "Renaming 'Artifact Snapshot.zip' to $snapshotname.zip and moving to $parentsnapshotdirectory/$nextdate"
    mv $workingdir/'Artifact Snapshot.zip' $workingdir/$snapshotname.zip >> $logfile 2>&1
    mv $workingdir/$snapshotname.zip $parentsnapshotdirectory/$nextdate >> $logfile 2>&1
}

function callSendMail
{
    $logfile=$logfile -replace "\\", "/"
    $elements=$logfile.split('/')
    $logfilename=$elements[-1]

    if (${emailtoaddress} -match "@") {
        epmautomate.bat login ${username} ${userpassword} ${serviceurl}
        epmautomate.bat uploadFile "$logfile"
        epmautomate.bat sendMail $emailtoaddress "Recreating An Old EPM Cloud Environment results" Body="The results of recreating an old EPM Cloud Environment are attached." Attachments=$logfilename
        epmautomate.bat deleteFile "$logfilename"
        epmautomate.bat logout
    }
}

#----- main body of processing
date
Init
LogAndEchoMessage "Starting upgrade snapshots processing"
$snapshotdirs=@(Get-ChildItem -Directory "$parentsnapshotdirectory" -name)
LogMessage "snapshot directories: $snapshotdirs"
$latestreleasedate=$snapshotdirs[-1]
LogMessage "latest release date: $latestreleasedate"
$latestreleasesnapshotdir="$parentsnapshotdirectory/$latestreleasedate"
LogMessage "latest release snapshot dir: $latestreleasesnapshotdir"
$nextdate=$(GetNextDate "$latestreleasedate")
$snapshotfiles=@(Get-ChildItem -File "$latestreleasesnapshotdir")
if ($snapshotfiles.length -eq 0) {
    LogAndEchoMessage "No snapshot files found in directory $latestreleasesnapshotdir. Exiting script."
    exit
}
foreach ($snapshotfile in $snapshotfiles) {
    LogAndEchoMessage "Processing snapshotfile: $snapshotfile"
    ProcessSnapshot $latestreleasesnapshotdir/$snapshotfile $nextdate
}
LogAndEchoMessage "Upgrade snapshots processing completed"
date
callSendMail

Linux/UNIX

Cree upgradeSnapshots.sh y input.properties copiando los siguientes scripts.

Creación de input.properties para Linux/UNIX

Nota:

Si su red no está configurada para utilizar un servidor proxy para acceder a Internet, elimine las propiedades proxyserverusername, proxyserverpassword y proxyserverdomain del archivo input.properties.

username=exampleAdmin
userpassword=examplePassword
serviceurl=exapleURL
proxyserverusername=
proxyserverpassword=
proxyserverdomain=
jdkdir=/home/user1/jdk160_35
epmautomatescript=/home/exampleAdmin/epmautomate/bin/epmautomate.sh
parentsnapshotdirectory=/home/exampleAdmin/some_directory/snapshots
emailtoaddress=exampleAdmin@oracle.com

Actualización de input.properties

Tabla 3-9 Parámetros de input.properties

Parámetro Descripción
username Nombre de usuario de un administrador del servicio.
userpassword Contraseña del administrador de servicio.
serviceurl URL del entorno que se usa en esta actividad.
proxyserverusername Nombre de usuario utilizado para autentificar una sesión segura con el servidor proxy que controla el acceso a Internet.
proxyserverpassword Contraseña para autentificar el usuario con el servidor proxy.
proxyserverdomain Nombre del dominio definido para el servidor proxy.
jdkdir Ubicación JAVA_HOME.
epmautomatescript Ruta de acceso absoluta del ejecutable de EPM Automate (epmautomate.sh).
parentsnapshotdirectory Ruta de acceso absoluta del directorio que se utilizará como el directorio padre del directorio en el que se almacena la instantánea que se va a procesar.
emailtoaddress Opcionalmente, dirección de correo electrónico a la que se van a enviar los resultados de la nueva creación de entornos antiguos.

Nota:

Si su contraseña contiene caracteres especiales, consulte Manejo de caracteres especiales.

Creación de upgradeSnapshots.sh

Utilice este script de ejemplo para crear upgradeSnapshots.sh.

#!/bin/sh

. ./input.properties
workingdir=$(pwd)
logdir="${workingdir}/logs"
logfile=epmautomate-upgradesnapshots.log
operationmessage="EPM Automate operation:"
operationfailuremessage="EPM Automate operation failed:"
operationsuccessmessage="EPM Automate operation completed successfully:"
logdebugmessages=true

if [ ! -d ${jdkdir} ]
then 
    echo "Could not locate JDK/JRE. Please set value for "jdkdir" property in input.properties file to a valid JDK/JRE location."
    exit
fi

if [ ! -f ${epmautomatescript} ]
then 
    echo "Could not locate EPM Automate script. Please set value for "epmautomatescript" property in the input.properties file."
    exit
fi

export JAVA_HOME=${jdkdir}

debugmessage() {
    # logdebugmessages is defined (or not) in testbase input.properties
    if [ "${logdebugmessages}" = "true" ]
    then
        logmessage "$1"
    fi
}

logmessage() 
{
    local message=$1
    local _mydate=$(date)

    echo "[$_mydate] ${message}" >> "$logdir/$logfile"
}

echoandlogmessage() 
{
    local message=$1
    local _mydate=$(date)

    echo "[$_mydate] ${message}" | tee -a ${logdir}/${logfile}
}

logoutput()
{
    date=`date`
    op="$1"
    opoutput="$2"
    returncode="$3"

    #If error
    #if grep -q "EPMAT-" <<< "$2"
    if [ $returncode -ne 0 ]
    then
        failmessage="[${date}] ${operationfailuremessage} ${op}"
        logmessage "${failmessage}"
        logmessage "${opoutput}"
        logmessage "return code: ${returncode}"
    else
        successmessage="${operationsuccessmessage} ${op}"
        logmessage "${successmessage}"
        logmessage "${opoutput}"
        logmessage "return code: ${returncode}"
    fi
}

getLatestReleaseSnapshotDir()
{
    local snapshotdirs=$(find ${parentsnapshotdirectory} -type d | sort)
    debugmessage "snapshot directories: ${snapshotdirs}"
    local latestreleasesnapshotdir=$(echo ${snapshotdirs##*$\n} | rev | cut -d' ' -f1 | rev)
    debugmessage "latest release snapshot dir: ${latestreleasesnapshotdir}"
    echo "${latestreleasesnapshotdir}"
}

getNextDate()
{
    local thisyearmonth=$1
    local thisyear=$(echo ${thisyearmonth} | cut -d'.' -f1)
    local thismonth=$(echo ${thisyearmonth} | cut -d'.' -f2)

    intthismonth=$(bc <<< ${thismonth})
    intthisyear=$(bc <<< ${thisyear})

    if [ ${intthismonth} -eq 12 ]
    then
        local intnextmonth=1
        local intnextyear=$((intthisyear+1))
    else 
        local intnextmonth=$((intthismonth+1))
        local intnextyear=${intthisyear}
    fi
    
    nextmonth=$(printf "%02d\n" ${intnextmonth})
    nextyear=$(printf "%02d\n" ${intnextyear})

    debugmessage "next date: ${nextyear}.${nextmonth}"

    echo "${nextyear}.${nextmonth}"
}

init()
{
    if [ ! -d "$logdir" ]
    then
        mkdir $logdir
    fi

    # removing existing epmautomate debug logs
    if ls ./*.log >/dev/null 2>&1
    then
       rm ./*.log
    fi

    # remove existing log files
    if [ -f "${logdir}/${logfile}" ]
    then
        rm ${logdir}/${logfile}
    fi
}

processCommand()
{
    op="$1"
    date=`date`

    logmessage "$operationmessage $op"
    operationoutput=`eval "$epmautomatescript $op"`
    logoutput "$op" "$operationoutput" "$?"
}

processSnapshot()
{
    local snapshotfile="$1"
    local nextdate="$2"
    local snapshotname=$(echo "${snapshotfile}" | rev | cut -d'/' -f1 | rev | cut -d'.' -f1)

    processCommand "login ${username} ${userpassword} ${serviceurl} ${proxyserverusername} ${proxyserverpassword}"
    processCommand "recreate -f"
    processCommand "uploadfile ${snapshotfile}"
    processCommand "importsnapshot \"${snapshotname}\""
    processCommand "runDailyMaintenance skipNext=true -f"
    processCommand "downloadfile \"Artifact Snapshot\""
    processCommand "deletefile \"${snapshotname}\""
    processCommand "logout"

    if [ ! -d ${parentsnapshotdirectory}/${nextdate} ]
    then
        mkdir ${parentsnapshotdirectory}/${nextdate}
    fi
runDailyMaintenance -f
    logmessage "Renaming \"Artifact Snapshot.zip\" to ${snapshotname}.zip and moving to ${parentsnapshotdirectory}/${nextdate}"
    mv "${workingdir}/Artifact Snapshot.zip" "${workingdir}/${snapshotname}.zip" >> "$logdir/$logfile" 2>&1
    mv "${workingdir}/${snapshotname}.zip" ${parentsnapshotdirectory}/${nextdate} >> "$logdir/$logfile" 2>&1
}

callSendMail() {

    if [[ "${emailtoaddress}" == *"@"* ]]
    then
        ${epmautomatescript} login ${username} ${userpassword} ${serviceurl}
        ${epmautomatescript} uploadFile "$logdir/$logfile"
        ${epmautomatescript} sendMail $emailtoaddress "Recreating An Old EPM Cloud Environment results" Body="The results of recreating an old EPM Cloud Environment are attached" Attachments=$logfile
        ${epmautomatescript} deleteFile "$logfile"
        ${epmautomatescript} logout
    fi
}

#----- main body of processing
date
echoandlogmessage "Starting upgrade snapshots processing"
init
latestreleasesnapshotdir=$(getLatestReleaseSnapshotDir)
latestreleasedate=$(echo "${latestreleasesnapshotdir}" | rev | cut -d'/' -f1 | rev)
debugmessage "latest release date: ${latestreleasedate}"
nextdate=$(getNextDate ${latestreleasedate})

snapshotfiles=$(find ${latestreleasesnapshotdir} -type f -name \*.zip | tr "\n" "|")
if [ ${#snapshotfiles} -eq 0 ]
then
    echoandlogmessage "No snapshot files found in directory ${latestreleasesnapshotdir}"
fi

IFS="|"
for snapshotfile in $snapshotfiles
do
    echoandlogmessage "Processing snapshotfile: ${snapshotfile}"
    processSnapshot ${snapshotfile} ${nextdate}
done
unset IFS
echoandlogmessage "Upgrade snapshots processing completed."
callSendMail