Benutzer über den Abschluss der täglichen Wartung informieren

Die tägliche Wartung von Oracle Enterprise Performance Management Cloud-Umgebungen dauert in der Regel deutlich weniger als die dafür vorgesehene eine Stunde.

Die tatsächliche Dauer der täglichen Wartung der Umgebung wird als Wert der Kennzahl für die Dauer der täglichen Wartung in Minuten im Abschnitt zu operativen Metriken des Aktivitätsberichts erfasst. Wenn Sie nicht eine Stunde warten möchten, bis Sie die Umgebung verwenden können, verwenden Sie eine benutzerdefinierte Version dieses Skripts, um Benutzer darüber zu informieren, dass die tägliche Wartung abgeschlossen ist, sodass sie ihre Aktivitäten fortsetzen können.

Windows-Skript

Erstellen Sie die Datei daily_maintenance_completed.ps1, indem Sie das folgende PowerShell-Skript kopieren. Informationen zum Aktualisieren des Skripts für die eigene Verwendung finden Sie unter Skripte ausführen.
# Daily Maintenance Completed Notification script
#
# Update the following parameters
# -------------------------------
$emailaddresses=user1@oracle.com,user2@oracle.com
# -------------------------------

$username=$args[0]
$password=$args[1]
$url=$args[2]

if ($($args.count) -ne 3) {
    echo "Usage: ./daily_maintenance_completed.ps1 <USERNAME> <PASSWORD> <URL>"
    exit 1
}

$amw_time=""

function getDailyMaintenanceStartTime {
    $amwstring=$(epmautomate.bat getDailyMaintenanceStartTime)
    $elements=$amwstring.split(' ')
    $amwtime=$elements[0]
    return $amwtime
}

function goToSleep ($amw_time){
    $current_mdy=Get-Date -AsUTC -UFormat "%m/%d/%Y"
    $current_date_time=Get-Date -AsUTC -UFormat "%m/%d/%Y %H:%M:%S"
    $current_epoch=Get-Date -Date $current_date_time -UFormat "%s"
    $target_date_time=[DateTime]"${current_mdy} ${amw_time}"
    $target_epoch=Get-Date -Date $target_date_time -UFormat "%s"
    $sleep_seconds=$target_epoch - $current_epoch

    # Today's AMW start time has already passed, so add 24 hours to sleep_seconds
    if ($sleep_seconds -lt 0) {
        $sleep_seconds=$sleep_seconds + 86400
    }

    $sleep_ts=New-TimeSpan -Seconds ${sleep_seconds}
    $sleep_hms="${sleep_ts}" -replace '^\d+?\.'

    echo "Current time is ${current_date_time}. Sleeping for ${sleep_hms}, until daily maintenance start time of ${amw_time}."
    Start-Sleep -Seconds $sleep_seconds
}

function attemptLogin {
    $serverdown=$False
    while ($true) {
        epmautomate.bat login ${username} ${password} ${url}
        if ($?) { # login succeeded
            if ($serverdown) { # server has been brought down
                echo "Daily maintenance processing has completed ..."
                break
            } else { # server has not yet been brought down
                echo "Daily maintenance processing has not yet started. Sleeping for 2 minutes before the next check ..."
                Start-Sleep -Seconds 120
            }
        } else { # login failed
            if ($serverdown) { # server has been brought down
                echo "Waiting for daily maintenance processing to complete. Sleeping for 2 minutes before the next check ..."
                Start-Sleep -Seconds 120
            } else { # server has not yet been brought down
                echo "Daily maintenance processing is now beginning. Sleeping for 2 minutes before the next check ..."
                Start-Sleep -Seconds 120
                $serverdown=$True
            }
        }
    }
}

function sendNotification {
    $servername=$url.split("/")[2];
    $subject="Daily maintenance processing has completed"
    $formattedmessage="Daily maintenance processing has completed for server ${servername}"
    $emailaddresses=${emailaddresses}.replace(',',';')

    echo "Mailing report"
    epmautomate.bat sendmail "${emailaddresses}" "${subject}" Body="${formattedmessage}"
}

echo "Beginning daily maintenance completion notification script."
echo "Logging into server ..."
epmautomate.bat login ${username} ${password} ${url}
$amwtime=getDailyMaintenanceStartTime
goToSleep ($amwtime)
attemptLogin
sendNotification
echo "Logging out of server ..."
epmautomate.bat logout
echo "Script processing has completed."

Linux-/UNIX-Skript

Erstellen Sie die Datei daily_maintenance_completed.sh, indem Sie das folgende Skript kopieren. Informationen zum Aktualisieren des Skripts für die eigene Verwendung finden Sie unter Skripte ausführen.
#!/bin/bash
# Update the following parameters
# -------------------------------
epmautomatescript="LOCATION_EPM_AUTOMATE_EXECUTABLE"
javahome="LOCATION_JAVA_HOME"
emailaddresses=EMAIL_ADDRESS_1,EMAIL_ADDRESS_2,EMAIL_ADDRESS_N
# -------------------------------

username="$1"
password="$2"
url="$3"

export JAVA_HOME=${javahome}

if [ "$#" -ne 3 ]; then
    echo "Usage: ./daily_maintenance_completed.sh <USERNAME> <PASSWORD> <URL>"
    exit 1
fi

amw_time=""

getDailyMaintenanceStartTime() {
    amw_time=$(${epmautomatescript} getDailyMaintenanceStartTime | cut -d' ' -f1)
}

goToSleep() {
    current_mdy=$(date -u +%m/%d/%Y)
    current_date_time=$(date -u)
    current_epoch=$(date +%s)
    target_epoch=$(date -d "${current_mdy} ${amw_time}" +%s)
    sleep_seconds=$(($target_epoch - $current_epoch))

    # Today's AMW start time has already passed, so add 24 hours to sleep_seconds
    if [[ ${sleep_seconds} -lt 0 ]]
    then
        sleep_seconds=$((sleep_seconds + 86400))
    fi

    sleep_hms=$(date -d@${sleep_seconds} -u +%H:%M:%S)

    echo "Current time is ${current_date_time}. Sleeping for ${sleep_hms}, until daily maintenance start time of ${amw_time}."
    sleep $sleep_seconds
}

attemptLogin() {
    local serverdown=1
    while true
    do
        ${epmautomatescript} login ${username} ${password} ${url}
        if [[ $? -eq 0 ]] # login succeeded
        then
            if [[ ${serverdown} -eq 0 ]] # server has been brought down
            then
                echo "Daily maintenance processing has completed"
                break
            else # server has not yet been brought down
                echo "Daily maintenance processing has not yet started. Sleeping for 2 minutes before the next check ..."
                sleep 120
            fi
        else # login failed
            if [[ ${serverdown} -eq 0 ]] # server has been brought down
            then
                echo "Waiting for daily maintenance processing to complete. Sleeping for 2 minutes before the next check ..."
                sleep 120
            else # server has not yet been brought down
                echo "Daily maintenance processing is now beginning. Sleeping for 2 minutes before the next check ..."
                sleep 120
                serverdown=0
            fi
        fi
    done
}

sendNotification()
{
    local servername=$(echo "${url}" | cut -d '/' -f3- | rev | cut -d':' -f2- | rev)
    local subject="Daily maintenance processing has completed"
    local formattedmessage="Daily maintenance processing has completed for server ${servername}"
    local emailaddresses=$(echo ${emailaddresses} | sed "s/,/;/g")

    echo "Mailing report"
    ${epmautomatescript} sendmail "${emailaddresses}" "${subject}" Body="${formattedmessage}"
}

echo "Beginning daily maintenance completion notification script."
echo "Logging into server ..."
${epmautomatescript} login ${username} ${password} ${url}
getDailyMaintenanceStartTime
goToSleep
attemptLogin
sendNotification
echo "Logging out of server ..."
${epmautomatescript} logout
echo "Script processing has completed."

Serverseitiges Groovy-Skript

Erstellen Sie das Groovy-Skript daily_maintenance_completed, indem Sie den folgenden Code kopieren. Informationen zum Aktualisieren des Skripts für die eigene Verwendung finden Sie unter Skripte ausführen.

// Daily Maintenance Completed Notification script

// Update the following parameters
// -------------------------------
String username="USERNAME"
String password="PASSWORD"
String url="URL OF THE ENVIRONMENT"
String emailaddresses="EMAIL_ADDRESS_1,EMAIL_ADDRESS_2,EMAIL_ADDRESS_N"
// -------------------------------

def LogMessage(String message) {
    def date = new Date()
    def sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss")
    println('[' + sdf.format(date) + '] ' + message);
}

def LogOperationStatus(EpmAutomateStatus opstatus) {
    def returncode = opstatus.getStatus()
    if (returncode != 0){
        LogMessage(opstatus.getOutput())
    }
    LogMessage('return code: ' + returncode)
}

def getDailyMaintenanceStartTime(EpmAutomate automate) {
    LogMessage("Operation: getDailyMaintenanceStartTime")
    EpmAutomateStatus amwtimestatus = automate.execute('getDailyMaintenanceStartTime')
    LogOperationStatus(amwtimestatus)
    def amwstring=(amwtimestatus.getOutput())
    def elements=amwstring.split(' ')
    def amwtime=elements[0]
    return amwtime
}

def goToSleep(String amw_time){
    def date = new Date()
    def current_mdy = new SimpleDateFormat("MM/dd/yyyy")
    def current_date_time = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss")
    float current_epoch = date.getTime() / 1000
    def pattern = "MM/dd/yyyy HH:mm:ss"
    def input = current_mdy.format(date) + " " + amw_time + ":00"
    def target_date_time = Date.parse(pattern, input)
    float target_epoch = target_date_time.getTime() / 1000
    int sleep_seconds = Math.round(target_epoch - current_epoch)

    //Today's AMW start time has already passed, so add 24 hours to sleep_seconds
    if (sleep_seconds < 0) {
        sleep_seconds = sleep_seconds + 86400
    }
    
    def sleep_milliseconds = sleep_seconds * 1000
    LogMessage("Current time is " + current_date_time.format(date) + ". Sleeping until daily maintenance start time of " + amw_time + ":00.")
    sleep(sleep_milliseconds)
}

def attemptLogin(EpmAutomate automate, String username, String password, String url) {
    def serverdown=1
    while (true) {
        LogMessage("Operation: login " + username + " " + password + " " + url)
        EpmAutomateStatus status = automate.execute('login',username,password,url)
        def returncode = status.getStatus()
        if (returncode == 0) { 
            if (serverdown == 0){
                LogMessage("Daily maintenance processing has completed ...")
                break
            } else {
                LogMessage("Daily maintenance processing has not yet started. Sleeping for 2 minutes before the next check ...")
                sleep(120000)
            }
        } else {
            if (serverdown == 0){
                LogMessage("Waiting for daily maintenance processing to complete. Sleeping for 2 minutes before the next check ...")
                sleep(120000)
            } else {
                LogMessage("Daily maintenance processing is now beginning. Sleeping for 2 minutes before the next check ...")
                sleep(120000)
                serverdown=0
            }
        }
    }
}

def sendNotification(EpmAutomate automate, String url, String emailaddresses) {
    def servername=url.tokenize("/")[-1];
    def subject="Daily maintenance processing has completed"
    def formattedmessage="Daily maintenance processing has completed for server " + servername
    def emailaddressesformatted = emailaddresses.replaceAll(',',';')

    LogMessage("Operation: sendmail " + emailaddressesformatted + " " + subject + " Body=" + formattedmessage)
    EpmAutomateStatus status = automate.execute('sendmail',emailaddressesformatted,subject,'Body=' + formattedmessage)
    LogOperationStatus(status)
}

LogMessage("Beginning daily maintenance completion notification script.")

EpmAutomate automate = getEpmAutomate()

LogMessage("Operation: login " + username + " " + password + " " + url)
EpmAutomateStatus status = automate.execute('login',username,password,url)
LogOperationStatus(status)

String amwtime = getDailyMaintenanceStartTime(automate)
goToSleep (amwtime)
attemptLogin(automate,username,password,url)
sendNotification(automate,url,emailaddresses)

LogMessage("Operation: logout ")
status = automate.execute('logout')
LogOperationStatus(status)

LogMessage ("Script processing has completed.")

Skripte ausführen

Windows und Linux/UNIX
  1. Erstellen Sie die Datei daily_maintenance_completed.ps1 oder daily_maintenance_completed.sh, indem Sie das Skript aus einem vorhergehenden Abschnitt kopieren.
  2. Aktualisieren Sie das Skript:
    • Windows: Aktualisieren Sie den Wert von emailaddresses mit einer kommagetrennten Liste von E-Mail-Adressen, die benachrichtigt werden sollen, wenn die tägliche Wartung abgeschlossen ist.
    • Linux/UNIX: Aktualisieren Sie die folgenden Variablen:
      • epmautomatescript mit dem Speicherort der ausführbaren Datei für EPM Automate. Beispiel: epmautomatescript="/home/utils/EPMAutomate/bin/epmautomate.sh"
      • javahome mit dem Verzeichnis, in dem das von EPM Automate verwendete JDK installiert ist. Beispiel: "/home/user1/jdk1.8.0_191"
      • emailaddresses mit einer kommagetrennten Liste von E-Mail-Adressen, die benachrichtigt werden sollen, wenn die tägliche Wartung abgeschlossen ist. Beispiel: jdoe@example.com,jane_doe@example.com
  3. Navigieren Sie in einem Befehlsfenster oder in einer Befehlskonsole zu dem Ordner, in dem das Skript daily_maintenance_completed gespeichert ist.
  4. Führen Sie diesen Befehl aus:
    • Windows: ./daily_maintenance_completed.ps1 USERNAME PASSWORD URL
    • Linux/UNIX: ./daily_maintenance_completed.sh USERNAME PASSWORD URL, wobei Folgendes gilt:
      • USERNAME ist der Benutzername eines Serviceadministrators.
      • PASSWORD ist das Kennwort des Serviceadministrators.
      • URL ist die URL der EPM Cloud-Umgebung.
Serverseitiges Groovy-Skript:
  1. Erstellen Sie das Groovy-Skript daily_maintenance_completed.groovy, indem Sie es aus einem vorhergehenden Abschnitt kopieren.
  2. Aktualisieren Sie die folgenden Werte:
    • username mit dem Benutzernamen eines Serviceadministrators.
    • password mit dem Kennwort des Serviceadministrators
    • url mit der URL der EPM Cloud-Umgebung, für die die Benachrichtigung über den Abschluss der täglichen Wartung erfolgen muss. Beispiel: . Beispiel: https://testExample-idDomain.pbcs.us1.oraclecloud.com
    • emailaddresses mit einer kommagetrennten Liste von E-Mail-Adressen, die benachrichtigt werden sollen, wenn die tägliche Wartung abgeschlossen ist.
  3. Verwenden Sie das Groovy-Fenster in einem EPM Cloud-Geschäftsprozess, oder automatisieren Sie die Skriptausführung mit runBusinessRule. Weitere Informationen finden Sie in den folgenden Informationsquellen: