Recréation d'un ancien environnement EPM Cloud pour les audits

Utilisez le script de cette section pour créer une solution libre-service permettant de maintenir une bibliothèque d'instantanés à jour pour votre environnement Oracle Enterprise Performance Management Cloud. Vous avez besoin d'un environnement dédié à la mise à niveau et à la maintenance d'une bibliothèque d'instantanés à jour.

EPM Cloud prend en charge la compatibilité des instantanés pour un seul cycle mensuel. Vous pouvez migrer les instantanés de maintenance de l'environnement de test vers l'environnement de production, et inversement. Cependant, les exigences d'audit de certains clients peuvent nécessiter la restauration des instantanés de plusieurs années sur le dernier environnement, ainsi que l'accès à l'application sur une courte période.

Vous devez planifier l'exécution de ce script une fois par mois pour convertir les instantanés disponibles et les rendre compatibles avec le dernier niveau de patch EPM Cloud. Oracle vous recommande d'exécuter le script après le troisième vendredi du mois afin de s'assurer que tous les problèmes de l'environnement de production aient été résolus.

Remarque :

Vous ne pouvez pas utiliser ce script pour mettre à jour les instantanés Narrative Reporting, Account Reconciliation et Oracle Enterprise Data Management Cloud.

Fonctionnement du script

Pour chaque instantané stocké par le client, le script de mise à niveau réalise les tâches suivantes à l'aide d'EPM Automate :
  1. Connexion à un environnement à l'aide des informations du fichier input.properties.
  2. Utilisation de la commande recreate pour restaurer l'environnement.
  3. Import de l'instantané dans l'environnement.
  4. Exécution de la maintenance quotidienne sur l'environnement, qui entraîne la conversion de l'instantané au format compatible avec le niveau de patch EPM Cloud en cours.
  5. Téléchargement de l'instantané de maintenance Artifact Snapshot dans un dossier. Si vous avez recréé un environnement 18.05 en chargeant des instantanés à partir de snapshots/18.05, Artifact Snapshot est téléchargé dans snapshots/18.06.
  6. Envoi par courriel des résultats de la recréation d'anciens environnements à une adresse électronique, si elle est indiquée.

Exécution du script

  1. Créez le fichier input.properties et mettez-le à jour avec les informations relatives à votre environnement. Enregistrez le fichier dans un répertoire local. Ce répertoire est nommé parentsnapshotdirectory dans cette discussion. Le contenu de ce fichier varie en fonction du système d'exploitation.

    Assurez-vous que vous disposez de privilèges d'écriture sur ce répertoire. Pour Windows, vous devrez peut-être démarrer PowerShell à l'aide de l'option Exécuter en tant qu'administrateur afin de pouvoir exécuter les scripts.

  2. Créez le script upgradeSnapshots.ps1 (Windows PowerShell) ou upgradeSnapshots.sh (Linux/UNIX), puis enregistrez-le dans le répertoire parentsnapshotdirectory, où se trouve input.properties.
  3. Créez un sous-répertoire, par exemple snapshots, dans le répertoire parentsnapshotdirectory.
  4. Dans le répertoire créé à l'étape précédente (snapshots), créez un sous-répertoire pour l'instantané mensuel à convertir afin de le rendre compatible avec le niveau de patch EPM Cloud en cours. Nommez le répertoire en respectant le format YY.MM. Par exemple, 18.05 pour le répertoire stockant les instantanés de mai 2018.
  5. Copiez les instantanés dans le sous-répertoire approprié. Par exemple, copiez les instantanés de mai 2018 dans snapshots/18.05.
  6. Lancez le script.
    • Linux/UNIX : exécutez ./upgradeSnapshots.sh.
    • Windows PowerShell : exécutez upgradeSnapshots.ps1.

Windows

Créez le fichier input.properties et le script upgradeSnapshots.ps1 en copiant les scripts de cette section.

Création du fichier input.properties

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

Mise à jour du fichier input.properties

Remarque :

Si l'authentification au niveau du serveur proxy n'est pas activée pour votre environnement réseau Windows, enlevez les propriétés proxyserverusername, proxyserverpassword et proxyserverdomain du fichier input.properties.

Tableau 3-8 Paramètres du fichier input.properties

Paramètre  Description
username Nom d'utilisateur d'un administrateur de service.
userpassword Mot de passe de l'administrateur de service.
serviceurl URL de l'environnement utilisé pour cette activité.
proxyserverusername Nom d'utilisateur permettant d'authentifier une session sécurisée avec le serveur proxy qui contrôle l'accès à Internet.
proxyserverpassword Mot de passe pour l'authentification de l'utilisateur auprès du serveur proxy.
proxyserverdomain Nom du domaine défini pour le serveur proxy.
parentsnapshotdirectory Chemin absolu du répertoire à utiliser en tant que parent du répertoire de stockage des instantanés à traiter. Utilisez la barre oblique (/) comme séparateur de répertoires.
emailtoaddress (Facultatif) Adresse électronique à laquelle les résultats de la recréation d'anciens environnements doivent être envoyés. Les résultats ne sont envoyés par courriel que si cette valeur est indiquée.

Exemple : john.doe@example.com

Remarque :

Si votre mot de passe contient des caractères spéciaux, reportez-vous à la section Gestion des caractères spéciaux.

Création du script upgradeSnapshots.ps1

Utilisez cet exemple de script pour créer 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

Créez upgradeSnapshots.sh et input.properties en copiant les scripts suivants.

Création du fichier input.properties pour Linux/UNIX

Remarque :

Si votre réseau n'est pas configuré de façon à utiliser un serveur proxy pour accéder à Internet, enlevez les propriétés proxyserverusername, proxyserverpassword et proxyserverdomain du fichier 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

Mise à jour du fichier input.properties

Tableau 3-9 Paramètres du fichier input.properties

Paramètre  Description
username Nom d'utilisateur d'un administrateur de service.
userpassword Mot de passe de l'administrateur de service.
serviceurl URL de l'environnement utilisé pour cette activité.
proxyserverusername Nom d'utilisateur permettant d'authentifier une session sécurisée avec le serveur proxy qui contrôle l'accès à Internet.
proxyserverpassword Mot de passe pour l'authentification de l'utilisateur auprès du serveur proxy.
proxyserverdomain Nom du domaine défini pour le serveur proxy.
jdkdir Emplacement de JAVA_HOME.
epmautomatescript Chemin absolu de l'exécutable EPM Automate (epmautomate.sh).
parentsnapshotdirectory Chemin absolu du répertoire à utiliser en tant que parent du répertoire de stockage de l'instantané à traiter.
emailtoaddress (Facultatif) Adresse électronique à laquelle les résultats de la recréation d'anciens environnements doivent être envoyés.

Remarque :

Si votre mot de passe contient des caractères spéciaux, reportez-vous à la section Gestion des caractères spéciaux.

Création du script upgradeSnapshots.sh

Utilisez cet exemple de script pour créer 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