#!/bin/sh DIR=$(CDPATH= cd -- "$(dirname "$0")" 2>/dev/null && pwd) if [ -f "$DIR/config.sh" ]; then . "$DIR/config.sh" fi HEALTH_RETRIES=${HEALTH_RETRIES:-20} HEALTH_SLEEP=${HEALTH_SLEEP:-3} LOG_RETRIES=${LOG_RETRIES:-60} LOG_SLEEP=${LOG_SLEEP:-5} ALIVE_ENDPOINT="/20230913/information/isAlive" LOGIN_ENDPOINT="/20230913/sessions/login" CHANGELOG_LOG_PATTERN="Releasing lock: org.springframework.integration.jdbc.lock.JdbcLockRegistry" CONFIG_MANAGER_JAR="$DIR/install-helper/lib/mmg-configuration-manager-1.0.0.jar" CONFIG_MANAGER_OUTPUT="$DIR/install-helper/tmp/post_upgrade_fix_812_to_813_nohup.out" TMP_BASE="${TMPDIR:-/tmp}/post_upgrade_fix_812_to_813_$$" HEADERS_FILE="${TMP_BASE}.headers" BODY_FILE="${TMP_BASE}.body" TRACE_FILE="${TMP_BASE}.trace" cleanup() { rm -f "$HEADERS_FILE" "$BODY_FILE" "$TRACE_FILE" } print_usage() { echo "Usage: $0 [DATASTUDIO_URL] [LOG_HOME]" echo "You can also provide DATASTUDIO_URL and MMG_LOG_DIR/LOG_HOME as environment variables." echo "Example: $0 https://host:port /opt/mmg/logs" } is_placeholder_value() { case "$1" in *"##"* ) return 0 ;; * ) return 1 ;; esac } has_real_value() { [ -n "$1" ] && ! is_placeholder_value "$1" } set_legacy_var_if_needed() { var_name="$1" candidate_value="$2" eval "current_value=\${$var_name-}" if has_real_value "$current_value"; then return 0 fi if has_real_value "$candidate_value"; then export "$var_name=$candidate_value" fi } normalize_url() { echo "$1" | sed 's:/*$::' } normalize_context() { echo "$1" | sed 's:^/*::; s:/*$::' } derive_datastudio_url() { if has_real_value "$DATASTUDIO_URL"; then return 0 fi ds_host="$BE_HOSTNAME" ds_port="$DATASTUDIO_SERVER_PORT" ds_context=`normalize_context "$CONTEXT_PATH"` if has_real_value "$ds_host" && has_real_value "$ds_port" && has_real_value "$ds_context"; then DATASTUDIO_URL="https://${ds_host}:${ds_port}/${ds_context}" export DATASTUDIO_URL fi } count_matches() { pattern="$1" file_path="$2" if [ -f "$file_path" ]; then grep -F "$pattern" "$file_path" 2>/dev/null | wc -l | awk '{ print $1 }' else echo 0 fi } wait_for_datastudio() { counter=0 while [ "$counter" -lt "$HEALTH_RETRIES" ] do ds_health=`curl -s --insecure "${DATASTUDIO_URL}${ALIVE_ENDPOINT}" 2>/dev/null | tr -d '\n' | tr -d '\r' | tr -d ' '` case "$ds_health" in *'"isAlive":true'*) echo "Data Studio started successfully." return 0 ;; esac counter=`expr "$counter" + 1` sleep "$HEALTH_SLEEP" done echo "Timed out waiting for Data Studio to become available at ${DATASTUDIO_URL}${ALIVE_ENDPOINT}." return 1 } call_login_api() { curl -sS -v --insecure --location --request POST "${DATASTUDIO_URL}${LOGIN_ENDPOINT}" -D "$HEADERS_FILE" -o "$BODY_FILE" 2>"$TRACE_FILE" curl_exit_code=$? if [ "$curl_exit_code" -ne 0 ]; then echo "Login API call failed with curl exit code ${curl_exit_code}." if [ -s "$TRACE_FILE" ]; then cat "$TRACE_FILE" >&2 fi return 1 fi http_code=`awk '/^HTTP\// { code = $2 } END { print code }' "$HEADERS_FILE" 2>/dev/null` response_body=`tr -d '\r' < "$BODY_FILE" 2>/dev/null` if [ -n "$http_code" ]; then echo "Login API response code: ${http_code}" else echo "Login API response code could not be determined from the headers." fi if [ -n "$response_body" ]; then echo "Login API response body: ${response_body}" fi if [ "$http_code" = "401" ]; then echo "Login API completed with the expected 401 NotAuthenticated response." else echo "Login API completed. Continuing with changelog log verification." fi return 0 } wait_for_changelog_log() { counter=0 while [ "$counter" -lt "$LOG_RETRIES" ] do current_log_count=`count_matches "$CHANGELOG_LOG_PATTERN" "$SERVER_LOG"` if [ "$current_log_count" -gt "$baseline_log_count" ]; then echo "Detected changelog completion log entry in ${SERVER_LOG}." return 0 fi counter=`expr "$counter" + 1` sleep "$LOG_SLEEP" done echo "Timed out waiting for changelog completion log entry in ${SERVER_LOG}." return 1 } run_the_post_liquibase_update(){ if ! has_real_value "$DATASTUDIO_SCHEMA_WALLET_ALIAS"; then echo "Error: - DATASTUDIO_SCHEMA_WALLET_ALIAS not provided." return 1 fi if ! has_real_value "$TNS_ADMIN_PATH"; then echo "Error: - TNS_ADMIN_PATH not provided." return 1 fi if ! has_real_value "$WALLET_LOCATION"; then echo "Error: - WALLET_LOCATION not provided." return 1 fi if [ ! -f "$CONFIG_MANAGER_JAR" ]; then echo "Error: - Configuration manager jar not found at $CONFIG_MANAGER_JAR." return 1 fi mkdir -p "$DIR/install-helper/tmp" || return 1 nohup java -Doracle.net.tns_admin="$TNS_ADMIN_PATH" -Doracle.net.wallet_location="$WALLET_LOCATION" -jar "$CONFIG_MANAGER_JAR" "DATASTUDIO_DATASOURCE_UPDATE" "$DATASTUDIO_SCHEMA_WALLET_ALIAS" > "$CONFIG_MANAGER_OUTPUT" 2>&1 java_exit_code=$? if [ "$java_exit_code" -ne 0 ]; then echo "Error: - Post liquibase update failed with exit code ${java_exit_code}." if [ -s "$CONFIG_MANAGER_OUTPUT" ]; then cat "$CONFIG_MANAGER_OUTPUT" >&2 fi return 1 fi } trap cleanup 0 1 2 3 15 set_legacy_var_if_needed LOG_HOME "${MMG_LOG_DIR:-}" set_legacy_var_if_needed WALLET_LOCATION "${MMG_DB_WALLET_PATH:-}" set_legacy_var_if_needed TNS_ADMIN_PATH "${MMG_DB_TNS_ADMIN_PATH:-}" set_legacy_var_if_needed BE_HOSTNAME "${MMG_SERVICE_HOST:-}" set_legacy_var_if_needed CONTEXT_PATH "${WEB_CONTEXT:-}" derive_datastudio_url DATASTUDIO_URL_INPUT=${1:-${DATASTUDIO_URL:-"##DATASTUDIO_URL##"}} LOG_HOME_INPUT=${2:-${LOG_HOME:-"##LOG_HOME##"}} if [ -z "$DATASTUDIO_URL_INPUT" ] || is_placeholder_value "$DATASTUDIO_URL_INPUT"; then echo "DATASTUDIO_URL is required." print_usage exit 1 fi if [ -z "$LOG_HOME_INPUT" ] || is_placeholder_value "$LOG_HOME_INPUT"; then echo "LOG_HOME is required." print_usage exit 1 fi DATASTUDIO_URL=`normalize_url "$DATASTUDIO_URL_INPUT"` LOG_HOME=`echo "$LOG_HOME_INPUT" | sed 's:[/\\]*$::'` SERVER_LOG="${LOG_HOME}/services/server.log" baseline_log_count=`count_matches "$CHANGELOG_LOG_PATTERN" "$SERVER_LOG"` echo "Waiting for Data Studio health endpoint..." wait_for_datastudio || exit 1 echo "Calling login API to trigger changelog execution check..." call_login_api || exit 1 echo "Waiting for changelog completion log entry..." if ! wait_for_changelog_log; then echo "Proceeding with post liquibase update even though changelog completion log entry was not detected." fi echo "Running post liquibase update..." run_the_post_liquibase_update || exit 1 echo "Data Studio Source Update completed successfully."