若要使用主要環境將待命環境維持在最新狀態,請在每日維護於主要環境完成之後,立即使用這些指令碼將 Oracle Fusion Cloud Enterprise Performance Management 主要環境複製至待命環境。
這些自訂指令碼會識別已針對該日排定的每日維護是否已完成,然後再複製環境。
Windows 指令碼
複製下列 PowerShell 指令碼以建立dailyclone.ps1
。
# Clone Environment script # # Update the following parameters # ------------------------------- $users_and_predefined_roles="false" $daily_maintenance_start_time="true" $data_management="true" $app_audit="true" $job_console="true" $stored_snapshots_and_files="false" # ------------------------------- $source_username=$args[0] $source_password=$args[1] $source_url=$args[2] $target_username=$args[3] $target_password=$args[4] $target_url=$args[5] if ($($args.count) -ne 6) { echo "Usage: ./dailyclone.ps1 <SOURCE USERNAME> <SOURCE PASSWORD> <SOURCE URL> <TARGET USERNAME> <TARGET PASSWORD> <TARGET 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 deleteArtifactSnapshotIfExists { if (artifactSnapshotExists) { $command_del=$(epmautomate.bat deletefile "Artifact Snapshot") } } function artifactSnapshotExists { $filelist=$(epmautomate.bat listfiles) if ("$filelist".contains("Artifact Snapshot")) { return $true else return $false } } function cloneEnvironment { echo "Checking to see if daily maintenance processing has completed ..." while ($true) { if (artifactSnapshotExists) { echo "Daily maintenance processing has completed ..." break } else { echo "Sleeping for 30 seconds before the next check to see if daily maintenance processing has completed ..." Start-Sleep -Seconds 30 } } echo "Encrypting target password ..." epmautomate.bat encrypt "${target_password}" "oracleKey" "target_password.epw" echo "Cloning environment ..." epmautomate.bat cloneEnvironment "${target_username}" "target_password.epw" "${target_url}" "SnapshotName=Artifact Snapshot" "UsersAndPreDefinedRoles=${users_and_predefined_roles}" "DataManagement=${data_management}" "appAudit=${app_audit}" "jobConsole=${job_console}" "storedSnapshotsAndFiles=${stored_snapshots_and_files}" "dailyMaintenanceStartTime=${daily_maintenance_start_time}" } echo "Beginning clone environment script." echo "Logging into server ..." epmautomate.bat login ${source_username} ${source_password} ${source_url} $amwtime=getDailyMaintenanceStartTime goToSleep ($amwtime) deleteArtifactSnapshotIfExists cloneEnvironment echo "Logging out of server ..." epmautomate.bat logout echo "Clone environment script processing has completed."
Linux/UNIX 指令碼
複製下列指令碼以建立dailyclone.sh
。
#!/bin/bash # Update the following parameters # ------------------------------- epmautomatescript="LOCATION_EPM_AUTOMATE_EXECUTABLE" javahome="LOCATION_JAVA_HOME" users_and_predefined_roles="false" data_management="true" app_audit="true" job_console="true" stored_snapshots_and_files="false" daily_maintenance_start_time="true" # ------------------------------- source_username="$1" source_password="$2" source_url="$3" target_username="$4" target_password="$5" target_url="$6" export JAVA_HOME=${javahome} if [ "$#" -ne 6 ]; then echo "Usage: ./dailyclone.sh SOURCE_USERNAME SOURCE_PASSWORD SOURCE_URL TARGET_USERNAME TARGET_PASSWORD TARGET_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 } deleteArtifactSnapshotIfExists() { found=1 filelist=$(${epmautomatescript} listfiles) if [[ ${filelist} == *"Artifact Snapshot"* ]] then command_del=$(${epmautomatescript} deletefile "Artifact Snapshot") fi } artifactSnapshotExists() { found=1 filelist=$(${epmautomatescript} listfiles) if [[ ${filelist} == *"Artifact Snapshot"* ]] then found=0 else found=1 fi echo ${found} } cloneEnvironment() { local found=1 while true do found=$(artifactSnapshotExists) if [[ ${found} -eq 0 ]] then echo "Daily maintenance processing has completed ..." break else echo "Sleeping for 30 seconds before the next check to see if daily maintenance processing has completed ..." sleep 30 fi done echo "Encrypting target password ..." ${epmautomatescript} encrypt "${target_password}" "oracleKey" "target_password.epw" echo "Cloning environment ..." ${epmautomatescript} cloneEnvironment "${target_username}" "target_password.epw" "${target_url}" "SnapshotName=Artifact Snapshot" "UsersAndPreDefinedRoles=${users_and_predefined_roles}" "DataManagement=${data_management}" "appAudit=${app_audit}" "jobConsole=${job_console}" "storedSnapshotsAndFiles=${stored_snapshots_and_files}" "dailyMaintenanceStartTime=${daily_maintenance_start_time}" } echo "Beginning clone environment script." echo "Logging into server ..." ${epmautomatescript} login ${source_username} ${source_password} ${source_url} getDailyMaintenanceStartTime goToSleep deleteArtifactSnapshotIfExists cloneEnvironment echo "Logging out of server ..." ${epmautomatescript} logout echo "Clone environment script processing has completed."
Groovy 指令碼
複製下列程式碼以建立dailyclone
Groovy 指令碼。
// Clone Environment script // Update the following parameters String source_username="USERNAME" String source_password="PASSWORD!" String source_url="URL OF THE SOURCE ENVIRONMENT" String target_username="USERNAME" String target_password="PASSWORD" String target_url="URL OF THE TARGET ENVIRONMENT" String snapshot_name="Artifact Snapshot" // ------------------------------- // Do not update the following parameters String users_and_predefined_roles="false" String data_management="true" String app_audit="true" String job_console="true" String stored_snapshots_and_files="false" String daily_maintenance_start_time="true" // ------------------------------- 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) } boolean artifactSnapshotExists(EpmAutomate automate,String snapshot_name) { LogMessage("Operation: listfiles") EpmAutomateStatus listfilesstatus = automate.execute('listfiles') String filelist=(listfilesstatus.getItemsList()) LogOperationStatus(listfilesstatus) if (filelist.contains(snapshot_name)) { return true } else { return false } } def deleteArtifactSnapshotIfExists(EpmAutomate automate,String snapshot_name){ if (artifactSnapshotExists(automate,snapshot_name)) { LogMessage("Operation: deletefile " + snapshot_name) EpmAutomateStatus deletefilestatus = automate.execute('deletefile',snapshot_name) LogOperationStatus(deletefilestatus) } } def waitForDailyMaintenanceToComplete(EpmAutomate automate,String snapshot_name) { LogMessage("Checking to see if daily maintenance processing has completed ...") while (true) { if (artifactSnapshotExists(automate,snapshot_name)) { LogMessage("Daily maintenance processing has completed ...") break } else { LogMessage("Sleeping for 30 seconds before the next check to see if daily maintenance processing has completed ...") sleep(30000) } } } LogMessage("Clone environment script processing beginning ...") EpmAutomate automate = getEpmAutomate() LogMessage("Operation: login " + source_username + " " + source_password + " " + source_url) EpmAutomateStatus status = automate.execute('login',source_username,source_password,source_url) LogOperationStatus(status) String amwtime = getDailyMaintenanceStartTime(automate) goToSleep (amwtime) deleteArtifactSnapshotIfExists(automate,snapshot_name) waitForDailyMaintenanceToComplete(automate,snapshot_name) LogMessage("Operation: encrypt " + target_password + " oracleKey target_password.epw") status = automate.execute('encrypt',target_password,'oracleKey','target_password.epw') LogOperationStatus(status) LogMessage("Operation: cloneEnvironment " + target_username + " target_password.epw " + target_url + " SnapshotName=" + snapshot_name + " UsersAndPreDefinedRoles=" + users_and_predefined_roles + " DataManagement=" + data_management + " appAudit=" + app_audit + " jobConsole=" + job_console + " storedSnapshotsAndFiles=" + stored_snapshots_and_files + " dailyMaintenanceStartTime=" + daily_maintenance_start_time) EpmAutomateStatus cloneenvironmentstatus = automate.execute('cloneEnvironment',target_username,"target_password.epw",target_url,"SnapshotName=" + snapshot_name,"UsersAndPreDefinedRoles=" + users_and_predefined_roles,"DataManagement=" + data_management,"appAudit=" + app_audit,"jobConsole=" + job_console,"storedSnapshotsAndFiles=" + stored_snapshots_and_files,"dailyMaintenanceStartTime=" + daily_maintenance_start_time) LogOperationStatus(cloneenvironmentstatus) LogMessage("Operation: logout ") status = automate.execute('logout') LogOperationStatus(status) LogMessage ("Clone environment script processing has completed.")
執行指令碼
dailyclone.ps1
、dailyclone.sh
或 dailyclone
Groovy 指令碼。dailyclone.sh
的更新:
epmautomatescript
以及 EPM Automate 可執行檔的位置。範例:epmautomatescript="/home/utils/EPMAutomate/bin/epmautomate.sh"
javahome
改成 EPM Automate 使用之 JDK 的安裝目錄。範例:"/home/user1/jdk1.8.0_191"
dailyclone.ps1
與 dailyclone.sh
的更新:
users_and_predefined_roles
:將此值設定為 true
會複製使用者與其預先定義角色指派 (一律會複製存取控制群組)。data_management
:將此值設定為 false
,則不會複製資料整合記錄。請注意,只有當來源環境和目標環境都在同一個月度更新或目標環境比來源環境更早進行一次更新,才會複製資料整合記錄。例如,您可以將 22.01「資料管理」記錄複製到另一個 22.01 環境或僅複製到 22.02 環境。
若為 Narrative Reporting 與 Oracle Fusion Cloud Enterprise Data Management 環境則會予以忽略。
app_audit
:如果您不想要複製 Planning、FreeForm 與 Enterprise Profitability and Cost Management 應用程式的應用程式稽核資料,請將此值設定為 false
。
一律會複製 Financial Consolidation and Close 與 Tax Reporting 稽核資訊。
job_console
:如果您不想要複製工作主控台資料,請將此值設定為 false
。stored_snapshots_and_files
:如果您想要複製來源環境收件匣與寄件匣中的頂層資料夾 (一律不會複製子資料夾),請將此值設定為 true
。daily_maintenance_start_time
:如果您不想要將已複製之目標環境的維護開始時間重設為來源環境的維護開始時間,請將此值設定為 false
。dailyclone
Groovy 指令碼的更新:
source_username
是服務管理員的使用者名稱。必須具備識別網域管理員角色才能複製使用者與預先定義角色。source_password
是 SOURCE_USERNAME
識別之使用者的密碼。source_url
是您要複製之環境的 URL。target_username
是服務管理員的使用者名稱。必須具備識別網域管理員角色才能複製使用者與預先定義角色。target_password
是 TARGET_USERNAME
識別之使用者的密碼。target_URL
是目標環境的 URL。dailyclone.ps1
、dailyclone.sh
或 dailyclone
Groovy 指令碼:
Windows
dailyclone.ps1
的資料夾。./dailyclone.ps1 SOURCE_USERNAME SOURCE_PASSWORD SOURCE_URL TARGET_USERNAME TARGET_PASSWORD TARGET_URL
。查看下列表格以瞭解這些值的描述。Table 3-7 參數的描述
參數 | 描述 |
---|---|
SOURCE_USERNAME |
服務管理員的使用者名稱。此外,此使用者必須具備識別網域管理員角色才能複製使用者與預先定義角色。 |
SOURCE_PASSWORD |
SOURCE_USERNAME 識別之使用者的密碼。 |
SOURCE_URL |
您要複製之環境的 URL。 |
TARGET_USERNAME |
目標環境中服務管理員的使用者名稱。此外,此使用者必須具備識別網域管理員角色才能複製使用者與預先定義角色。 |
TARGET_PASSWORD |
TARGET_USERNAME 識別之使用者的密碼。 |
TARGET_URL |
目標環境的 URL。 |
dailyclone.sh
的目錄。./dailyclone.sh SOURCE_USERNAME SOURCE_PASSWORD SOURCE_URL TARGET_USERNAME TARGET_PASSWORD TARGET_URL
。查看上述表格以瞭解這些值的描述。