From f3b0bcd7bb94c528444275655d280dee939c3ccf Mon Sep 17 00:00:00 2001 From: Christoph Date: Tue, 7 Jan 2025 03:08:05 +0100 Subject: [PATCH] borg2-backup.sh: add database type to the name of database dump. --- borg2-backup.sh | 171 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 126 insertions(+), 45 deletions(-) diff --git a/borg2-backup.sh b/borg2-backup.sh index 4ab784a..2964bda 100755 --- a/borg2-backup.sh +++ b/borg2-backup.sh @@ -140,6 +140,14 @@ echo_wait(){ fi } +## - Check if a given array (parameter 2) contains a given string (parameter 1) +## - +containsElement () { + local e + for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done + return 1 +} + trim() { local var="$*" var="${var#"${var%%[![:space:]]*}"}" # remove leading whitespace characters @@ -166,20 +174,6 @@ else fi -# ========== -# - Begin Main Script -# ========== - -# ---------- -# - Headline -# ---------- - -if $terminal ; then - echo "" - -fi - - # ========== # - Begin Main Script # ========== @@ -313,14 +307,27 @@ BORG_LOG_FILE="${BORG_LOG_DIR}/borg-backup.log" if [[ -z "${DB_TYPE}" ]] ; then DB_TYPE="${DEFAULT_DB_TYPE}" -elif [[ "${DB_TYPE,,}" = "mysql" ]] ; then +else + # replace comma by blank sign + DB_TYPE=${DB_TYPE/,/ } +fi + +declare -a db_type_arr=() + +for _db_type in ${DB_TYPE}; do + if [[ "${DB_TYPE,,}" = "psql" ]] || [[ "${DB_TYPE,,}" = "postgresql" ]] || [[ "${DB_TYPE,,}" = "postgres" ]] ; then + db_type_arr+=("postgresql") + else + db_type_arr+=("${_db_type,,}") + fi +done + +if containsElement "mysql" "${db_type_arr[@]}" ; then [[ -z "${MYSQL_CREDENTIALS}" ]] && MYSQL_CREDENTIALS="${DEFAULT_MYSQL_CREDENTIALS}" -elif [[ "${DB_TYPE,,}" = "psql" ]] || [[ "${DB_TYPE,,}" = "postgresql" ]] || [[ "${DB_TYPE,,}" = "postgres" ]] ; then +fi + +if containsElement "postgresql" "${db_type_arr[@]}" ; then [[ -z "${PSQL_SYSTEM_USER}" ]] && PSQL_SYSTEM_USER="${DEFAULT_PSQL_SYSTEM_USER}" -elif [[ "${DB_TYPE,,}" = "none" ]] ; then - DB_TYPE="None" -else - fatal "Unknown DB_TYPE '${DB_TYPE}'." fi @@ -366,6 +373,37 @@ export BORG_RELOCATED_REPO_ACCESS_IS_OK=yes export BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK=yes +if $terminal ; then + + echo "" + echo -e " \033[1m----------\033[m" + echo -e " \033[32mScript parameter settings:.. \033[m" + echo -e " \033[1m----------\033[m" + echo "" + + + echo -e " BORG_HOST................: \033[33m${BORG_HOST}\033[m" + echo -e " BORG_REPO................: \033[33m${BORG_REPO}\033[m" + echo "" + + echo -e " DB_TYPE(s)...............: \033[33m${DB_TYPE}\033[m" + echo "" + + + declare -i index=0 + for _dir in ${BACKUP_DIRECTORIES} ; do + if [[ $index -lt 1 ]] ; then + echo -e " BACKUP_DIRECTORIES.......: \033[33m${_dir}\033[m" + else + echo -e " \033[33m${_dir}\033[m" + fi + (( index++ )) + done + + +fi + + if [ ! -d "${BORG_LOG_DIR}" ]; then echononl "Create borg log directory.." mkdir -p "${BORG_LOG_DIR}" > ${log_file} 2>&1 @@ -401,7 +439,7 @@ fi echo "# ----------" >> ${BORG_LOG_FILE} echo -e "# Running script '${script_name}' on $(date +%Y.%m.%d) at $(date +%H:%M) h .." >> ${BORG_LOG_FILE} echo "# ----------" >> ${BORG_LOG_FILE} - + echo "" >> ${BORG_LOG_FILE} echo "# Script parameter settings:" >> ${BORG_LOG_FILE} @@ -424,16 +462,26 @@ echo "COMPANY=\"${COMPANY}\"" >> ${BORG_LOG_FILE} echo "FROM_ADDRESS=\"${FROM_ADDRESS}\"" >> ${BORG_LOG_FILE} echo "" >> ${BORG_LOG_FILE} -if [[ -n "${DB_TYPE}" ]] && [[ "${DB_TYPE,,}" = "!none" ]]; then +if [[ -n "${DB_TYPE}" ]] && [[ ! "${DB_TYPE,,}" = "none" ]]; then echo "" >> ${BORG_LOG_FILE} echo "# ---" >> ${BORG_LOG_FILE} echo "# Create database backup .." >> ${BORG_LOG_FILE} echo "# ---" >> ${BORG_LOG_FILE} blank_line + + if $terminal ; then + echo "" + echo -e " \033[1m---\033[m" + echo -e " \033[32mCreate (local) database backup(s).. \033[m" + echo -e " \033[1m---\033[m" + fi + fi -if [[ "${DB_TYPE,,}" = "mysql" ]] ; then +if containsElement "mysql" "${db_type_arr[@]}" ; then + + blank_line echononl "Create an array of MySQL databases." @@ -472,20 +520,20 @@ EOF for _db in ${mysql_database_arr[@]} ; do - echononl "Dump Database '${_db}'.." + echononl " Dump MySQL Database '${_db}'.." cat <> ${BORG_LOG_FILE} mysqldump ${MYSQL_CREDENTIALS} \\ --single-transaction --routines \\ -h localhost \\ - -e ${_db} > ${DB_BACKUP_DIR}/${_db}-${backup_date}.sql + -e ${_db} > ${DB_BACKUP_DIR}/${_db}-mysql-${backup_date}.sql EOF mysqldump $MYSQL_CREDENTIALS \ --single-transaction --routines \ -h localhost \ - -e ${_db} > ${DB_BACKUP_DIR}/${_db}-${backup_date}.sql 2> ${log_file} + -e ${_db} > ${DB_BACKUP_DIR}/${_db}-mysql-${backup_date}.sql 2> ${log_file} if [[ -s "${log_file}" ]] ; then echo_failed @@ -495,8 +543,11 @@ EOF fi done +fi -elif [[ "${DB_TYPE,,}" = "psql" ]] || [[ "${DB_TYPE,,}" = "postgresql" ]] || [[ "${DB_TYPE,,}" = "postgres" ]] ; then +if containsElement "postgresql" "${db_type_arr[@]}" ; then + + blank_line echononl "Create an array of PostgreSQL databases." @@ -537,13 +588,13 @@ EOF for _db in ${psql_database_arr[@]} ; do - echononl "Dump Database '${_db}'.." + echononl " Dump PostgreSQL Database '${_db}'.." cat <> ${BORG_LOG_FILE} -su - ${PSQL_SYSTEM_USER} -c "pg_dump -c ${_db}" > ${DB_BACKUP_DIR}/${_db}-${backup_date}.sql +su - ${PSQL_SYSTEM_USER} -c "pg_dump -c ${_db}" > ${DB_BACKUP_DIR}/${_db}-psql-${backup_date}.sql EOF - su - ${PSQL_SYSTEM_USER} -c "pg_dump -c ${_db}" > ${DB_BACKUP_DIR}/${_db}-${backup_date}.sql 2> ${log_file} + su - ${PSQL_SYSTEM_USER} -c "pg_dump -c ${_db}" > ${DB_BACKUP_DIR}/${_db}-psql-${backup_date}.sql 2> ${log_file} if [[ -s "${log_file}" ]] ; then echo_failed @@ -557,6 +608,16 @@ EOF fi +blank_line + +if $terminal ; then + echo "" + echo -e " \033[1m---\033[m" + echo -e " \033[32mMain part of script - Create Borg2 backup(s).. \033[m" + echo -e " \033[1m---\033[m" + echo "" +fi + echononl "Create borg backup.." cat << EOF >> ${BORG_LOG_FILE} @@ -648,7 +709,6 @@ else cat ${log_file} >> ${BORG_LOG_FILE} fi - echononl "Free repository space by deleting unused chunks..." cat << EOF >> ${BORG_LOG_FILE} @@ -675,21 +735,39 @@ fi blank_line -# Remove DB local backup -# -echononl "Remove local DB backups.." +if [[ -n "${DB_TYPE}" ]] && [[ ! "${DB_TYPE,,}" = "none" ]]; then + echo "" >> ${BORG_LOG_FILE} + echo "# ---" >> ${BORG_LOG_FILE} + echo "# Remove database backup .." >> ${BORG_LOG_FILE} + echo "# ---" >> ${BORG_LOG_FILE} -echo "rm -f ${DB_BACKUP_DIR}/*-${backup_date}.sql" >> ${BORG_LOG_FILE} + if $terminal ; then + echo "" + echo -e " \033[1m---\033[m" + echo -e " \033[32mSome post-script tasks ... \033[m" + echo -e " \033[1m---\033[m" + echo "" + fi -rm -f ${DB_BACKUP_DIR}/*-${backup_date}.sql > ${log_file} 2>&1 + # Remove DB local backup + # + echononl "Remove local DB backups.." + + echo "rm -f ${DB_BACKUP_DIR}/*-${backup_date}.sql" >> ${BORG_LOG_FILE} + + rm -f ${DB_BACKUP_DIR}/*-${backup_date}.sql > ${log_file} 2>&1 + + if [[ $? -gt 0 ]] ; then + echo_failed + error "$(cat "${log_file}")" + else + echo_ok + fi -if [[ $? -gt 0 ]] ; then - echo_failed - error "$(cat "${log_file}")" -else - echo_ok fi + + # Duration of backup endTime=$(date +%s) endDateReadable=$(date --date @"$endTime" +"%d.%m.%Y - %H:%M:%S") @@ -701,8 +779,6 @@ durationReadable=$(printf "%02d hours %02d minutes %02d seconds" $durationHour $ echo -e "\n\n###### Server backup finished on ${endDateReadable} (${durationReadable}) ######\n" >> ${BORG_LOG_FILE} -blank_line - # Error Handling # @@ -793,12 +869,17 @@ if [ $error -gt 0 -o $warning -gt 0 ] ; then fi fi - blank_line - fi blank_line +if $terminal ; then + echo "" + echo -e " \033[1m---\033[m" + echo -e " \033[32mLog-File handling ... \033[m" + echo -e " \033[1m---\033[m" + echo "" +fi echononl "Create temporary logorotate configuration file 'logrotate_borg.conf'.."