diff --git a/borg.backup.functions.init.sh b/borg.backup.functions.init.sh index 407a0d6..8854d0d 100644 --- a/borg.backup.functions.init.sh +++ b/borg.backup.functions.init.sh @@ -5,6 +5,9 @@ if [ -z "${MODULE}" ]; then exit 1; fi; +# E: inherit trap ERR +# T: DEBUG and RETURN traps are inherited +# u: unset variables ere error set -ETu #-e -o pipefail trap _catch ERR trap _cleanup SIGINT SIGTERM @@ -18,9 +21,8 @@ _cleanup() { trap - SIGINT SIGTERM } _catch() { - echo "Some part of the script failed with ERROR: $? @COMMAND: '$BASH_COMMAND' @LINE: $(caller)" >&2; - # exit caller so we do not catch the same error again - exit 0; + local last_exit_code=$?; + echo "Some part of the script failed with ERROR: $last_exit_code @COMMAND: '$BASH_COMMAND' @LINE: $(caller)" >&2; } # on exit unset any exported var trap "unset BORG_BASE_DIR BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK BORG_RELOCATED_REPO_ACCESS_IS_OK" EXIT; @@ -91,7 +93,7 @@ REGEX=""; REGEX_COMMENT="^[\ \t]*#"; REGEX_GLOB='\*'; REGEX_NUMERIC="^[0-9]{1,2}$"; -REGEX_ERROR="^Some part of the script failed with an error:"; +REGEX_ERROR="^Some part of the script failed with ERROR:"; PRUNE_DEBUG=""; INIT_REPOSITORY=0; FOLDER_OK=0; diff --git a/borg.backup.functions.verify.sh b/borg.backup.functions.verify.sh index 3d48382..76b4c68 100644 --- a/borg.backup.functions.verify.sh +++ b/borg.backup.functions.verify.sh @@ -294,26 +294,15 @@ COMMAND_INFO="${COMMAND_EXPORT}${BORG_COMMAND} info ${OPT_REMOTE} ${REPOSITORY}" # MARK: VERIFY / INFO if [ "${VERIFY}" -eq 1 ] || [ "${INIT}" -eq 1 ]; then printf "${PRINTF_SUB_BLOCK}" "VERIFY" "$(date +'%F %T')" "${MODULE}"; - if [ -n "${TARGET_SERVER}" ]; then - if [ "${DEBUG}" -eq 1 ]; then - echo "${BORG_COMMAND} info ${OPT_REMOTE} ${REPOSITORY} 2>&1 "; - fi; - # use borg info and verify if it returns "Repository ID:" in the first line - REPO_VERIFY=$(${BORG_COMMAND} info ${OPT_REMOTE} "${REPOSITORY}" 2>&1); - __LAST_ERROR=$? - if [ $__LAST_ERROR -ne 0 ]; then - echo "[!] Repository verify error: ${REPO_VERIFY}"; - REPO_VERIFY=""; - else - REPO_VERIFY=$(echo "${REPO_VERIFY}" | grep "Repository ID:"); - fi; - # | grep "Repository ID:" - # this is currently a hack to work round the error code in borg info - # this checks if REPO_VERIFY holds this error message and then starts init - if [[ -z "${REPO_VERIFY}" ]] || [[ "${REPO_VERIFY}" =~ ${REGEX_ERROR} ]]; then - INIT_REPOSITORY=1; - fi; - elif [ ! -d "${REPOSITORY}" ]; then + if [ "${DEBUG}" -eq 1 ]; then + echo "${BORG_COMMAND} info ${OPT_REMOTE} ${REPOSITORY} 2>&1 "; + fi; + # use borg info and verify if it returns "Repository ID:" in the first line + REPO_VERIFY=$(${BORG_COMMAND} info ${OPT_REMOTE} "${REPOSITORY}" 2>&1); + __last_error=$?; + # on any error in verify command force new INIT + if [[ $__last_error -ne 0 ]]; then + echo "[!] Repository verify error: ${REPO_VERIFY}"; INIT_REPOSITORY=1; fi; # if verrify but no init and repo is there but init file is missing set it @@ -370,7 +359,7 @@ if [ "${INIT}" -eq 1 ] && [ "${INIT_REPOSITORY}" -eq 1 ]; then # exit after init exit; elif [ "${INIT}" -eq 1 ] && [ "${INIT_REPOSITORY}" -eq 0 ]; then - echo "[! $(date +'%F %T')] Repository already initialized"; + echo "[!] ($(date +'%F %T')) Repository already initialized"; echo "For more information run:" echo "${COMMAND_INFO}"; . "${DIR}/borg.backup.functions.close.sh" 1; @@ -379,7 +368,7 @@ fi; # verify for init file if [ ! -f "${BASE_FOLDER}${BACKUP_INIT_FILE}" ]; then - echo "[! $(date +'%F %T')] It seems the repository has never been initialized." + echo "[!] ($(date +'%F %T')) It seems the repository has never been initialized." echo "Please run -I to initialize or if already initialzed run with -C for init update." . "${DIR}/borg.backup.functions.close.sh" 1; exit 1; diff --git a/borg.backup.pgsql.sh b/borg.backup.pgsql.sh index 8d5011d..6c96209 100755 --- a/borg.backup.pgsql.sh +++ b/borg.backup.pgsql.sh @@ -1,5 +1,8 @@ #!/usr/bin/env bash +# allow variables in printf format string +# shellcheck disable=SC2059 + # Backup PostgreSQL # default is per table dump, can be set to one full dump # config override set in borg.backup.pgsql.settings @@ -32,7 +35,7 @@ BACKUP_LOCK_FILE="borg.backup.${MODULE}.lock"; # if info print info and then abort run . "${DIR}/borg.backup.functions.info.sh"; -if [ ! -z "${DATABASE_USER}" ]; then +if [ -n "${DATABASE_USER}" ]; then DB_USER=${DATABASE_USER}; else DB_USER='postgres'; @@ -95,7 +98,7 @@ CONN_DB_HOST=''; # -h CONN_DB_PORT=''; # -p # ALL IN ONE FILE or PER DATABASE FLAG -if [ ! -z "${DATABASE_FULL_DUMP}" ]; then +if [ -n "${DATABASE_FULL_DUMP}" ]; then SCHEMA_ONLY=''; schema_flag='data'; if [ "${DATABASE_FULL_DUMP}" = "schema" ]; then @@ -120,7 +123,7 @@ if [ ! -z "${DATABASE_FULL_DUMP}" ]; then fi; fi; if [ ${DRYRUN} -eq 0 ]; then - $(${PG_DUMPALL} -U ${DB_USER} ${CONN_DB_HOST} ${CONN_DB_PORT} ${SCHEMA_ONLY} -c | ${BORG_CALL}); + ${PG_DUMPALL} -U ${DB_USER} ${CONN_DB_HOST} ${CONN_DB_PORT} ${SCHEMA_ONLY} -c | ${BORG_CALL}; _backup_error=$?; if [ $_backup_error -ne 0 ]; then echo "[! $(date +'%F %T')] Backup creation failed for full dump with error code: ${_backup_error}"; @@ -133,7 +136,7 @@ if [ ! -z "${DATABASE_FULL_DUMP}" ]; then echo "Prune repository with keep${KEEP_INFO:1}"; ${BORG_PRUNE}; fi; - DURATION=$[ $(date +'%s')-$LOCAL_START ]; + DURATION=$(( $(date +'%s') - LOCAL_START )); printf "${PRINTF_DB_RUN_TIME_SUB_BLOCK}" "DONE" "all databases" "${MODULE}" "$(convert_time ${DURATION})"; else # dump globals first @@ -170,21 +173,21 @@ else echo "Prune repository with keep${KEEP_INFO:1}"; ${BORG_PRUNE}; fi; - DURATION=$[ $(date +'%s')-$LOCAL_START ]; + DURATION=$(( $(date +'%s') - LOCAL_START )); printf "${PRINTF_DB_RUN_TIME_SUB_BLOCK}" "DONE" "${db}" "${MODULE}" "$(convert_time ${DURATION})"; # get list of tables - for owner_db in $(${PG_PSQL} -U ${DB_USER} ${CONN_DB_HOST} ${CONN_DB_PORT} -d template1 -t -A -F "," -X -q -c "SELECT pg_catalog.pg_get_userbyid(datdba) AS owner, datname, pg_catalog.pg_encoding_to_char(encoding) AS encoding FROM pg_catalog.pg_database WHERE datname "\!"~ 'template(0|1)' ORDER BY datname;"); do + for owner_db in $(${PG_PSQL} -U ${DB_USER} ${CONN_DB_HOST} ${CONN_DB_PORT} -d template1 -t -A -F "," -X -q -c "SELECT pg_catalog.pg_get_userbyid(datdba) AS owner, datname, pg_catalog.pg_encoding_to_char(encoding) AS encoding FROM pg_catalog.pg_database WHERE datname ~ 'template(0|1)' ORDER BY datname;"); do LOCAL_START=$(date +'%s'); # get the user who owns the DB too - owner=$(echo ${owner_db} | cut -d "," -f 1); - db=$(echo ${owner_db} | cut -d "," -f 2); - encoding=$(echo ${owner_db} | cut -d "," -f 3); + owner=$(echo "${owner_db}" | cut -d "," -f 1); + db=$(echo "${owner_db}" | cut -d "," -f 2); + encoding=$(echo "${owner_db}" | cut -d "," -f 3); printf "${PRINTF_DB_SUB_BLOCK}" "DB" "${db}" "${MODULE}"; printf "${PRINTF_SUBEXT_BLOCK}" "BACKUP" "${db}" "$(date +'%F %T')" "${MODULE}"; include=0; if [ -s "${BASE_FOLDER}${INCLUDE_FILE}" ]; then - while read incl_db; do + while read -r incl_db; do if [ "${db}" = "${incl_db}" ]; then include=1; break; @@ -195,7 +198,7 @@ else fi; exclude=0; if [ -f "${BASE_FOLDER}${EXCLUDE_FILE}" ]; then - while read excl_db; do + while read -r excl_db; do if [ "${db}" = "${excl_db}" ]; then exclude=1; break; @@ -211,7 +214,7 @@ else # default is data dump SCHEMA_ONLY=''; schema_flag='data'; - while read schema_db; do + while read -r schema_db; do if [ "${db}" = "${schema_db}" ]; then SCHEMA_ONLY='-s'; schema_flag='schema'; @@ -223,7 +226,7 @@ else # default to schema, unless in data list SCHEMA_ONLY='-s'; schema_flag='schema'; - while read data_db; do + while read -r data_db; do if [ "${db}" = "${data_db}" ]; then SCHEMA_ONLY=''; schema_flag='data'; @@ -256,7 +259,7 @@ else fi; fi; if [ ${DRYRUN} -eq 0 ]; then - ${PG_DUMP} -U ${DB_USER} ${CONN_DB_HOST} ${CONN_DB_PORT} -c ${SCHEMA_ONLY} --format=c ${db} | ${BORG_CALL}; + ${PG_DUMP} -U ${DB_USER} ${CONN_DB_HOST} ${CONN_DB_PORT} -c ${SCHEMA_ONLY} --format=c "${db}" | ${BORG_CALL}; _backup_error=$?; if [ $_backup_error -ne 0 ]; then echo "[! $(date +'%F %T')] Backup creation failed for ${db} dump with error code: ${_backup_error}"; @@ -272,7 +275,7 @@ else else echo "- [E] ${db}"; fi; - DURATION=$[ $(date +'%s')-$LOCAL_START ]; + DURATION=$(( $(date +'%s') - LOCAL_START )); printf "${PRINTF_DB_RUN_TIME_SUB_BLOCK}" "DONE" "${db}" "${MODULE}" "$(convert_time ${DURATION})"; done; fi;