#!/bin/bash

if [[
    -z "$1" ||
    "$1" == "-h" ||
    "$1" == "--help"
  ]]
  then
    echo Backup a mysql/mariadb database.
    echo
    echo Usage:
    echo        $0 \<database_name\>
    echo
    echo Will save a backup of specified database into a .sql file in an archive like:
    echo
    echo        /var/backups/sku/mariadb/\<database_name\>_YYYYmmdd_hhMMSS.tar.gz
    echo
    exit 1
fi

DIR="$(dirname "$0")"

cd $DIR

BACKUPS_FOLDER="`./configure ./.backups.json --key=db.backups_folder`"

if (($?))
  then
    echo "Backups folder not set. Using default: /var/backups/sku/mariadb"
    echo "Change it with:"
    echo ""
    echo "    ${DIR}/configure ${DIR}/.backups.json --key=db.backups_folder --value=<folder>"
    echo ""
    BACKUPS_FOLDER="/var/backups/sku/mariadb"
fi

USER="`./configure ./.backups.json --key=db.user`"

if (($?))
  then
    echo "DB username not set. Using default: admin"
    echo "Change it with:"
    echo ""
    echo "    ${DIR}/configure ${DIR}/.backups.json --key=db.user --value=<username>"
    echo ""
    USER="admin"
fi

PASS="`./configure ./.backups.json --key=db.pass`"

if (($?))
  then
    echo "DB password not set. Aborting."
    echo "Set it with:"
    echo ""
    echo "    ${DIR}/configure ${DIR}/.backups.json --key=db.pass --value=\"<password>\""
    echo ""
    exit 2
fi

DB="$1"

TIMESTAMP="`date +%Y%m%d_%H%M%S`"

DUMP_FILE="${DB}_${TIMESTAMP}.sql"
TGZ_FILE="mariadb_${DB}_${TIMESTAMP}.tar.gz"

DUMP_FULL_PATH="$BACKUPS_FOLDER/$DB/$DUMP_FILE"
TGZ_FULL_PATH="$BACKUPS_FOLDER/$DB/$TGZ_FILE"

mkdir -p $BACKUPS_FOLDER/$DB

ls $BACKUPS_FOLDER/$DB >/dev/null 2>/dev/null

if (($?))
then
    echo "Could not create folder: $BACKUPS_FOLDER/$DB"
    echo "Aborting."
    exit 3
fi

DUMP_COMMAND="mysqldump --routines -u $USER -p$PASS $DB"
DUMP_COMMAND_="mysqldump --routines -u $USER -pXXXXXXX $DB"

echo Executing:
#echo "    $DUMP_COMMAND > $DUMP_FULL_PATH"
echo "    $DUMP_COMMAND_ > $DUMP_FULL_PATH"

$DUMP_COMMAND > $DUMP_FULL_PATH

#UPLOAD_TO="`./configure ./.backups.json --key=db.databases.$DB.upload_target`"
UPLOAD_TO="`./configure ./.backups.json --key=db.upload_target`"
COPY_TO="`./configure ./.backups.json --key=db.copy_to.${DB}`"

cd $BACKUPS_FOLDER/$DB

ARCHIVE_COMMAND="tar -czvf $TGZ_FULL_PATH $DUMP_FILE --remove-files "

echo "    $ARCHIVE_COMMAND"

$ARCHIVE_COMMAND >/dev/null 2>/dev/null

echo "Backup saved to:"
echo $TGZ_FULL_PATH

if [[ -z "$UPLOAD_TO" ]]
  then

    echo Upload target not set.
    echo
    echo You can set a server and folder to upload the backup file via scp:
    #echo "    ${DIR}/configure ${DIR}/.backups.json --key=db.databases.${DB}.upload_target --value=<server_and_folder>"
    echo "    ${DIR}/configure ${DIR}/.backups.json --key=db.upload_target --value=<server_and_folder>"
    echo
    echo "     # example value:  mayfly.i.siberventures.com:~/master1/mariadb"
    echo
    exit 1

  else

    UPLOAD_TO="${UPLOAD_TO}/${DB}"
    echo "Executing:"
    echo "    scp $TGZ_FULL_PATH $UPLOAD_TO"

    scp $TGZ_FULL_PATH $UPLOAD_TO
fi

if [[ -n "$COPY_TO" ]]
  then
    echo "Executing:"
    echo "    cp $TGZ_FULL_PATH $COPY_TO"

    cp $TGZ_FULL_PATH $COPY_TO

    echo "Backup copied to:"
    echo $COPY_TO
fi
