#!/usr/bin/env bash
#/ Usage: ghe-restore-mysql-binary <host>
#/ Restore binary MySQL backup to a GitHub instance.
#/
#/ Note: This script typically isn't called directly. It's invoked by the
#/ ghe-restore command when the rsync strategy is used.
set -e

# Bring in the backup configuration
# shellcheck source=share/github-backup-utils/ghe-backup-config
. "$( dirname "${BASH_SOURCE[0]}" )/ghe-backup-config"

# Show usage and bail with no arguments
[ -z "$*" ] && print_usage

bm_start "$(basename $0)"

# Grab host arg
GHE_HOSTNAME="$1"

# Perform a host-check and establish the remote version in GHE_REMOTE_VERSION.
ghe_remote_version_required "$GHE_HOSTNAME"

# The snapshot to restore should be set by the ghe-restore command but this lets
# us run this script directly.
: ${GHE_RESTORE_SNAPSHOT:=current}
export GHE_RESTORE_SNAPSHOT

# The directory holding the snapshot to restore
snapshot_dir="$GHE_DATA_DIR/$GHE_RESTORE_SNAPSHOT"

if $CLUSTER ; then
  ghe_mysql_master=$(ghe-ssh "$GHE_HOSTNAME" ghe-config "cluster.mysql-master")
  if [ -z $ghe_mysql_master ]; then
    echo "Something is wrong with configuration: cluster.mysql-master not found" >&2
    exit 2
  else
    tempdir=$(mktemp -d -t backup-utils-restore-XXXXXX)
    ssh_config_file="$tempdir/ssh_config"
    ssh_config_file_opt="-F $ssh_config_file"
    ghe-ssh-config "$GHE_HOSTNAME" "$ghe_mysql_master" > "$ssh_config_file"
    port=$(ssh_port_part "$GHE_HOSTNAME")
    ghe_mysql_master=$ghe_mysql_master${port:+:$port}
  fi
else
  ghe_mysql_master=$GHE_HOSTNAME
fi

# Check if the decompress needed by looking into the sentinel file
# In 2.19.5 we compress the binary backup twice
if [ "$(cat $snapshot_dir/mysql-binary-backup-sentinel)" = "NO_ADDITIONAL_COMPRESSION" ]; then
  IMPORT_MYSQL=ghe-import-mysql-xtrabackup
  GHE_RESTORE_HOST=$ghe_mysql_master
else
  IMPORT_MYSQL="unpigz | ghe-import-mysql-xtrabackup"
  GHE_RESTORE_HOST=$ghe_mysql_master
fi

cleanup() {
  ghe-ssh $ssh_config_file_opt "$GHE_RESTORE_HOST" -- "sudo rm -rf $GHE_REMOTE_DATA_USER_DIR/tmp/mysql.sql.gz"
}
trap 'cleanup' INT TERM EXIT

ghe-ssh $ssh_config_file_opt "$GHE_RESTORE_HOST" -- "sudo mkdir -p '$GHE_REMOTE_DATA_USER_DIR/tmp'" 1>&3

# Transfer MySQL data from the snapshot to the GitHub instance.
cat $snapshot_dir/mysql.sql.gz | ghe-ssh $ssh_config_file_opt "$GHE_RESTORE_HOST" -- "sudo dd of=$GHE_REMOTE_DATA_USER_DIR/tmp/mysql.sql.gz >/dev/null 2>&1"

echo "Restore MySQL database ..."
# Import the database
echo "cat $GHE_REMOTE_DATA_USER_DIR/tmp/mysql.sql.gz | $IMPORT_MYSQL" | ghe-ssh $ssh_config_file_opt "$GHE_RESTORE_HOST" -- /bin/bash 1>&3

bm_end "$(basename $0)"
