#!/bin/bash
#
# TT#125701: Backup Redis DB on upgrades

set -eu

die() {
  local message="$*"

  echo "ERROR: ${message}" >&2
  exit 1
}

fatal_missing_var() {
  local var_name="$1"
  if [[ ! -v "${var_name}" ]] ; then
    die "Missing mandatory environment variable '\$${var_name}', exiting."
  fi

  local var_value="${!var_name}"
  if [[ -z "${var_value}" ]] ; then
    die "Empty mandatory environment variable '\$${var_name}', exiting."
  fi
}

request_confirmation() {
  if [[ "${FORCE_UPGRADE}" = "true" ]] ; then
    echo "Forcing as requested via environment variable FORCE_UPGRADE."
    return
  fi

  while true; do
    echo -n "Should the upgrade continue? (yes/no): "
    read -r answer
    case "${answer,,}" in
      yes)
        echo "Continue as requested."
        break
        ;;
      no)
        die "Aborted as requested."
        ;;
      * )
        echo "Please answer 'yes' or 'no'."
        ;;
    esac
    unset answer
  done
}

if [[ "${DO_DB_BACKUP:-}" != "yes" ]] ; then
  echo "INFO: environment var DO_DB_BACKUP=${DO_DB_BACKUP}, finishing step now"
  exit 0
fi

fatal_missing_var BACKUP
fatal_missing_var FORCE_UPGRADE

mkdir -p "${BACKUP}"

if command -v zstd &>/dev/null ; then
  DB_BACKUP_COMPRESSION_COMMAND=(zstd -T0)
  DB_BACKUP_EXT="zst"
elif command -v lz4 &>/dev/null ; then
  DB_BACKUP_COMPRESSION_COMMAND=(lz4)
  DB_BACKUP_EXT="lz4"
elif command -v gzip &>/dev/null ; then
  DB_BACKUP_COMPRESSION_COMMAND=(gzip -1 -v)
  DB_BACKUP_EXT="gz"
else
  die "Compression commands not found"
fi
DB_BACKUP="${BACKUP}/db_backup_redis_permanent_registrations.json.${DB_BACKUP_EXT}"

if [[ -r "${DB_BACKUP}" ]] ; then
  echo "WARNING: Redis DB backup ${DB_BACKUP} already exists, stop now for"
  echo "         manual inspection or continue and file will be overwritten"
  echo

  request_confirmation
fi

if ! command -v ngcp-redis-migrate &>/dev/null ; then
  echo "WARNING: command 'ngcp-redis-migrate' not found on this system,"
  echo "         cannot perform backup of Redis DB"
  echo

  request_confirmation

  echo "INFO: confirmed to continue without this backup, finishing step now"
  exit 0
fi

ngcp-redis-migrate --permanent only export | \
  nice -n 19 ionice -c 2 "${DB_BACKUP_COMPRESSION_COMMAND[@]}" > "${DB_BACKUP}"
