From 0c35a506485e0f3e864237679181e78fbb8cc75d Mon Sep 17 00:00:00 2001 From: Clemens Schwaighofer Date: Tue, 8 Oct 2024 15:44:18 +0900 Subject: [PATCH] Update PgBackRest wrapper script and move the config data into separate folder --- .shellcheckrc | 2 + ReadMe.md | 32 +++++++++++-- bin/pgbackrest_backup.sh | 93 ++++++++++++++++++++++++++++-------- config/.gitignore | 3 ++ config/pgbackrest.sample.cfg | 2 + config/stanza.sample.cfg | 3 ++ 6 files changed, 112 insertions(+), 23 deletions(-) create mode 100644 .shellcheckrc create mode 100644 config/.gitignore create mode 100644 config/pgbackrest.sample.cfg create mode 100644 config/stanza.sample.cfg diff --git a/.shellcheckrc b/.shellcheckrc new file mode 100644 index 0000000..b14745b --- /dev/null +++ b/.shellcheckrc @@ -0,0 +1,2 @@ +shell=bash +external-sources=true diff --git a/ReadMe.md b/ReadMe.md index ffa44fd..1c729ab 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -2,16 +2,40 @@ Wrapper to call the full/differential backup on all stanzas -> [!notice] -> Currently all stanzas are hardoded, this should change - ## Options ```txt -b (backuptype): full/diff --s (stanza): override stanza name, must be in list +-s (stanza): override stanza name, must be in stanza.cfg file -l list available stanza -t test run ``` Either `-l` or `-b` option must be set + +## Config + +Two files must be created + +### `config/pgbackrest.cfg` + +Example file is `pgbackrest.sample.cfg` + +This file holds the sudo_user for calling the commands + +```ini +[PgBackRest] +sudo_user=pgbackrest +``` + +### `config/stanza.cfg` + +Example file is `stanza.sample.cfg` + +This files holds the stanzas to backup + +```ini +[stanzas] +stanza_a +stanza_b +``` diff --git a/bin/pgbackrest_backup.sh b/bin/pgbackrest_backup.sh index 78adba0..8598b5b 100755 --- a/bin/pgbackrest_backup.sh +++ b/bin/pgbackrest_backup.sh @@ -49,36 +49,54 @@ function convert_time ## VARIABLES +REGEX_COMMENT="^[\ \t]*#"; +INI_BLOCK="^\[[A-Za-z]*\]"; +BASE_FOLDER=$(dirname "$(readlink -f "$0")")"/"; +CONFIG="${BASE_FOLDER}../config/"; BACKUP_TYPE=""; OVERRIDE_STANZA=""; LIST_STANZA=0; TEST=0; -sudo_user="pgbackrest"; -# testweb (replaces kome) (aws2/ohio) -# zac fte (aws2/tokyo) -# sushi database -# udon core -# mailing-service-a (aws2/oregon) -# url-redirect-logging (aws9/tokyo) -# mrktsec (aws3/tokyo) -# instawin (aws8/tokyo) -stanza_list="testwebegplusww zacfte sushidatabase udoncore mailingservicea urlredirectlogging mrktsec instawin"; +config_file="${CONFIG}pgbackrest.cfg"; +stanza_file="${CONFIG}stanza.cfg"; +if [ -f "${config_file}" ]; then + # shellcheck disable=SC1090 + # shellcheck disable=SC2283 + source <(grep = "${config_file}" | sed 's/ *= */=/g') +else + echo "Missing config file ${config_file}"; + exit; +fi; +if [ -z "${sudo_user}" ]; then + echo "sudo_user not set in the config file ${config_file}"; + exit; +fi; +# stanza list file +if [ ! -f "${stanza_file}" ]; then + echo "Missing stanza config file ${stanza_file}"; + exit; +fi; + PRINTF_BLOCK="=== [%-8s: %19s] ==[%s]===============>\n"; ## OPT PARSEIN while getopts ":b:s:lt" opt; do case "${opt}" in - b) # backuptype + b) + # backuptype BACKUP_TYPE="${OPTARG}"; ;; - s) # stanza + s) + # stanza OVERRIDE_STANZA="${OPTARG}"; ;; - l) # list + l) + # list LIST_STANZA=1; ;; - t) # test + t) + # test TEST=1; ;; :) @@ -106,6 +124,23 @@ if [ $LIST_STANZA -eq 1 ]; then for stanza in ${stanza_list}; do echo "${stanza}"; done; + while read -r stanza; do + # skip empty + [ -z "${stanza}" ] && continue; + # skip starting with # + [[ "${stanza}" =~ ${REGEX_COMMENT} ]] && continue; + # skip the ini header blocks + [[ "${stanza}" =~ ${INI_BLOCK} ]] && continue; + # if override stanza matching + if [ "${stanza}" = "${OVERRIDE_STANZA}" ]; then + echo "[*] ${stanza}"; + else + echo "[ ] ${stanza}"; + fi; + done <<< "$(cat "${stanza_file}")"; + echo ""; + echo "Entry marked with '*' is set as override stanza, and will be the only one backed up"; + echo ""; exit; fi; @@ -124,20 +159,40 @@ SET_OVERRIDE_STANZA=0; # if we have override single host if [ -n "${OVERRIDE_STANZA}" ]; then echo "+ Set override stanza too: ${OVERRIDE_STANZA}"; - for stanza in ${stanza_list}; do + while read -r stanza; do + # skip empty + [ -z "${stanza}" ] && continue; + # skip starting with # + [[ "${stanza}" =~ ${REGEX_COMMENT} ]] && continue; + # skip the ini header blocks + [[ "${stanza}" =~ ${INI_BLOCK} ]] && continue; + # if override stanza matching if [ "${stanza}" = "${OVERRIDE_STANZA}" ]; then stanza_list="${OVERRIDE_STANZA}"; SET_OVERRIDE_STANZA=1; break; fi; - done; + done <<< "$(cat "${stanza_file}")"; if [ $SET_OVERRIDE_STANZA = 0 ]; then echo "[!!!] Failed to set override stanza: ${OVERRIDE_STANZA}"; exit; fi; fi; # run backup -for stanza in ${stanza_list}; do +while read -r stanza; do + # skip empty + [ -z "${stanza}" ] && continue; + # skip starting with # + [[ "${stanza}" =~ ${REGEX_COMMENT} ]] && continue; + # skip the ini header blocks + [[ "${stanza}" =~ ${INI_BLOCK} ]] && continue; + # override stanza check + if [ -n "${OVERRIDE_STANZA}" ]; then + if [ "${stanza}" != "${OVERRIDE_STANZA}" ]; then + continue + fi; + fi; + # main backup start START=$(date +'%s'); # shellcheck disable=SC2059 printf "${PRINTF_BLOCK}" "START" "$(date +'%F %T')" "${stanza}"; @@ -145,12 +200,12 @@ for stanza in ${stanza_list}; do if [ $TEST -eq 1 ]; then echo "sudo -u ${sudo_user} pgbackrest --type=${BACKUP_TYPE} --stanza=${stanza} backup;"; else - sudo -u ${sudo_user} pgbackrest --type="${BACKUP_TYPE}" --stanza="${stanza}" backup; + sudo -u "${sudo_user}" pgbackrest --type="${BACKUP_TYPE}" --stanza="${stanza}" backup; fi; DURATION=$(( $(date +'%s')-START )); # shellcheck disable=SC2059 printf "${PRINTF_BLOCK}" "END" "$(convert_time ${DURATION})" "${stanza}"; -done; +done <<< "$(cat "${stanza_file}")"; echo "* PgBackrest Backup end"; if [ $TEST -eq 1 ]; then echo "[..........] TEST RUN ONLY"; diff --git a/config/.gitignore b/config/.gitignore new file mode 100644 index 0000000..bc27079 --- /dev/null +++ b/config/.gitignore @@ -0,0 +1,3 @@ +pgbackrest.cfg +stanza.cfg +!.gitignore diff --git a/config/pgbackrest.sample.cfg b/config/pgbackrest.sample.cfg new file mode 100644 index 0000000..b3abfcd --- /dev/null +++ b/config/pgbackrest.sample.cfg @@ -0,0 +1,2 @@ +[PgBackRest] +sudo_user=pgbackrest diff --git a/config/stanza.sample.cfg b/config/stanza.sample.cfg new file mode 100644 index 0000000..39a5abc --- /dev/null +++ b/config/stanza.sample.cfg @@ -0,0 +1,3 @@ +[stanzas] +stanza_a +stanza_b