Clean up logging
This commit is contained in:
62
rsc_clone.sh
62
rsc_clone.sh
@@ -23,13 +23,23 @@
|
|||||||
# DB_CREATE_FILE_DEST=/u01/app/oracle/oradata/NEWNAME/
|
# DB_CREATE_FILE_DEST=/u01/app/oracle/oradata/NEWNAME/
|
||||||
# AUDIT_FILE_DEST='/u01/app/oracle/admin/NEWNAME/adump'
|
# AUDIT_FILE_DEST='/u01/app/oracle/admin/NEWNAME/adump'
|
||||||
|
|
||||||
usage() { echo "Usage: $0 -n <newname> -o <optionsfile> -h <targethost> [-s sourcehost] [-t \"YYYY-MM-DD HH:MM:SS\"] [-d] <srcdb>" 1>&2; exit 1; }
|
usage() { log_error "Usage: $0 -n <newname> -o <optionsfile> -h <targethost> [-s sourcehost] [-t \"YYYY-MM-DD HH:MM:SS\"] [-d] <srcdb>"; exit 1; }
|
||||||
|
|
||||||
MYDIR="$(dirname "$(realpath "$0")")"
|
MYDIR="$(dirname "$(realpath "$0")")"
|
||||||
|
|
||||||
|
# Support long option --verbose by translating to -v before getopts
|
||||||
|
for arg in "$@"; do
|
||||||
|
case "$arg" in
|
||||||
|
--verbose)
|
||||||
|
set -- "${@/--verbose/-v}"
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
source $MYDIR/rsc_ops.sh
|
source $MYDIR/rsc_ops.sh
|
||||||
|
|
||||||
while getopts "n:o:t:h:s:d" o; do
|
while getopts "n:o:t:h:s:d:v" o; do
|
||||||
case "${o}" in
|
case "${o}" in
|
||||||
n)
|
n)
|
||||||
newName=${OPTARG}
|
newName=${OPTARG}
|
||||||
@@ -49,6 +59,9 @@ while getopts "n:o:t:h:s:d" o; do
|
|||||||
d)
|
d)
|
||||||
dryrun=true
|
dryrun=true
|
||||||
;;
|
;;
|
||||||
|
v)
|
||||||
|
VERBOSE=1
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
usage
|
usage
|
||||||
;;
|
;;
|
||||||
@@ -64,7 +77,7 @@ fi
|
|||||||
|
|
||||||
# Check if optionsFile exists
|
# Check if optionsFile exists
|
||||||
if [[ ! -f "$optionsFile" ]]; then
|
if [[ ! -f "$optionsFile" ]]; then
|
||||||
echo "ERROR: Options file '$optionsFile' does not exist."
|
log_error "Options file '$optionsFile' does not exist."
|
||||||
exit_with_error
|
exit_with_error
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -139,7 +152,7 @@ get_latest_pit() {
|
|||||||
|
|
||||||
# Get latest endTime
|
# Get latest endTime
|
||||||
latest_endtime=$(cat /tmp/rbkresponse.$$ | jq -r '.data.oracleRecoverableRanges.data[] | .endTime' | sort -r | head -n 1)
|
latest_endtime=$(cat /tmp/rbkresponse.$$ | jq -r '.data.oracleRecoverableRanges.data[] | .endTime' | sort -r | head -n 1)
|
||||||
echo "Latest PIT (ISO8601): $latest_endtime"
|
log_info "Latest PIT (ISO8601): $latest_endtime"
|
||||||
|
|
||||||
# Convert to unixtime in milliseconds
|
# Convert to unixtime in milliseconds
|
||||||
latest_unixtime_ms=$(date -d "$latest_endtime" +%s 2>/dev/null)
|
latest_unixtime_ms=$(date -d "$latest_endtime" +%s 2>/dev/null)
|
||||||
@@ -148,11 +161,11 @@ get_latest_pit() {
|
|||||||
latest_unixtime_ms=$(gdate -d "$latest_endtime" +%s 2>/dev/null)
|
latest_unixtime_ms=$(gdate -d "$latest_endtime" +%s 2>/dev/null)
|
||||||
fi
|
fi
|
||||||
if [[ -z "$latest_unixtime_ms" ]]; then
|
if [[ -z "$latest_unixtime_ms" ]]; then
|
||||||
echo "ERROR: Unable to convert $latest_endtime to unixtime"
|
log_error "Unable to convert $latest_endtime to unixtime"
|
||||||
exit 5
|
exit 5
|
||||||
fi
|
fi
|
||||||
latest_unixtime_ms=$((latest_unixtime_ms * 1000))
|
latest_unixtime_ms=$((latest_unixtime_ms * 1000))
|
||||||
echo "Latest PIT unixtime (ms): $latest_unixtime_ms"
|
log_info "Latest PIT unixtime (ms): $latest_unixtime_ms"
|
||||||
|
|
||||||
export latest_unixtime_ms
|
export latest_unixtime_ms
|
||||||
}
|
}
|
||||||
@@ -188,7 +201,7 @@ get_oracle_host_id() {
|
|||||||
host_ids=$(cat /tmp/rbkresponse.$$ | jq -r '.data.oracleTopLevelDescendants.nodes[] | .id')
|
host_ids=$(cat /tmp/rbkresponse.$$ | jq -r '.data.oracleTopLevelDescendants.nodes[] | .id')
|
||||||
host_count=$(echo "$host_ids" | grep -c .)
|
host_count=$(echo "$host_ids" | grep -c .)
|
||||||
if [[ $host_count -ne 1 ]]; then
|
if [[ $host_count -ne 1 ]]; then
|
||||||
echo "ERROR: Multiple hosts found for '$1':"
|
log_error "Multiple hosts found for '$1':"
|
||||||
cat /tmp/rbkresponse.$$ | jq -r '.data.oracleTopLevelDescendants.nodes[] | "\(.name) \(.id)"'
|
cat /tmp/rbkresponse.$$ | jq -r '.data.oracleTopLevelDescendants.nodes[] | "\(.name) \(.id)"'
|
||||||
exit_with_error
|
exit_with_error
|
||||||
fi
|
fi
|
||||||
@@ -199,7 +212,7 @@ get_oracle_host_id() {
|
|||||||
# If $1 looks like a dbid (contains hyphens), use it directly and skip DB lookup
|
# If $1 looks like a dbid (contains hyphens), use it directly and skip DB lookup
|
||||||
if [[ "$1" == *-* ]]; then
|
if [[ "$1" == *-* ]]; then
|
||||||
dbid="$1"
|
dbid="$1"
|
||||||
echo "INFO: Using provided dbid: $dbid"
|
log_info "Using provided dbid: $dbid"
|
||||||
|
|
||||||
gql_lookupCdmId='query OracleDatabase($fid: UUID!) {
|
gql_lookupCdmId='query OracleDatabase($fid: UUID!) {
|
||||||
oracleDatabase(fid: $fid) {
|
oracleDatabase(fid: $fid) {
|
||||||
@@ -217,10 +230,10 @@ if [[ "$1" == *-* ]]; then
|
|||||||
|
|
||||||
cdmId=$(cat /tmp/rbkresponse.$$ | jq -r '.data.oracleDatabase.cluster.id')
|
cdmId=$(cat /tmp/rbkresponse.$$ | jq -r '.data.oracleDatabase.cluster.id')
|
||||||
if [[ -z "$cdmId" ]]; then
|
if [[ -z "$cdmId" ]]; then
|
||||||
echo "ERROR: Could not find CDM ID for dbid '$dbid'"
|
log_error "Could not find CDM ID for dbid '$dbid'"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
echo "CDM ID is $cdmId"
|
log_info "CDM ID is $cdmId"
|
||||||
|
|
||||||
else
|
else
|
||||||
gql_DBListQuery='query OracleDatabases($filter: [Filter!]) {
|
gql_DBListQuery='query OracleDatabases($filter: [Filter!]) {
|
||||||
@@ -268,7 +281,7 @@ oracleDatabases(filter: $filter) {
|
|||||||
|
|
||||||
dbid_count=$(echo "$dbid" | grep -c .)
|
dbid_count=$(echo "$dbid" | grep -c .)
|
||||||
if [[ "$dbid_count" -ne 1 || -z "$dbid" ]]; then
|
if [[ "$dbid_count" -ne 1 || -z "$dbid" ]]; then
|
||||||
echo "ERROR: Expected exactly one database running on node '$node_name', found $dbid_count:"
|
log_error "Expected exactly one database running on node '$node_name', found $dbid_count:"
|
||||||
cat /tmp/rbkresponse.$$ | jq -r '.data.oracleDatabases.nodes[] | "\(.dbUniqueName) \(.logicalPath[0].name) \(.id)"'
|
cat /tmp/rbkresponse.$$ | jq -r '.data.oracleDatabases.nodes[] | "\(.dbUniqueName) \(.logicalPath[0].name) \(.id)"'
|
||||||
cleanup
|
cleanup
|
||||||
exit 4
|
exit 4
|
||||||
@@ -280,7 +293,7 @@ oracleDatabases(filter: $filter) {
|
|||||||
|
|
||||||
dbid_count=$(echo "$dbid" | grep -c .)
|
dbid_count=$(echo "$dbid" | grep -c .)
|
||||||
if [[ "$dbid_count" -ne 1 || -z "$dbid" ]]; then
|
if [[ "$dbid_count" -ne 1 || -z "$dbid" ]]; then
|
||||||
echo "ERROR: Expected exactly one database with name '$1', found $dbid_count:"
|
log_error "Expected exactly one database with name '$1', found $dbid_count:"
|
||||||
cat /tmp/rbkresponse.$$ | jq -r '.data.oracleDatabases.nodes[] | "\(.dbUniqueName) \(.logicalPath[0].name) \(.id)"'
|
cat /tmp/rbkresponse.$$ | jq -r '.data.oracleDatabases.nodes[] | "\(.dbUniqueName) \(.logicalPath[0].name) \(.id)"'
|
||||||
cleanup
|
cleanup
|
||||||
exit 4
|
exit 4
|
||||||
@@ -301,7 +314,7 @@ if [[ -n "${datestring:-}" ]]; then
|
|||||||
unixtime_ms=$((unixtime * 1000))
|
unixtime_ms=$((unixtime * 1000))
|
||||||
echo INFO: Requested time is $datestring which is $utctime in UTC, unixtime is $unixtime
|
echo INFO: Requested time is $datestring which is $utctime in UTC, unixtime is $unixtime
|
||||||
else
|
else
|
||||||
echo INFO: No time specified, using latest PIT
|
log_info "No time specified, using latest PIT"
|
||||||
get_latest_pit
|
get_latest_pit
|
||||||
unixtime_ms=$latest_unixtime_ms
|
unixtime_ms=$latest_unixtime_ms
|
||||||
fi
|
fi
|
||||||
@@ -310,11 +323,11 @@ fi
|
|||||||
get_oracle_host_id "$targetHost"
|
get_oracle_host_id "$targetHost"
|
||||||
|
|
||||||
if [[ -z "$targetHostId" ]]; then
|
if [[ -z "$targetHostId" ]]; then
|
||||||
echo "ERROR: Could not resolve target host ID for '$targetHost'"
|
log_error "Could not resolve target host ID for '$targetHost'"
|
||||||
exit_with_error
|
exit_with_error
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo Target Host ID is $targetHostId
|
log_info "Target Host ID is $targetHostId"
|
||||||
|
|
||||||
cloningOptions=$(template_to_json $optionsFile)
|
cloningOptions=$(template_to_json $optionsFile)
|
||||||
|
|
||||||
@@ -374,7 +387,7 @@ cat /tmp/rbkresponse.$$ | jq
|
|||||||
|
|
||||||
# Save the id from the response
|
# Save the id from the response
|
||||||
job_id=$(cat /tmp/rbkresponse.$$ | jq -r '.data.exportOracleDatabase.id')
|
job_id=$(cat /tmp/rbkresponse.$$ | jq -r '.data.exportOracleDatabase.id')
|
||||||
echo "DEBUG: Job id is $job_id"
|
log_info "Job id is $job_id"
|
||||||
|
|
||||||
gqlCheckStatus='query OracleDatabaseAsyncRequestDetails($input: GetOracleAsyncRequestStatusInput!) {
|
gqlCheckStatus='query OracleDatabaseAsyncRequestDetails($input: GetOracleAsyncRequestStatusInput!) {
|
||||||
oracleDatabaseAsyncRequestDetails(input: $input) {
|
oracleDatabaseAsyncRequestDetails(input: $input) {
|
||||||
@@ -405,25 +418,17 @@ while true; do
|
|||||||
status=$(cat /tmp/rbkresponse.$$ | jq -r '.data.oracleDatabaseAsyncRequestDetails.status')
|
status=$(cat /tmp/rbkresponse.$$ | jq -r '.data.oracleDatabaseAsyncRequestDetails.status')
|
||||||
progress=$(cat /tmp/rbkresponse.$$ | jq -r '.data.oracleDatabaseAsyncRequestDetails.progress')
|
progress=$(cat /tmp/rbkresponse.$$ | jq -r '.data.oracleDatabaseAsyncRequestDetails.progress')
|
||||||
|
|
||||||
echo "Job status: $status $progress percent"
|
log_info "Job status: $status $progress percent"
|
||||||
if [[ "$status" == "FAILED" ]]; then
|
if [[ "$status" == "FAILED" ]]; then
|
||||||
echo "Database clone FAILED"
|
log_error "Database clone FAILED"
|
||||||
cat /tmp/rbkresponse.$$ | jq
|
cat /tmp/rbkresponse.$$ | jq
|
||||||
cleanup
|
cleanup
|
||||||
exit 2
|
exit 2
|
||||||
elif [[ "$status" == "CANCELLED" ]]; then
|
elif [[ "$status" == "CANCELLED" ]]; then
|
||||||
echo "Database clone CANCELLED"
|
log_warn "Database clone CANCELLED"
|
||||||
exit 3
|
exit 3
|
||||||
elif [[ "$status" == "SUCCEEDED" ]]; then
|
elif [[ "$status" == "SUCCEEDED" ]]; then
|
||||||
echo "Database clone SUCCEEDED"
|
log_info "Database clone SUCCEEDED"
|
||||||
cat /tmp/rbkresponse.$$ | jq
|
|
||||||
cleanup
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
sleep 15
|
|
||||||
|
|
||||||
done
|
|
||||||
echo "Database clone SUCCEEDED"
|
|
||||||
cat /tmp/rbkresponse.$$ | jq
|
cat /tmp/rbkresponse.$$ | jq
|
||||||
cleanup
|
cleanup
|
||||||
exit 0
|
exit 0
|
||||||
@@ -432,3 +437,4 @@ done
|
|||||||
|
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
# Options:
|
# Options:
|
||||||
# <targethost> : Host to perform refresh job
|
# <targethost> : Host to perform refresh job
|
||||||
|
|
||||||
usage() { echo "Usage: $0 <host>" 1>&2; exit 1; }
|
usage() { log_error "Usage: $0 <host>"; exit 1; }
|
||||||
|
|
||||||
if [[ -z "$1" ]]; then
|
if [[ -z "$1" ]]; then
|
||||||
usage
|
usage
|
||||||
@@ -18,13 +18,27 @@ fi
|
|||||||
|
|
||||||
MYDIR="$(dirname "$(realpath "$0")")"
|
MYDIR="$(dirname "$(realpath "$0")")"
|
||||||
|
|
||||||
|
# Support -v/--verbose and strip it from positional args
|
||||||
|
NEWARGS=()
|
||||||
|
for arg in "$@"; do
|
||||||
|
case "$arg" in
|
||||||
|
-v|--verbose)
|
||||||
|
VERBOSE=1
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
NEWARGS+=("$arg")
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
set -- "${NEWARGS[@]}"
|
||||||
|
|
||||||
source $MYDIR/rsc_ops.sh
|
source $MYDIR/rsc_ops.sh
|
||||||
|
|
||||||
RBK_HOST=$1
|
RBK_HOST=$1
|
||||||
|
|
||||||
rsc_get_host_id
|
rsc_get_host_id
|
||||||
|
|
||||||
echo "Host ID: $targetHostId"
|
log_info "Host ID: $targetHostId"
|
||||||
|
|
||||||
gql_refreshHost='mutation RefreshHost($input: RefreshHostInput!) {
|
gql_refreshHost='mutation RefreshHost($input: RefreshHostInput!) {
|
||||||
refreshHost(input: $input) {
|
refreshHost(input: $input) {
|
||||||
@@ -48,9 +62,9 @@ variables="{
|
|||||||
gqlQuery="$(echo $gql_refreshHost)"
|
gqlQuery="$(echo $gql_refreshHost)"
|
||||||
gqlVars="$(echo $variables)"
|
gqlVars="$(echo $variables)"
|
||||||
|
|
||||||
echo "Refreshing host $RBK_HOST (ID: $targetHostId)"
|
log_info "Refreshing host $RBK_HOST (ID: $targetHostId)"
|
||||||
|
|
||||||
rsc_gql_query
|
rsc_gql_query
|
||||||
|
|
||||||
echo "Response:"
|
log_info "Response:"
|
||||||
cat /tmp/rbkresponse.$$ | jq
|
cat /tmp/rbkresponse.$$ | jq
|
||||||
@@ -7,9 +7,23 @@
|
|||||||
#
|
#
|
||||||
# usage: rsc_list_slas.sh [filter]
|
# usage: rsc_list_slas.sh [filter]
|
||||||
|
|
||||||
usage() { echo "Usage: $0 [filter]" 1>&2; exit 1; }
|
usage() { log_error "Usage: $0 [filter]"; exit 1; }
|
||||||
|
|
||||||
MYDIR="$(dirname "$(realpath "$0")")"
|
MYDIR="$(dirname "$(realpath "$0")")"
|
||||||
|
# Support -v/--verbose and strip it from positional args so it doesn't become $1
|
||||||
|
NEWARGS=()
|
||||||
|
for arg in "$@"; do
|
||||||
|
case "$arg" in
|
||||||
|
-v|--verbose)
|
||||||
|
VERBOSE=1
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
NEWARGS+=("$arg")
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
set -- "${NEWARGS[@]}"
|
||||||
|
|
||||||
# source $MYDIR/rbk_api.conf
|
# source $MYDIR/rbk_api.conf
|
||||||
source $MYDIR/rsc_ops.sh
|
source $MYDIR/rsc_ops.sh
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
#
|
#
|
||||||
# usage: rsc_log_backup.sh [filter]
|
# usage: rsc_log_backup.sh [filter]
|
||||||
|
|
||||||
usage() { echo "Usage: $0 [filter]" 1>&2; exit 1; }
|
usage() { log_error "Usage: $0 [filter]"; exit 1; }
|
||||||
|
|
||||||
if [[ -z "$1" ]]; then
|
if [[ -z "$1" ]]; then
|
||||||
usage
|
usage
|
||||||
@@ -15,6 +15,19 @@ fi
|
|||||||
|
|
||||||
MYDIR="$(dirname "$(realpath "$0")")"
|
MYDIR="$(dirname "$(realpath "$0")")"
|
||||||
|
|
||||||
|
# Support -v/--verbose and strip it from positional args
|
||||||
|
NEWARGS=()
|
||||||
|
for arg in "$@"; do
|
||||||
|
case "$arg" in
|
||||||
|
-v|--verbose)
|
||||||
|
VERBOSE=1
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
NEWARGS+=("$arg")
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
set -- "${NEWARGS[@]}"
|
||||||
# source $MYDIR/rbk_api.conf
|
# source $MYDIR/rbk_api.conf
|
||||||
source $MYDIR/rsc_ops.sh
|
source $MYDIR/rsc_ops.sh
|
||||||
|
|
||||||
@@ -57,13 +70,13 @@ cdmId=$(cat /tmp/rbkresponse.$$ | jq -r '.data.oracleDatabases.nodes[] | .cluste
|
|||||||
# Check for multiple dbids
|
# Check for multiple dbids
|
||||||
dbid_count=$(echo "$dbid" | wc -l)
|
dbid_count=$(echo "$dbid" | wc -l)
|
||||||
if [[ "$dbid_count" -ne 1 || -z "$dbid" ]]; then
|
if [[ "$dbid_count" -ne 1 || -z "$dbid" ]]; then
|
||||||
echo "ERROR: Expected exactly one database match! found:"
|
log_error "Expected exactly one database match! found:"
|
||||||
cat /tmp/rbkresponse.$$ | jq -r '.data.oracleDatabases.nodes[] | .dbUniqueName'
|
cat /tmp/rbkresponse.$$ | jq -r '.data.oracleDatabases.nodes[] | .dbUniqueName'
|
||||||
cleanup
|
cleanup
|
||||||
exit 4
|
exit 4
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "DEBUG: DB ID is $dbid"
|
log_info "DB ID is $dbid"
|
||||||
variables="{
|
variables="{
|
||||||
\"input\": {
|
\"input\": {
|
||||||
\"id\": \"$dbid\"
|
\"id\": \"$dbid\"
|
||||||
@@ -81,8 +94,8 @@ gqlVars="$(echo $variables)"
|
|||||||
rsc_gql_query
|
rsc_gql_query
|
||||||
|
|
||||||
# Save the id from the response
|
# Save the id from the response
|
||||||
|
log_info "Log backup job id: $(cat /tmp/rbkresponse.$$ | jq -r '.data.takeOnDemandOracleLogSnapshot.id')"
|
||||||
log_backup_id=$(cat /tmp/rbkresponse.$$ | jq -r '.data.takeOnDemandOracleLogSnapshot.id')
|
log_backup_id=$(cat /tmp/rbkresponse.$$ | jq -r '.data.takeOnDemandOracleLogSnapshot.id')
|
||||||
echo "DEBUG: Job id is $log_backup_id"
|
|
||||||
|
|
||||||
gqlCheckStatus='query OracleDatabaseAsyncRequestDetails($input: GetOracleAsyncRequestStatusInput!) {
|
gqlCheckStatus='query OracleDatabaseAsyncRequestDetails($input: GetOracleAsyncRequestStatusInput!) {
|
||||||
oracleDatabaseAsyncRequestDetails(input: $input) {
|
oracleDatabaseAsyncRequestDetails(input: $input) {
|
||||||
@@ -113,17 +126,17 @@ while true; do
|
|||||||
status=$(cat /tmp/rbkresponse.$$ | jq -r '.data.oracleDatabaseAsyncRequestDetails.status')
|
status=$(cat /tmp/rbkresponse.$$ | jq -r '.data.oracleDatabaseAsyncRequestDetails.status')
|
||||||
progress=$(cat /tmp/rbkresponse.$$ | jq -r '.data.oracleDatabaseAsyncRequestDetails.progress')
|
progress=$(cat /tmp/rbkresponse.$$ | jq -r '.data.oracleDatabaseAsyncRequestDetails.progress')
|
||||||
|
|
||||||
echo "Job status: $status $progress percent"
|
log_info "Job status: $status $progress percent"
|
||||||
if [[ "$status" == "FAILED" ]]; then
|
if [[ "$status" == "FAILED" ]]; then
|
||||||
echo "Log backup FAILED"
|
log_error "Log backup FAILED"
|
||||||
cat /tmp/rbkresponse.$$ | jq
|
cat /tmp/rbkresponse.$$ | jq
|
||||||
cleanup
|
cleanup
|
||||||
exit 2
|
exit 2
|
||||||
elif [[ "$status" == "CANCELLED" ]]; then
|
elif [[ "$status" == "CANCELLED" ]]; then
|
||||||
echo "Log backup CANCELLED"
|
log_warn "Log backup CANCELLED"
|
||||||
exit 3
|
exit 3
|
||||||
elif [[ "$status" == "SUCCEEDED" ]]; then
|
elif [[ "$status" == "SUCCEEDED" ]]; then
|
||||||
echo "Log backup SUCCEEDED"
|
log_info "Log backup SUCCEEDED"
|
||||||
cat /tmp/rbkresponse.$$ | jq
|
cat /tmp/rbkresponse.$$ | jq
|
||||||
cleanup
|
cleanup
|
||||||
exit 0
|
exit 0
|
||||||
|
|||||||
89
rsc_ops.sh
89
rsc_ops.sh
@@ -9,18 +9,63 @@
|
|||||||
|
|
||||||
MYDIR="$(dirname "$(realpath "$0")")"
|
MYDIR="$(dirname "$(realpath "$0")")"
|
||||||
|
|
||||||
# Load RSC configuration from rsc.json
|
# Logging helpers
|
||||||
|
VERBOSE=${VERBOSE:-0}
|
||||||
|
log_info() {
|
||||||
|
if [ "${VERBOSE}" -eq 1 ]; then
|
||||||
|
echo "INFO: $*"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
log_warn() {
|
||||||
|
echo "WARN: $*" >&2
|
||||||
|
}
|
||||||
|
log_error() {
|
||||||
|
echo "ERROR: $*" >&2
|
||||||
|
}
|
||||||
|
|
||||||
|
# Ensure required commands are available
|
||||||
|
require_cmds() {
|
||||||
|
local miss=0
|
||||||
|
for cmd in jq curl; do
|
||||||
|
if ! command -v "$cmd" >/dev/null 2>&1; then
|
||||||
|
log_error "Required command '$cmd' not found in PATH"
|
||||||
|
miss=1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [ "$miss" -ne 0 ]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
require_cmds
|
||||||
|
|
||||||
|
# Load and validate RSC configuration from rsc.json
|
||||||
if [ -f "$MYDIR/rsc.json" ]; then
|
if [ -f "$MYDIR/rsc.json" ]; then
|
||||||
RSC_ID=$(jq -r '.client_id' "$MYDIR/rsc.json")
|
RSC_ID=$(jq -r '.client_id // empty' "$MYDIR/rsc.json")
|
||||||
RSC_SECRET=$(jq -r '.client_secret' "$MYDIR/rsc.json")
|
RSC_SECRET=$(jq -r '.client_secret // empty' "$MYDIR/rsc.json")
|
||||||
RSC_HOST=$(jq -r '.access_token_uri' "$MYDIR/rsc.json" | sed 's|https://||' | sed 's|/api/client_token||')
|
ACCESS_TOKEN_URI=$(jq -r '.access_token_uri // empty' "$MYDIR/rsc.json")
|
||||||
|
|
||||||
|
if [ -z "${RSC_ID}" ] || [ -z "${RSC_SECRET}" ] || [ -z "${ACCESS_TOKEN_URI}" ]; then
|
||||||
|
log_error "rsc.json is missing required fields: client_id, client_secret or access_token_uri"
|
||||||
|
log_error "Please populate $MYDIR/rsc.json (see rsc.json.example)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Derive host from access token URI and normalize
|
||||||
|
RSC_HOST=$(echo "$ACCESS_TOKEN_URI" | sed 's|https://||' | sed 's|/api/client_token||')
|
||||||
|
|
||||||
|
# Restrict config file permissions
|
||||||
|
if [ -f "$MYDIR/rsc.json" ]; then
|
||||||
|
chmod 600 "$MYDIR/rsc.json" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_info "Loaded RSC configuration for host: $RSC_HOST"
|
||||||
else
|
else
|
||||||
echo "ERROR: rsc.json configuration file not found"
|
log_error "rsc.json configuration file not found at $MYDIR/rsc.json"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Set DATE command based on OS
|
# Set DATE command based on available binaries (prefer gdate if installed)
|
||||||
if [[ "$OSTYPE" == "darwin"* ]]; then
|
if command -v gdate >/dev/null 2>&1; then
|
||||||
DATE=gdate
|
DATE=gdate
|
||||||
else
|
else
|
||||||
DATE=date
|
DATE=date
|
||||||
@@ -42,8 +87,11 @@ cleanup () {
|
|||||||
check_http_error () {
|
check_http_error () {
|
||||||
# All good responses start with a 2
|
# All good responses start with a 2
|
||||||
if [ ${http_response:0:1} != "2" ]; then
|
if [ ${http_response:0:1} != "2" ]; then
|
||||||
echo FATAL: HTTP error from API call: $http_response. The server responded with:
|
log_error "HTTP error from API call: $http_response"
|
||||||
cat /tmp/rbkresponse.$$ ; echo ; exit_with_error
|
# Show a short excerpt of the response body for debugging
|
||||||
|
head -c 4096 /tmp/rbkresponse.$$ 2>/dev/null || true
|
||||||
|
echo
|
||||||
|
exit_with_error
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -85,8 +133,11 @@ get_rsc_token () {
|
|||||||
RSC_AUTH_TOKEN=$(cat /tmp/rbkresponse.$$ | jq -r '.access_token')
|
RSC_AUTH_TOKEN=$(cat /tmp/rbkresponse.$$ | jq -r '.access_token')
|
||||||
SECONDS=$(cat /tmp/rbkresponse.$$ | jq -r '.expires_in')
|
SECONDS=$(cat /tmp/rbkresponse.$$ | jq -r '.expires_in')
|
||||||
EXPIRATION=$($DATE +%s -d "+${SECONDS} seconds")
|
EXPIRATION=$($DATE +%s -d "+${SECONDS} seconds")
|
||||||
#cat /tmp/rbkresponse.$$ | jq
|
# Save session securely
|
||||||
echo "$EXPIRATION $RSC_AUTH_TOKEN" > ~/.rbkRscsession.$id_string
|
umask 077
|
||||||
|
printf '%s %s\n' "$EXPIRATION" "$RSC_AUTH_TOKEN" > ~/.rbkRscsession.$id_string
|
||||||
|
chmod 600 ~/.rbkRscsession.$id_string 2>/dev/null || true
|
||||||
|
log_info "Cached RSC session to ~/.rbkRscsession.$id_string"
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -136,11 +187,11 @@ EOF
|
|||||||
#cat /tmp/payload.$$ | jq -r
|
#cat /tmp/payload.$$ | jq -r
|
||||||
error=$(cat /tmp/rbkresponse.$$ | jq -r '.errors // empty')
|
error=$(cat /tmp/rbkresponse.$$ | jq -r '.errors // empty')
|
||||||
if [ "$error" ]; then
|
if [ "$error" ]; then
|
||||||
echo "ERROR: The last GraphQL API call returned an error"
|
log_error "The last GraphQL API call returned an error"
|
||||||
echo
|
echo
|
||||||
echo "PAYLOAD:"
|
log_error "PAYLOAD:"
|
||||||
cat /tmp/payload.$$ | jq -r
|
cat /tmp/payload.$$ | jq -r
|
||||||
echo "RESPONSE:"
|
log_error "RESPONSE:"
|
||||||
cat /tmp/rbkresponse.$$ | jq -r '.errors'
|
cat /tmp/rbkresponse.$$ | jq -r '.errors'
|
||||||
exit_with_error
|
exit_with_error
|
||||||
fi
|
fi
|
||||||
@@ -169,7 +220,7 @@ rsc_get_host_id() {
|
|||||||
host_ids=$(cat /tmp/rbkresponse.$$ | jq -r '.data.physicalHosts.nodes[] | .id')
|
host_ids=$(cat /tmp/rbkresponse.$$ | jq -r '.data.physicalHosts.nodes[] | .id')
|
||||||
host_count=$(echo "$host_ids" | grep -c .)
|
host_count=$(echo "$host_ids" | grep -c .)
|
||||||
if [[ $host_count -ne 1 ]]; then
|
if [[ $host_count -ne 1 ]]; then
|
||||||
echo "ERROR: Multiple hosts found for '$1':"
|
log_error "Multiple hosts found for '$1':"
|
||||||
cat /tmp/rbkresponse.$$ | jq -r '.data.physicalHosts.nodes[] | "\(.name) \(.id)"'
|
cat /tmp/rbkresponse.$$ | jq -r '.data.physicalHosts.nodes[] | "\(.name) \(.id)"'
|
||||||
exit_with_error
|
exit_with_error
|
||||||
fi
|
fi
|
||||||
@@ -190,7 +241,7 @@ rsc_find_database () {
|
|||||||
get_cluster_uuid
|
get_cluster_uuid
|
||||||
#echo Cluster UUID is $cluster_uuid
|
#echo Cluster UUID is $cluster_uuid
|
||||||
else
|
else
|
||||||
echo Cluster UUID was already $cluster_uuid
|
log_info "Cluster UUID was already $cluster_uuid"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
variables="{
|
variables="{
|
||||||
@@ -356,7 +407,7 @@ if [ $num -eq 1 ]; then
|
|||||||
read name rsc_db_id < <(echo $(cat /tmp/rbkresponse.$$ | jq -r '.data.globalSearchResults.edges[] | select (.node.objectType=="ORACLE_DATA_GUARD_GROUP" and .node.isRelic==false)| .node.name, .node.id'))
|
read name rsc_db_id < <(echo $(cat /tmp/rbkresponse.$$ | jq -r '.data.globalSearchResults.edges[] | select (.node.objectType=="ORACLE_DATA_GUARD_GROUP" and .node.isRelic==false)| .node.name, .node.id'))
|
||||||
database_type="Data Guard"
|
database_type="Data Guard"
|
||||||
elif [ $num -gt 1 ]; then
|
elif [ $num -gt 1 ]; then
|
||||||
echo "ERROR: There were $num entries returned for Data Guard databases with name $RBK_SID"
|
log_error "There were $num entries returned for Data Guard databases with name $RBK_SID"
|
||||||
exit_with_error
|
exit_with_error
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -370,7 +421,7 @@ if [ -z "$rsc_db_id" ]; then
|
|||||||
database_type="Standalone"
|
database_type="Standalone"
|
||||||
#echo Good, There is just one Standalone DB with name $name and RSC ID $rsc_db_id
|
#echo Good, There is just one Standalone DB with name $name and RSC ID $rsc_db_id
|
||||||
else
|
else
|
||||||
echo "ERROR: There were $num entries returned from JQ for DB with name $RBK_SID on host $RBK_HOST"
|
log_error "There were $num entries returned from JQ for DB with name $RBK_SID on host $RBK_HOST"
|
||||||
exit_with_error
|
exit_with_error
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
@@ -380,7 +431,7 @@ if [ -z "$rsc_db_id" ]; then
|
|||||||
database_type="Standalone"
|
database_type="Standalone"
|
||||||
#echo Good, There is just one Standalone DB with name $name on ${RBK_HOST} and RSC ID $rsc_db_id
|
#echo Good, There is just one Standalone DB with name $name on ${RBK_HOST} and RSC ID $rsc_db_id
|
||||||
else
|
else
|
||||||
echo "ERROR: There were $num entries returned from for DB with name $RBK_SID on host $RBK_HOST"
|
log_error "There were $num entries returned from for DB with name $RBK_SID on host $RBK_HOST"
|
||||||
exit_with_error
|
exit_with_error
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|||||||
Reference in New Issue
Block a user