#!/bin/bash ORIG_ARGS="$*" # # Example API call script for Die Mobiliar # v0.2 - James Pattinson - August 2021 # # Lists the registered DBs for a given Oracle Host or RAC # and their assigned SLAs # # usage: oracle_list_db.sh [-l ] MYDIR="$(dirname "$(realpath "$0")")" # source $MYDIR/rbk_api.conf RBK_API_LOG="" if [ "$1" = "-l" ]; then if [ -z "$2" ] || [ -z "$3" ]; then echo "Usage: $0 [-l ] " exit 1 fi RBK_API_LOG="$2" export RBK_API_LOG RBK_HOST="$3" shift 3 else if [ $# -ne 1 ]; then echo "Usage: $0 [-l ] " exit 1 fi RBK_HOST=$1 shift 1 fi # Now RBK_API_LOG is set, so write the log header if enabled if [ -n "$RBK_API_LOG" ]; then { echo "==== Rubrik Oracle List DB Log ====" date echo "Script: $0" echo "Parameters: $ORIG_ARGS" echo } >> "$RBK_API_LOG" fi source $MYDIR/oracle_funcs.sh # Set up cleanup trap to ensure temporary files are removed trap 'rm -f /tmp/rbkdata.$$; cleanup' EXIT INT TERM echo "Connecting to Rubrik with IP $RUBRIK_IP" # API call to list Oracle DBs ENDPOINT="https://$RUBRIK_IP/api/internal/oracle/db" # Check if rest_api_get function exists and call it if ! rest_api_get; then echo "ERROR: Failed to retrieve data from Rubrik API" exit 1 fi # Check if the API response file exists and is not empty if [ ! -s /tmp/rbkresponse.$$ ]; then echo "ERROR: Empty or missing API response" cleanup exit 1 fi # Extract the data and store in a temporary file for processing # Simplified jq command - single pass instead of piping through jq twice if ! jq -r --arg HOST "$RBK_HOST" ' .data[] | select(.infraPath[0].name==$HOST and .isRelic==false) | "\(.sid)|\(.effectiveSlaDomainName)|\(.isArchiveLogModeEnabled)|\(.dataGuardType)|\(.dataGuardGroupName)|\(.isDbLocalToTheCluster)" ' /tmp/rbkresponse.$$ > /tmp/rbkdata.$$; then echo "ERROR: Failed to process API response with jq" cleanup exit 1 fi # Calculate column widths and display results if [ -s /tmp/rbkdata.$$ ]; then # Initialize minimum column widths based on headers col1_width=3 # SID col2_width=3 # SLA col3_width=14 # ArchivelogMode col4_width=7 # DG Type col5_width=8 # DG Group col6_width=8 # Location # Calculate actual maximum widths needed while IFS='|' read -r sid sla archlog dgtype dggroup islocal || [ -n "$sid" ]; do # Handle null values and empty strings [ "$sid" = "null" ] && sid="" [ "$sla" = "null" ] && sla="" [ "$archlog" = "null" ] && archlog="" [ "$dgtype" = "null" ] && dgtype="" [ "$dggroup" = "null" ] && dggroup="" [ "$islocal" = "null" ] && islocal="" # Convert boolean to Location text if [ "$islocal" = "true" ]; then location="Local" elif [ "$islocal" = "false" ]; then location="Remote" else location="" fi # Update column widths if current data is longer [ ${#sid} -gt $col1_width ] && col1_width=${#sid} [ ${#sla} -gt $col2_width ] && col2_width=${#sla} [ ${#archlog} -gt $col3_width ] && col3_width=${#archlog} [ ${#dgtype} -gt $col4_width ] && col4_width=${#dgtype} [ ${#dggroup} -gt $col5_width ] && col5_width=${#dggroup} [ ${#location} -gt $col6_width ] && col6_width=${#location} done < /tmp/rbkdata.$$ # Print headers with proper spacing printf "%-${col1_width}s %-${col2_width}s %-${col3_width}s %-${col4_width}s %-${col5_width}s %-${col6_width}s\n" \ "SID" "SLA" "ArchivelogMode" "DG Type" "DG Group" "Location" # Print separator line printf "%-${col1_width}s %-${col2_width}s %-${col3_width}s %-${col4_width}s %-${col5_width}s %-${col6_width}s\n" \ "$(printf '%*s' $col1_width | tr ' ' '-')" \ "$(printf '%*s' $col2_width | tr ' ' '-')" \ "$(printf '%*s' $col3_width | tr ' ' '-')" \ "$(printf '%*s' $col4_width | tr ' ' '-')" \ "$(printf '%*s' $col5_width | tr ' ' '-')" \ "$(printf '%*s' $col6_width | tr ' ' '-')" # Print data rows with proper spacing while IFS='|' read -r sid sla archlog dgtype dggroup islocal || [ -n "$sid" ]; do # Handle null values and empty strings [ "$sid" = "null" ] && sid="" [ "$sla" = "null" ] && sla="" [ "$archlog" = "null" ] && archlog="" [ "$dgtype" = "null" ] && dgtype="" [ "$dggroup" = "null" ] && dggroup="" [ "$islocal" = "null" ] && islocal="" # Convert boolean to Location text if [ "$islocal" = "true" ]; then location="Local" elif [ "$islocal" = "false" ]; then location="Remote" else location="" fi printf "%-${col1_width}s %-${col2_width}s %-${col3_width}s %-${col4_width}s %-${col5_width}s %-${col6_width}s\n" \ "$sid" "$sla" "$archlog" "$dgtype" "$dggroup" "$location" done < /tmp/rbkdata.$$ else echo "No Oracle databases found for host $RBK_HOST" fi # Clean up temporary files rm -f /tmp/rbkdata.$$ cleanup