Alte EPM Cloud-Umgebungen für Audits neu erstellen

Verwenden Sie das Skript in diesem Abschnitt, um eine Selfservicelösung zu erstellen, mit der eine aktuelle Bibliothek von Snapshots für Ihre Oracle Enterprise Performance Management Cloud-Umgebung verwaltet werden kann. Sie benötigen eine Umgebung, die speziell für die Aktualisierung und Wartung einer Bibliothek mit aktuellen Snapshots eingerichtet ist.

EPM Cloud unterstützt die Snapshot-Kompatibilität nur für einen monatlichen Zyklus. Sie können Wartungs-Snapshots von der Testumgebung in die Produktionsumgebung migrieren und umgekehrt. Die Auditing-Anforderungen einiger Kunden können jedoch die Wiederherstellung von Snapshots aus mehreren Jahren in der neuesten Umgebung und den Zugriff auf die Anwendung in kurzer Zeit erforderlich machen.

Dieses Skript sollte einmal im Monat ausgeführt werden, um die verfügbaren Snapshots zu konvertieren und sie mit der neuesten EPM Cloud-Patchebene kompatibel zu machen. Oracle empfiehlt, das Skript nach dem dritten Freitag im Monat auszuführen, um sicherzustellen, dass alle Probleme in der Produktionsumgebung behoben sind.

Hinweis:

Sie können dieses Skript nicht verwenden, um Snapshots für Narrative Reporting, Account Reconciliation und Oracle Enterprise Data Management Cloud zu aktualisieren.

Funktionsweise des Skripts

Für jeden vom Kunden gespeicherten Snapshot führt das Upgradeskript die folgenden Aufgaben mit EPM Automate aus:
  1. Mit den Informationen in der Datei input.properties wird die Anmeldung in einer Umgebung durchgeführt.
  2. Verwendet den Befehl recreate, um die Umgebung wiederherzustellen.
  3. Importiert den Snapshot in die Umgebung.
  4. Führt eine tägliche Wartung der Umgebung aus, was dazu führt, dass der Snapshot in das Format konvertiert wird, das mit der aktuellen EPM Cloud-Patchebene kompatibel ist.
  5. Lädt Artifact Snapshot (Wartungs-Snapshot) in einen Ordner herunter. Wenn Sie eine 18.05-Umgebung durch das Hochladen von Snapshots aus Snapshots/18.05 erstellt haben, wird Artifact Snapshot in Snapshots/18.06 heruntergeladen.
  6. Sendet die Ergebnisse der Neuerstellung alter Umgebungen per E-Mail an eine E-Mail-Adresse (falls angegeben).

Skripte ausführen

  1. Erstellen Sie die Datei input.properties, und aktualisieren Sie sie mit Informationen für Ihre Umgebung. Speichern Sie die Datei in einem lokalen Verzeichnis. Hierbei handelt es sich um das Verzeichnis, das in dieser Erörterung als parentsnapshotdirectory referenziert wird. Die Inhalte dieser Datei unterscheiden sich je nach Betriebssystem.

    Stellen Sie sicher, dass Sie Schreibrechte in diesem Verzeichnis haben. Unter Windows müssen Sie möglicherweise PowerShell mit der Option Als Administrator ausführen starten, um Skripte ausführen zu können.

  2. Erstellen Sie das Skript upgradeSnapshots.ps1 (Windows PowerShell) oder das Skript upgradeSnapshots.sh (Linux/UNIX), und speichern Sie es im Verzeichnis parentsnapshotdirectory, in dem sich input.properties befindet.
  3. Erstellen Sie unter parentsnapshotdirectory ein Unterverzeichnis, z.B. snapshots.
  4. Erstellen Sie innerhalb des Verzeichnisses, das Sie im vorherigen Schritt erstellt haben (snapshots) ein Unterverzeichnis für den monatlichen Snapshot, den Sie konvertieren möchten, um ihn mit der aktuellen EPM Cloud-Patchebene kompatibel zu machen. Benennen Sie das Verzeichnis im Format YYY.MM, z.B. 18.05 für das Verzeichnis zum Speichern der Snapshots vom Mai 2018.
  5. Kopieren Sie Snapshots in das entsprechende Unterverzeichnis. Beispiel: Kopieren Sie die Snapshots für Mai 2018 in snapshots/18.05.
  6. Starten Sie das Skript.
    • Linux/UNIX: Führen Sie das Skript ./upgradeSnapshots.sh aus.
    • Windows PowerShell: Führen Sie das Skript upgradeSnapshots.ps1 aus.

Windows

Erstellen Sie das Skript input.properties und upgradeSnapshots.ps1 durch Kopieren der Skripte in diesem Abschnitt.

input.properties erstellen

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

input.properties aktualisieren

Hinweis:

Wenn authentication at proxy server für Ihre Windows-Netzwerkumgebung nicht aktiviert ist, entfernen Sie die Eigenschaften proxyserverusername, proxyserverpassword und proxyserverdomain aus der Datei input.properties.

Tabelle 3-8 Parameter für "input.properties"

Parameter Beschreibung
username Benutzername eines Serviceadministrators.
userpassword Kennwort des Serviceadministrators.
serviceurl URL der Umgebung, die für diese Aktivität verwendet wird.
proxyserverusername Der Benutzername zum Authentifizieren einer sicheren Session auf dem Proxyserver, der den Zugriff auf das Internet steuert.
proxyserverpassword Das Kennwort zur Authentifizierung des Benutzers beim Proxyserver.
proxyserverdomain Der Name der Domain, die für den Proxyserver definiert ist.
parentsnapshotdirectory Absoluter Pfad des Verzeichnisses, das als übergeordnetes Verzeichnis des Verzeichnisses verwendet werden soll, in dem die zu verarbeitenden Snapshots gespeichert werden. Verwenden Sie Schrägstriche (/) als Verzeichnistrennzeichen.
emailtoaddress Optional, die E-Mail-Adresse, an die Ergebnisse der Neuerstellung alter Umgebungen gesendet werden sollen. Die Ergebnisse werden nur per E-Mail gesendet, wenn dieser Wert angegeben wurde.

Beispiel: john.doe@example.com

Hinweis:

Wenn Ihr Kennwort Sonderzeichen enthält, finden Sie unter Sonderzeichen verarbeiten weitere Informationen.

upgradeSnapshots.ps1 erstellen

Verwenden Sie dieses Beispielskript zum Erstellen von 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

Erstellen Sie upgradeSnapshots.sh und input.properties durch Kopieren der folgenden Skripte.

input.properties für Linux/UNIX erstellen

Hinweis:

Wenn Ihr Netzwerk nicht für die Verwendung eines Proxyservers für den Internetzugriff konfiguriert ist, entfernen Sie die Eigenschaften proxyserverusername, proxyserverpassword und proxyserverdomain aus der Datei 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

input.properties aktualisieren

Tabelle 3-9 Parameter für "input.properties"

Parameter Beschreibung
username Benutzername eines Serviceadministrators.
userpassword Kennwort des Serviceadministrators.
serviceurl URL der Umgebung, die für diese Aktivität verwendet wird.
proxyserverusername Der Benutzername zum Authentifizieren einer sicheren Session auf dem Proxyserver, der den Zugriff auf das Internet steuert.
proxyserverpassword Das Kennwort zur Authentifizierung des Benutzers beim Proxyserver.
proxyserverdomain Der Name der Domain, die für den Proxyserver definiert ist.
jdkdir Verzeichnis JAVA_HOME.
epmautomatescript Absoluter Pfad der ausführbaren Datei für EPM Automate (epmautomate.sh).
parentsnapshotdirectory Absoluter Pfad des Verzeichnisses, das als übergeordnetes Verzeichnis des Verzeichnisses verwendet werden soll, in dem der zu verarbeitende Snapshot gespeichert wird.
emailtoaddress Optional, die E-Mail-Adresse, an die Ergebnisse der Neuerstellung alter Umgebungen gesendet werden sollen.

Hinweis:

Wenn Ihr Kennwort Sonderzeichen enthält, finden Sie unter Sonderzeichen verarbeiten weitere Informationen.

upgradeSnapshots.sh erstellen

Verwenden Sie dieses Beispielskript zum Erstellen von 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