#!{{ dash }}
set -eu

if [ $# -ne 7 ]; then
  echo "Bootstrap a mariadb instance from available backup data so it replicates from given master."
  echo "  $0 <BACKUP FILE> <MASTER HOST> <MASTER PORT> <MASTER USER> <MASTER SSL CA FILE> <MASTER SSL CERT FILE> <MASTER SSL KEY FILE>"
  exit 1
fi

BACKUP=$1
MASTER_HOST=$2
MASTER_PORT=$3
MASTER_USER=$4
MASTER_SSL_CA=$5
MASTER_SSL_CERT=$6
MASTER_SSL_KEY=$7

CLIENT='{{ client }}'
DATA_DIRECTORY='{{ data_directory }}'
PID_FILE='{{ pid_file }}'
SERVER='{{ server }}'
UPDATE='{{ update }}'
SOCKET='{{ socket }}'

# Make sure mariadb is not already running
if [ -e "$PID_FILE" ]; then
  PID=$(cat "$PID_FILE")
  if [ $? -ne 0 ]; then
    echo "Cannot read Mariadb pidfile, assuming running. Aborting."
    exit 1
  fi
  if kill -0 "$PID"; then
    echo "Mariadb is already running with pid $PID. Aborting."
    exit 1
  fi
fi

BACKUP_HEAD="$(zcat "$BACKUP" | head -n 100)"

SQL_CHANGE_MASTER=$(echo "$BACKUP_HEAD" | grep "^--\s*CHANGE MASTER TO " | sed "s/^--\s*//")
if [ -z "$SQL_CHANGE_MASTER" ]; then
  echo "'CHANGE MASTER TO' statement not found in given backup file."
  echo "Is replication enabled on future master ?"
  exit 1
fi

SQL_SET_GTID="$(echo "$BACKUP_HEAD" | grep "^--\s*SET GLOBAL gtid_slave_pos=" | sed "s/^--\s*//")"
if [ -z "$SQL_SET_GTID" ]; then
  echo "Info: GTID not found in backup, it will not be enabled."
  MASTER_USE_GTID=0
else
  echo "Info: GTID found in backup, it will be enabled."
  MASTER_USE_GTID=1
fi

echo "EXISTING DATABASE CONTENT WILL BE DESTROYED"
echo "You have 5 seconds to interrupt this script..."
if sleep 5; then
  echo "Expired, proceeding"
else
  echo "Interrupted, aborting"
  exit 1
fi

echo "Emptying data directory..."
find "$DATA_DIRECTORY" -mindepth 1 -delete

echo -n "Starting mariadb for backup restoration"
"$SERVER" --innodb-flush-method=nosync --skip-innodb-doublewrite --innodb-flush-log-at-trx-commit=0 --sync-frm=0 --slow-query-log=0 --skip-log-bin &
PID=$!
trap "kill $PID; wait; exit 1" EXIT
while true; do
  if [ ! -e "/proc/$PID" ]; then
    trap EXIT
    echo "Service exited, check logs"
    wait
    exit 1
  fi
  test -e "$SOCKET" && break
  echo -n .
  sleep 0.5
done

"$UPDATE"

echo "Importing $BACKUP ..."
zcat "$BACKUP" | "$CLIENT" -u root

echo "Configuring server as slave..."
if [ "$MASTER_USE_GTID" -eq 1 ]; then
  "$CLIENT" -u root -e "$SQL_SET_GTID"
  MASTER_USE_GTID_SQL="current_pos"
else
  MASTER_USE_GTID_SQL="NO"
fi
"$CLIENT" -u root -e "
  CHANGE MASTER TO
  MASTER_HOST='$MASTER_HOST',
  MASTER_USER='$MASTER_USER',
  MASTER_PORT=$MASTER_PORT,
  MASTER_SSL=1,
  MASTER_SSL_CA='$MASTER_SSL_CA',
  MASTER_SSL_CERT='$MASTER_SSL_CERT',
  MASTER_SSL_KEY='$MASTER_SSL_KEY',
  MASTER_SSL_VERIFY_SERVER_CERT=1,
  MASTER_USE_GTID=$MASTER_USE_GTID_SQL;
"
if [ "$MASTER_USE_GTID" -eq 0 ]; then
  # No GTID, use binlog name & offset as provided by backup file.
  # Example: CHANGE MASTER TO MASTER_LOG_FILE='binlog.003447', MASTER_LOG_POS=360;
  # Notes:
  # - Must happen after setting MASTER_HOST & MASTER_PORT.
  # - Implicitly sets MASTER_USE_GTID=NO if it was set before.
  "$CLIENT" -u root -e "$SQL_CHANGE_MASTER"
fi
"$CLIENT" -u root -e "START SLAVE;"

echo "Stopping mariadb..."
trap EXIT
kill $PID
wait

echo "Done. Start mariadb normally. You may use 'show slave status' SQL command to monitor progress."