#!/bin/bash
set -u
#set -xv
#
# Version 1.1
#
# Backup toolpack database of current version and put in /lib/tb/toolpack/pkg/database_backups
#
# This script support the following features:
# - Backup the TMG-CONTROL configuration database into a backup file
# - Backup file name formatted as tbdbbackup_<hostname>_toolpack_<version>_<date>_<time>.sql.gz
#   ie. tbdbbackup_TB014369_toolpack_2_8_2017_01_11_15h52m.sql.gz
# - Keep N days of local backup files in /lib/tb/toolpack/pkg/database_backups. Default is 7 days.
# - Backup files are listed on the Web portal in Backups->Manual Database Backup
# - Optional copy to a remote server supporting
#   + Copy the backup file on a remote server (using scp) - optional
#   + Keep M days of backup files on the remote server (using ssh) - optional
# - Keep log of the last execution in /lib/tb/toolpack/pkg/database_backups/tbdbbackup.log
#
# Version History
# - 1.1 First draft
#
# Configuration file location to define user variables
CONFIG_FILE=/root/tbdbbackup.cfg
######################################
# Default User variables section
######################################
# Set this variable to change the local backup directory
# Default directory is /lib/tb/toolpack/pkg/database_backups
LOCAL_DIR=
# Max number of days to keep local backup files
# Assign no value to disable the local cleanup
LOCAL_BACKUP_MAX_DAYS=7
# Max number of days to keep remote backup files (if REMOTE_HOST is set)
# Assign no value to disable the remote cleanup
REMOTE_BACKUP_MAX_DAYS=7
# Assign no value to disable the remote copy
REMOTE_HOST=
REMOTE_PORT=22
REMOTE_DIR=
REMOTE_USER=
CONNECT_TIMEOUT=10
# Change this variable to customize the file backup prefix file name
NAME_PREFIX=tbdbbackup_$(hostname)
# END - Default User variables section
######################################

# Check for environement script (get_toolpack_env)
if [ -f /usr/bin/tbtoolpackenv ]; then
  source /usr/bin/tbtoolpackenv
else
  echo "Missing /usr/bin/tbtoolpackenv file" 1>&2
  exit 1
fi

# Check if user configuration file variable is set or not null
if [ ! -z ${CONFIG_FILE:-} ]; then
  if [ -f $CONFIG_FILE ]; then
    source $CONFIG_FILE
  else
    echo "CONFIG_FILE($CONFIG_FILE) not found! Will use default variables." 1>&2
  fi
fi

get_toolpack_env

TOOLPACK_MANUAL_DATABASE_BACKUP_PATH="${TOOLPACK_DIR}/pkg/database_backups"
TOOLPACK_AUTO_DATABASE_BACKUP_PATH="${oam_setup_path}/database_backups_auto"
TOOLPACK_DATABASE_BACKUP_PATH=${LOCAL_DIR:=$TOOLPACK_MANUAL_DATABASE_BACKUP_PATH}
if [ ! -d $TOOLPACK_DATABASE_BACKUP_PATH ]; then
  echo "Invalid backup path directory ($TOOLPACK_DATABASE_BACKUP_PATH)" 1>&2
  exit 1
fi

LOG_FILE="${TOOLPACK_DATABASE_BACKUP_PATH}/tbdbbackup.log"

if [ $tb_major -lt 8 ]; then
  database_name="toolpack_0"
else
  database_name="toolpack_${tb_branch}_${tb_major}"
fi

backup_prefix="${NAME_PREFIX}_${database_name}"
backup_name=${backup_prefix}_$(date "+%Y_%m_%d_%Hh%Mm").sql

echo "Start $0 on $(date)" > $LOG_FILE
echo "+ cd $TOOLPACK_DATABASE_BACKUP_PATH" >> $LOG_FILE
cd ${TOOLPACK_DATABASE_BACKUP_PATH}

echo "+ mysqldump -u tbdb -ptbdbpw --opt ${database_name} > $backup_name" >> $LOG_FILE
mysqldump -u tbdb -ptbdbpw --opt ${database_name} > $backup_name
if [[ $? == 0 ]]; then
  echo "  => OK" >> $LOG_FILE
else
  echo "  => FAILED" >> $LOG_FILE
fi

echo -e "+ gzip -f $backup_name" >> $LOG_FILE
gzip -f $backup_name
if [[ $? == 0 ]]; then
  echo -e "  => OK" >> $LOG_FILE
else
  echo "  => FAILED" >> $LOG_FILE
fi

# keep max LOCAL_BACKUP_MAX_DAYS days of backup files locally
if [ ! -z ${LOCAL_BACKUP_MAX_DAYS:-} ]; then
  echo "+ Delete local files ($NAME_PREFIX*.sql.gz) older then ${LOCAL_BACKUP_MAX_DAYS} days:" >> $LOG_FILE
  file_to_delete=`find . -maxdepth 1 -mtime +${LOCAL_BACKUP_MAX_DAYS} -type f -name "$NAME_PREFIX*.sql.gz"`
  if [ -z "$file_to_delete" ]; then
    echo "  Nothing to delete" >> $LOG_FILE
  else
    echo "${file_to_delete}" >> $LOG_FILE
  fi
  find . -maxdepth 1 -mtime +${LOCAL_BACKUP_MAX_DAYS} -type f -name "$NAME_PREFIX*.sql.gz" -delete
fi

# copy on remote host
if [ ! -z ${REMOTE_HOST:-} ]; then
  echo "+ scp -P $REMOTE_PORT ${backup_name}.gz $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/${backup_name}.gz" >> $LOG_FILE
  scp -P $REMOTE_PORT -o ConnectTimeout="$CONNECT_TIMEOUT" ${backup_name}.gz $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/${backup_name}.gz
  if [[ $? == 0 ]]; then
    echo "  => OK" >> $LOG_FILE
  else
    echo "  => FAILED" >> $LOG_FILE
  fi

  # keep max REMOTE_BACKUP_MAX_DAYS days of backup files on remote server
  if [ ! -z ${REMOTE_BACKUP_MAX_DAYS:-} ]; then
    echo "+ Delete remote files (${NAME_PREFIX}*.sql.gz) older then ${REMOTE_BACKUP_MAX_DAYS} days:" >> $LOG_FILE
ssh_output=$(ssh $REMOTE_USER@$REMOTE_HOST -p $REMOTE_PORT -T <<-ENDSSH
  find $REMOTE_DIR/. -maxdepth 1 -mtime +${REMOTE_BACKUP_MAX_DAYS} -type f -name "${NAME_PREFIX}*.sql.gz"
  find $REMOTE_DIR/. -maxdepth 1 -mtime +${REMOTE_BACKUP_MAX_DAYS} -type f -name "${NAME_PREFIX}*.sql.gz" -delete
ENDSSH
  )
    if [ -z "$ssh_output" ]; then
      echo "  Nothing to delete" >> $LOG_FILE
    else
      echo "${ssh_output}" >> $LOG_FILE
    fi
  fi


fi

echo "Stop on $(date)" >> $LOG_FILE
