Inform Users of Daily Maintenance Completion
The daily maintenance of Oracle Enterprise Performance Management Cloud environments usually takes a much shorter time than the one hour earmarked for it.
The actual daily maintenance duration of the environment is recorded as the value of the "Daily Maintenance Duration in Minutes" metric in the "Operations Metrics" section of the Activity Report. If you do not want to wait for the whole hour before using the environment, use a custom version of this script to inform users that the daily maintenance is complete so that they can resume activities.
Windows Script
Createdaily_maintenance_completed.ps1
by copying the following PowerShell
script. See Running the Script for information on updating the script
for your use.# 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 Script
Createdaily_maintenance_completed.sh
by copying the
following script. See Running the Script for information on updating the script
for your use.#!/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."
Server-Side Groovy Script
Create daily_maintenance_completed
Groovy script by copying the
following code. See Running the Script for information on updating the
script for your use.
// 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.")
Running the Script
Windows and Linux/UNIX- Create
daily_maintenance_completed.ps1
ordaily_maintenance_completed.sh
by copying the script from a preceding section. - Update script:
- Windows: Update the value of
emailaddresses
with a comma separated list of email addresses that should be notified when the daily maintenance is complete. - Linux/UNIX: Update these variables:
epmautomatescript
with the location of the EPM Automate executable. Example:epmautomatescript="/home/utils/EPMAutomate/bin/epmautomate.sh"
javahome
with the directory where the JDK used by EPM Automate is installed. For example:"/home/user1/jdk1.8.0_191"
emailaddresses
with a comma separated list of email addresses that should be notified when the daily maintenance is complete. For example:jdoe@example.com,jane_doe@example.com
- Windows: Update the value of
- In a Command Window or Console, navigate to the folder where the
daily_maintenance_completed
script is stored. - Run this command:
- Windows:
./daily_maintenance_completed.ps1 USERNAME PASSWORD URL
- Linux/UNIX:
./daily_maintenance_completed.sh USERNAME PASSWORD URL
, where:USERNAME
is the user name of a Service AdministratorPASSWORD
is the password of the Service AdministratorURL
is the URL of the EPM Cloud environment
- Windows:
- Create
daily_maintenance_completed.groovy
Groovy script by copying it from a preceding section. - Update these values.
username
with the username of a Service Administrator.password
with the password of the Service Administratorurl
with the URL of the EPM Cloud environment for which the daily maintenance completion notification needs to be made. For example: . Example:https://testExample-idDomain.pbcs.us1.oraclecloud.com
emailaddresses
with a comma separated list of email addresses that should be notified when the daily maintenance is complete.
- Use the Groovy screen in an EPM Cloud business process or
automate the script execution using runBusinessRule. For more information see these
information sources:
- Running Commands without Installing EPM Automate
- Using Groovy Rules in Administering Planning