#!/bin/bash
set -e

# Get script name
SCRIPT=$(basename "$0")

# Display Help
Help() {
  echo
  echo "$SCRIPT"
  echo
  echo "Description: Backup MySQL/MariaDB Docker database."
  echo "Syntax: $SCRIPT [-d|-o|-c|help]"
  echo "Example: $SCRIPT -d mysql,moodle -o /tmp -c mysql01"
  echo "options:"
  echo "  -d    Comma-separated list of database names."
  echo "  -a    Backup all databases"
  echo "  -o    Output directory. Defaults to '/var/tmp'"
  echo "  -c    Docker container name. Defaults to 'mysql'"
  echo "  help  Show $SCRIPT manual."
  echo
}

# Show help and exit
if [[ "$1" == "help" ]]; then
    Help
    exit
fi

# Process params
while getopts ":a :c: :d: :o:" opt; do
  case $opt in
    a) ALL='true'
    ;;
    c) CONTAINER="$OPTARG"
    ;;
    d) DATABASES="$OPTARG"
    ;;
    o) DIR="$OPTARG"
    ;;
    \?) echo "Invalid option -$OPTARG" >&2
    Help
    exit;;
  esac
done

# Fallback to environment vars and default values
: ${DIR:='/var/tmp'}
: ${CONTAINER:='mysql'}

# Verify variables
[[ -z "$DATABASES" ]] && [[ -z "$ALL" ]] && { echo "Parameter -d or -a|databases or all must be set" ; exit 1; }
[[ -z "$DIR" ]] && { echo "Parameter -d|dir is empty" ; exit 1; }
[[ -z "$CONTAINER" ]] && { echo "Parameter -c|container is empty" ; exit 1; }

# Get image
IMAGE=$(docker inspect $CONTAINER --format='{{.Config.Image}}')

if $ALL; then
  # Get all databases from docker container
  
  if [[ "$IMAGE" =~ "mariadb" ]]; then
    DATABASE_LIST=($(docker exec $CONTAINER /bin/bash -c "mysql -p\$MARIADB_ROOT_PASSWORD \
      -Bse 'SHOW DATABASES' | grep -v -E '^(sys|information_schema|mysql|performance_schema)$'"))
  fi
  if [[ "$IMAGE" =~ "mysql" ]]; then
    DATABASE_LIST=($(docker exec $CONTAINER /bin/bash -c "mysql -p\$MYSQL_ROOT_PASSWORD \
      -Bse 'SHOW DATABASES' | grep -v -E '^(sys|information_schema|mysql|performance_schema)$'"))
  fi
  # Concate database list
  printf -v DATABASES '%s,' "${DATABASE_LIST[@]}"
  DATABASES="${DATABASES%,}"
fi

if [[ ! -z $DATABASES ]] ; then
  # Split database param values
  DATABASE_LIST=($(echo $DATABASES | tr "," "\n"))
fi

# Create backup folder
mkdir -p ${DIR}/${CONTAINER}

# Cleanup backup folder
rm -rf ${DIR}/${CONTAINER}/*

# Create dump with docker for each database
for DATABASE in "${DATABASE_LIST[@]}"
do
  if [[ "$IMAGE" =~ "mariadb" ]]; then
    echo "Run Docker MariaDB backup for $DATABASE"
    docker exec $CONTAINER /bin/bash -c "mysqldump -p\$MARIADB_ROOT_PASSWORD \
        $DATABASE" > ${DIR}/${CONTAINER}/${DATABASE}.sql
  fi
  if [[ "$IMAGE" =~ "mysql" ]]; then
    echo "Run Docker MySQL backup for $DATABASE"
    docker exec $CONTAINER /bin/bash -c "mysqldump -p\$MYSQL_ROOT_PASSWORD \
        $DATABASE" > ${DIR}/${CONTAINER}/${DATABASE}.sql
  fi
done

# Notify if backup has finished
echo "The Docker mysql backup has finished: ${DIR}/${CONTAINER}/{${DATABASES}}.sql"
