Compare commits

...

9 Commits

Author SHA1 Message Date
Asif Bacchus
6fc82aac83 cleanup printf formatting 2020-08-14 00:39:23 -06:00
Asif Bacchus
760399a0fd update scriptHelp 2020-08-14 00:20:49 -06:00
Asif Bacchus
868398858e add defaults text formatting function 2020-08-14 00:10:48 -06:00
Asif Bacchus
44e57df831 func trapExit: cleanup printf formatting 2020-08-14 00:03:32 -06:00
Asif Bacchus
bbea5e871c add textblock formatting functions 2020-08-14 00:02:36 -06:00
Asif Bacchus
e74971997f funcs cleanup, exitError: printf formatting 2020-08-14 00:00:09 -06:00
Asif Bacchus
ffc7579666 func badParam: proper printf formatting 2020-08-13 23:53:51 -06:00
Asif Bacchus
acec0d6b23 check for tput before setting formatting 2020-08-13 23:51:36 -06:00
Asif Bacchus
5b1678c6ae set term to dummy for cron, update path 2020-08-13 23:48:52 -06:00

View File

@ -5,14 +5,34 @@
####### #######
### set environment variables
if [ -z "$TERM" ]; then
export TERM=dumb;
fi
export PATH=$PATH:/usr/local/bin
### text formatting presents ### text formatting presents
norm=$(tput sgr0) if command -v tput > /dev/null; then
err=$(tput bold)$(tput setaf 1) bold=$(tput bold)
warn=$(tput bold)$(tput setaf 3) cyan=$(tput setaf 6)
ok=$(tput setaf 2) err=$(tput bold)$(tput setaf 1)
yellow=$(tput setaf 3) magenta=$(tput setaf 5)
cyan=$(tput setaf 6) norm=$(tput sgr0)
magenta=$(tput setaf 5) ok=$(tput setaf 2)
warn=$(tput bold)$(tput setaf 3)
width=$(tput cols)
yellow=$(tput setaf 3)
else
bold=""
cyan=""
err=""
magenta=""
norm=""
ok=""
warn=""
width=80
yellow=""
fi
### trap ### trap
@ -33,20 +53,20 @@ badDetails () {
# bad parameter passed to script # bad parameter passed to script
badParam () { badParam () {
if [ "$1" = "dne" ]; then if [ "$1" = "dne" ]; then
printf "${err}\nError: '%s %s'\n" "$2" "$3" printf "\n%sError: '%s %s'\n" "$err" "$2" "$3"
printf "file or directory does not exist.${norm}\n\n" printf "file or directory does not exist.%s\n\n" "$norm"
exit 1 exit 1
elif [ "$1" = "empty" ]; then elif [ "$1" = "empty" ]; then
printf "${err}\nError: '%s' cannot have a NULL (empty) value.\n" "$2" printf "\n%sError: '%s' cannot have a NULL (empty) value.\n" "$err" "$2"
printf "${cyan}Please use '--help' for assistance${norm}\n\n" printf "%sPlease use '--help' for assistance%s\n\n" "$cyan" "$norm"
exit 1 exit 1
elif [ "$1" = "svc" ]; then elif [ "$1" = "svc" ]; then
printf "${err}\nError: '%s %s': Service does not exist!${norm}\n\n" \ printf "\n%sError: '%s %s': Service does not exist!${norm}\n\n" \
"$2" "$3" "$err" "$2" "$3"
exit 1 exit 1
elif [ "$1" = "user" ]; then elif [ "$1" = "user" ]; then
printf "${err}\nError: '%s %s': User does not exist!${norm}\n\n" \ printf "\n%sError: '%s %s': User does not exist!${norm}\n\n" \
"$2" "$3" "$err" "$2" "$3"
exit 1 exit 1
fi fi
} }
@ -56,109 +76,97 @@ cleanup () {
# cleanup 503 if copied # cleanup 503 if copied
if [ "$err503Copied" -eq 1 ]; then if [ "$err503Copied" -eq 1 ]; then
if ! rm -f "$webroot/$err503File" 2>>"$logFile"; then if ! rm -f "$webroot/$err503File" 2>>"$logFile"; then
printf "${warn}[%s] -- [WARNING] Could not remove 503 error page." \ printf "%s[%s] -- [WARNING] Could not remove 503 error page." \
"$(stamp)" >> "$logFile" "$warn" "$(stamp)" >> "$logFile"
printf " Web interface will not function until this file is " \ printf " Web interface will not function until this file is " \
>> "$logFile" >> "$logFile"
printf "removed --${norm}\n" >> "$logFile" printf "removed --%s\n" "$norm" >> "$logFile"
warnCount=$((warnCount+1)) warnCount=$((warnCount+1))
else else
printf "${cyan}[%s] -- [INFO] 503 error page removed --${norm}\n" \ printf "%s[%s] -- [INFO] 503 error page removed --%s\n" \
"$(stamp)" >> "$logFile" "$cyan" "$(stamp)" "$norm" >> "$logFile"
fi fi
fi fi
# remove EML temporary directory # remove EML temporary directory
if ! rm -rf "$exportDir" 2>>"$logFile"; then if ! rm -rf "$exportDir" 2>>"$logFile"; then
printf "${warn}[%s] -- [WARNING] Could not remove EML export tmp dir:" \ printf "%s[%s] -- [WARNING] Could not remove EML export tmp dir:" \
"$(stamp)" >> "$logFile" "$warn" "$(stamp)" >> "$logFile"
printf "\n%s\n" "$exportDir" >> "$logFile" printf "\n%s\n" "$exportDir" >> "$logFile"
printf "please remove this directory manually! --${norm}\n" \ printf "please remove this directory manually! --%s\n" "$norm" \
>> "$logFile" >> "$logFile"
warnCount=$((warnCount+1)) warnCount=$((warnCount+1))
else else
printf "${cyan}[%s] -- [INFO] EML temp directory removed --${norm}\n" \ printf "%s[%s] -- [INFO] EML temp directory removed --%s\n" \
"$(stamp)" >> "$logFile" "$cyan" "$(stamp)" "$norm" >> "$logFile"
fi fi
} }
# call cleanup and then exit with error report # call cleanup and then exit with error report
exitError () { exitError () {
printf "${err}[%s] -- [ERROR] %s: %s --${norm}\n" \ printf "%s[%s] -- [ERROR] %s: %s --%s\n" \
"$(stamp)" "$1" "$2" >> "$logFile" "$err" "$(stamp)" "$1" "$2" "$norm" >> "$logFile"
cleanup cleanup
# note script completion with error # note script completion with error
printf "${err}[%s] --- %s execution completed with error ---${norm}\n" \ printf "%s[%s] --- %s execution completed with error ---%s\n" \
"$(stamp)" "$scriptName" >> "$logFile" "$err" "$(stamp)" "$scriptName" "$norm" >> "$logFile"
exit "$1" exit "$1"
} }
# display script help information # display script help information
scriptHelp () { scriptHelp () {
printf "\n${cyan}%s\n" "--------------------------------------------------------------------------------" newline
printf "%sUsage: %s [parameters]%s\n\n" "$bold" "$scriptName" "$norm"
printf "Usage:${norm} %s [parameters]\n\n" "$scriptName" textblock "There are no mandatory parameters. If a parameter is not supplied, its default value will be used. In the case of a switch parameter, it will remain DEactivated by default."
printf "${cyan}Parameters ${yellow}(default value):${norm}\n" newline
printf "There are NO mandatory parameters. If a parameter is not " textblock "Parameters are listed then followed by a description of their effect on the following line. Finally, if a default value exists, it will be listed on the next line in (parentheses)."
printf "supplied, it's\n" newline
printf "default value will be used. In the case of a switch parameter, " textblock "${magenta}--- script related ---${norm}"
printf "it will\n" newline
printf "remain deactivated if not specified.\n\n" switchTextblock "-c | --config | --details"
textblock "Path to the configuration key/value pair file for this script."
printf "${magenta}script related\n" defaultsTextblock "(scriptPath/scriptName.details)"
printf "${cyan}-c, --config, --details${norm}\n" newline
printf "Path to the configuration key/value pair file for this script.\n" switchTextblock "-h | -? | --help"
printf "${yellow}(scriptPath/scriptName.details)${norm}\n\n" textblock "This help screen."
printf "${cyan}-h, -?, --help${norm}\n" newline
printf "This help screen.\n\n" switchTextblock "-l | --log"
printf "${cyan}-l, --log${norm}\n" textblock "Path to write log file."
printf "Path to write log file.\n" defaultsTextblock "(scriptPath/scriptName.log)"
printf "${yellow}(scriptPath/scriptName.log)${norm}\n\n" newline
printf "${cyan}-v, --verbose${norm}\n" switchTextblock "[SWITCH] -v | --verbose"
printf "Log borg output with increased verbosity (list all files). " textblock "Log borg output with increased verbosity (list all files). Careful! Your log file can get very large very quickly!"
printf "Careful! Your\n" defaultsTextblock "(normal output, option is OFF)"
printf "log file can get large very quickly! This is a switch value, " newline
printf "specifying it\n" textblock "${magenta}--- export options ---${norm}"
printf "will turn the option ON.\n" newline
printf "${yellow}(normal output, option is OFF)${norm}\n\n" switchTextblock "[SWITCH] -a | --all"
textblock "Export ALL email saved by piler. This is generally only useful for an initial backup. Setting this switch will override any specified start/end dates."
printf "${magenta}export options\n" defaultsTextblock "(use start/end dates, option is OFF)"
printf "${cyan}-a, --all${norm}\n" newline
printf "Export ALL email saved by piler. This is generally only useful " switchTextblock "--start"
printf "for an initial\n" textblock "Export email starting from this date (inclusive). Date MUST be provided in YYYY.MM.DD format."
printf "backup. This is a switch parameter and WILL override specified " defaultsTextblock "(yesterday's date)"
printf "start/end dates.\n" newline
printf "${yellow}(option is OFF, use start/end dates)${norm}\n\n" switchTextblock "--end"
printf "${cyan}--start${norm}\n" textblock "Export email ending at this date (inclusive). Date MUST be provided in YYYY.MM.DD format."
printf "Export email starting from this date (inclusive)\n" defaultsTextblock "(yesterday's date)"
printf "Date MUST be provided in the format 'YYYY.MM.DD'\n" newline
printf "${yellow}(Yesterday's date)${norm}\n\n" textblock "${magenta}--- 503 functionality ---${norm}"
printf "${cyan}--end${norm}\n" newline
printf "Export email ending at this date (inclusive)\n" switchTextblock "[SWITCH] -5 | --use-503"
printf "Date MUST be provided in the format 'YYYY.MM.DD'\n" textblock "Copy an 'error 503' page/indicator file to your webroot for your webserver to find. Specifying this option will enable other 503 options."
printf "${yellow}(Yesterday's date)${norm}\n\n" defaultsTextblock "(do NOT copy, option is OFF)"
newline
printf "${magenta}503 functionality\n" switchTextblock "--503-path"
printf "${cyan}-5, --use-503${norm}\n" textblock "Path to the file you want copied to your webroot as the 'error 503' page."
printf "Copy an 'error 503' page to your webroot for your webserver to " defaultsTextblock "(scriptPath/503_backup.html)"
printf "find. This is a\n" newline
printf "switch value, specifying it will instruct the script to copy the " switchTextblock "-w | --webroot"
printf "error page.\n" textblock "Path to where the 'error 503' file should be copied."
printf "${yellow}(do NOT copy, option is OFF)${norm}\n\n" defaultsTextblock "(/usr/share/nginx/html/)"
printf "${cyan}--503-path${norm}\n" newline
printf "Path to the file you want copied to your webroot as the 'error " textblock "More details and examples of script usage can be found in the repo wiki at ${yellow}https://git.asifbacchus.app/asif/pilerBackup/wiki${norm}"
printf "503' page during\n" newline
printf "backup operations.\n"
printf "${yellow}(scriptPath/503_backup.html)${norm}\n\n"
printf "${cyan}-w, --webroot${norm}\n"
printf "Path to where the 'error 503' file should be copied during "
printf "backups.\n"
printf "${yellow}(/usr/share/nginx/html)${norm}\n\n"
printf "More details and examples of script usage can be found in the "
printf "repo wiki at\n"
printf "${yellow}https://git.asifbacchus.app/asif/pilerBackup/wiki${norm}\n"
printf "${cyan}%s${norm}\n\n" "--------------------------------------------------------------------------------"
} }
# generate dynamic timestamps # generate dynamic timestamps
@ -166,14 +174,30 @@ stamp () {
(date +%F" "%T) (date +%F" "%T)
} }
textblock() {
printf "%s\n" "$1" | fold -w "$width" -s
}
defaultsTextblock() {
printf "%s%s%s\n" "$yellow" "$1" "$norm"
}
switchTextblock() {
printf "%s%s%s\n" "$cyan" "$1" "$norm"
}
newline() {
printf "\n"
}
# same as exitError but for signal captures # same as exitError but for signal captures
trapExit () { trapExit () {
printf "${err}[%s] -- [ERROR] 99: Caught signal --${norm}\n" \ printf "%s[%s] -- [ERROR] 99: Caught signal --%s\n" \
"$(stamp)" >> "$logFile" "$err" "$(stamp)" "$norm" >> "$logFile"
cleanup cleanup
# note script completion with error # note script completion with error
printf "${err}[%s] --- %s execution was terminated via signal ---${norm}\n" \ printf "%s[%s] --- %s execution was terminated via signal ---%s\n" \
"$(stamp)" "$scriptName" >> "$logFile" "$err" "$(stamp)" "$scriptName" "$norm" >> "$logFile"
exit 99 exit 99
} }
@ -312,8 +336,8 @@ while [ $# -gt 0 ]; do
fi fi
;; ;;
*) *)
printf "${err}\nUnknown option: %s\n" "$1" printf "%s\nUnknown option: %s\n" "$err" "$1"
printf "${cyan}Use '--help' for valid options.{$norm}\n\n" printf "%sUse '--help' for valid options.%s\n\n" "$cyan" "$norm"
exit 1 exit 1
;; ;;
esac esac
@ -324,13 +348,13 @@ done
### check pre-requisites and default values ### check pre-requisites and default values
# check if running as root, otherwise exit # check if running as root, otherwise exit
if [ $( id -u ) -ne 0 ]; then if [ $( id -u ) -ne 0 ]; then
printf "\n${err}ERROR: script MUST be run as ROOT${norm}\n\n" printf "\n%sERROR: script MUST be run as ROOT%s\n\n" "$err" "$norm"
exit 2 exit 2
fi fi
# find pilerexport, otherwise this is all pointless # find pilerexport, otherwise this is all pointless
pilerExport=$( command -v pilerexport ) pilerExport=$( command -v pilerexport )
if [ ! "$pilerExport" ]; then if [ ! "$pilerExport" ]; then
printf "\n${err}ERROR: cannot find 'pilerexport'${norm}\n\n" printf "\n%sERROR: cannot find 'pilerexport'%s\n\n" "$err" "$norm"
exit 4 exit 4
fi fi
# does the details file exist? # does the details file exist?
@ -339,7 +363,7 @@ if [ ! -f "$configDetails" ]; then
fi fi
# is borg installed? # is borg installed?
if ! command -v borg > /dev/null; then if ! command -v borg > /dev/null; then
printf "\n${err}ERROR: BORG is not installed on this system!${norm}\n\n" printf "\n%sERROR: BORG is not installed on this system!%s\n\n" "$err" "$norm"
exit 3 exit 3
fi fi
# if 503 functionality is enabled, do 503 related files exist? # if 503 functionality is enabled, do 503 related files exist?
@ -353,26 +377,26 @@ fi
### start logging ### start logging
printf "${magenta}[%s] --- Start %s execution ---${norm}\n" \ printf "%s[%s] --- Start %s execution ---%s\n" \
"$(stamp)" "$scriptName" >> "$logFile" "$magenta" "$(stamp)" "$scriptName" "$norm" >> "$logFile"
printf "${cyan}[%s] -- [INFO] Log located at ${yellow}%s${cyan} --${norm}\n" \ printf "%s[%s] -- [INFO] Log located at %s%s%s --%s\n" \
"$(stamp)" "$logFile" >> "$logFile" "$cyan" "$(stamp)" "$yellow" "$logFile" "$cyan" "$norm" >> "$logFile"
### 503 functionality ### 503 functionality
if [ "$use503" -eq 1 ]; then if [ "$use503" -eq 1 ]; then
printf "${cyan}[%s] -- [INFO] Copying 503 error page to " \ printf "%s[%s] -- [INFO] Copying 503 error page to " \
"$(stamp)" >> "$logFile" "$cyan" "$(stamp)" >> "$logFile"
printf "webroot -- ${norm}\n" >> "$logFile" printf "webroot -- %s\n" "$norm" >> "$logFile"
if ! \cp --force "${err503Path}" "${webroot}/${err503File}" 2>> "$logFile" if ! \cp --force "${err503Path}" "${webroot}/${err503File}" 2>> "$logFile"
then then
printf "${warn}[%s] -- [WARNING] Failed to copy 503 error page. " \ printf "%s[%s] -- [WARNING] Failed to copy 503 error page. " \
"$(stamp)" >> "$logFile" "$warn" "$(stamp)" >> "$logFile"
printf "Web users will NOT be notified --${norm}\n" >> "$logFile" printf "Web users will NOT be notified --%s\n" "$norm" >> "$logFile"
warnCount=$((warnCount+1)) warnCount=$((warnCount+1))
else else
printf "${ok}[%s] -- [SUCCESS] 503 error page copied --${norm}\n" \ printf "%s[%s] -- [SUCCESS] 503 error page copied --%s\n" \
"$(stamp)" >> "$logFile" "$ok" "$(stamp)" "$norm" >> "$logFile"
# set cleanup flag # set cleanup flag
err503Copied=1 err503Copied=1
fi fi
@ -391,8 +415,8 @@ case "${configDetails}" in
. "./${configDetails}" . "./${configDetails}"
;; ;;
esac esac
printf "${cyan}[%s] -- [INFO] ${yellow}%s${cyan} imported --${norm}\n" \ printf "%s[%s] -- [INFO] %s%s%s imported --%s\n" \
"$(stamp)" "$configDetails" >> "$logFile" "$cyan" "$(stamp)" "$yellow" "$configDetails" "$cyan" "$norm" >> "$logFile"
## create tmp directory and change to it for export operations ## create tmp directory and change to it for export operations
@ -407,36 +431,36 @@ fi
if ! cd "$exportDir"; then if ! cd "$exportDir"; then
exitError 113 "Unable to change to temporary export directory" exitError 113 "Unable to change to temporary export directory"
fi fi
printf "${cyan}[%s] -- [INFO] EML files will be temporarily stored in:" \ printf "%s[%s] -- [INFO] EML files will be temporarily stored in:" \
"$(stamp)" >> "$logFile" "$cyan" "$(stamp)" >> "$logFile"
printf "\n${yellow}%s/${cyan} --${norm}\n" "$exportDir" >> "$logFile" printf "\n\t%s%s/%s --%s\n" "$yellow" "$exportDir" "$cyan" "$norm" >> "$logFile"
## export EML from piler ## export EML from piler
printf "${cyan}[%s] -- [INFO] Exporting EML files from piler --${norm}\n" \ printf "%s[%s] -- [INFO] Exporting EML files from piler --%s\n" \
"$(stamp)" >> "$logFile" "$cyan" "$(stamp)" "$norm" >> "$logFile"
if [ "$exportAll" -eq 1 ]; then if [ "$exportAll" -eq 1 ]; then
if ! ${pilerExport} -A 2>>"$logFile"; then if ! ${pilerExport} -A 2>>"$logFile"; then
exitError 115 "There was a problem while exporting EML from piler" exitError 115 "There was a problem while exporting EML from piler"
fi fi
printf "${ok}[%s] -- [SUCCESS] Exported EML files from piler --${norm}\n" \ printf "%s[%s] -- [SUCCESS] Exported EML files from piler --%s\n" \
"$(stamp)" >> "$logFile" "$ok" "$(stamp)" "$norm" >> "$logFile"
else else
if ! ${pilerExport} -a "$exportStart" -b "$exportEnd" 2>>"$logFile"; then if ! ${pilerExport} -a "$exportStart" -b "$exportEnd" 2>>"$logFile"; then
exitError 115 "There was a problem while exporting EML from piler" exitError 115 "There was a problem while exporting EML from piler"
fi fi
printf "${ok}[%s] -- [SUCCESS] Exported EML files from piler --${norm}\n" \ printf "%s[%s] -- [SUCCESS] Exported EML files from piler --%s\n" \
"$(stamp)" >> "$logFile" "$ok" "$(stamp)" "$norm" >> "$logFile"
fi fi
### pre-backup tasks completed -- move to borg tasks ### pre-backup tasks completed -- move to borg tasks
printf "${ok}[%s] -- [SUCCESS] Pre-backup tasks completed --${norm}\n" \ printf "%s[%s] -- [SUCCESS] Pre-backup tasks completed --%s\n" \
"$(stamp)" >> "$logFile" "$ok" "$(stamp)" "$norm" >> "$logFile"
### Run borg variable checks ### Run borg variable checks
printf "${cyan}[%s] -- [INFO] Verifying supplied borg details --${norm}\n" \ printf "%s[%s] -- [INFO] Verifying supplied borg details --%s\n" \
"$(stamp)" >> "$logFile" "$cyan" "$(stamp)" "$norm" >> "$logFile"
## verify borg base directory ## verify borg base directory
if [ -z "${borgBaseDir}" ]; then if [ -z "${borgBaseDir}" ]; then
@ -444,8 +468,8 @@ if [ -z "${borgBaseDir}" ]; then
elif [ ! -d "${borgBaseDir}" ]; then elif [ ! -d "${borgBaseDir}" ]; then
badDetails dne 'borgBaseDir' badDetails dne 'borgBaseDir'
fi fi
printf "${magenta}details:borgBaseDir ${norm}-- ${ok}[OK]${norm}\n" \ printf "%sdetails:borgBaseDir%s -- %s[OK]%s\n" \
>> "$logFile" "$magenta" "$norm" "$ok" "$norm" >> "$logFile"
export BORG_BASE_DIR="${borgBaseDir%/}" export BORG_BASE_DIR="${borgBaseDir%/}"
## check path to SSH keyfile ## check path to SSH keyfile
@ -454,28 +478,28 @@ if [ -z "${borgSSHKey}" ]; then
elif [ ! -f "${borgSSHKey}" ]; then elif [ ! -f "${borgSSHKey}" ]; then
badDetails dne 'borgSSHKey' badDetails dne 'borgSSHKey'
fi fi
printf "${magenta}details:borgSSHKey ${norm}-- ${ok}[OK]${norm}\n" \ printf "%sdetails:borgSSHKey%s -- %s[OK]%s\n" \
>> "$logFile" "$magenta" "$norm" "$ok" "$norm" >> "$logFile"
export BORG_RSH="ssh -i ${borgSSHKey}" export BORG_RSH="ssh -i ${borgSSHKey}"
## check borg repo connect string ## check borg repo connect string
if [ -z "${borgConnectRepo}" ]; then if [ -z "${borgConnectRepo}" ]; then
badDetails empty 'borgConnectRepo' badDetails empty 'borgConnectRepo'
fi fi
printf "${magenta}details:borgConnectRepo ${norm}-- ${ok}[OK]${norm}\n" \ printf "%sdetails:borgConnectRepo%s -- %s[OK]%s\n" \
>> "$logFile" "$magenta" "$norm" "$ok" "$norm" >> "$logFile"
export BORG_REPO="${borgConnectRepo}" export BORG_REPO="${borgConnectRepo}"
## check borg repo password ## check borg repo password
if [ -n "${borgRepoPassphrase}" ]; then if [ -n "${borgRepoPassphrase}" ]; then
printf "${magenta}details:borgRepoPassphrase ${norm}-- ${ok}[OK]${norm}\n" \ printf "%sdetails:borgRepoPassphrase%s -- %s[OK]%s\n" \
>> "$logFile" "$magenta" "$norm" "$ok" "$norm" >> "$logFile"
export BORG_PASSPHRASE="${borgRepoPassphrase}" export BORG_PASSPHRASE="${borgRepoPassphrase}"
else else
# if passwd is blank intentionally, this is insecure # if passwd is blank intentionally, this is insecure
printf "${warn} -- [WARNING] Using a borg repo without a password is an " \ printf "%s-- [WARNING] Using a borg repo without a password is an " \
>> "$logFile" "$warn" >> "$logFile"
printf "insecure configuration --${norm}\n" >> "$logFile" printf "insecure configuration --%s\n" "$norm" >> "$logFile"
warnCount=$((warnCount+1)) warnCount=$((warnCount+1))
# if this was an accident, we need to provide a bogus passwd so borg fails # if this was an accident, we need to provide a bogus passwd so borg fails
# otherwise it will sit forever just waiting for input # otherwise it will sit forever just waiting for input
@ -501,8 +525,8 @@ if [ -n "${borgXtraListPath}" ]; then
done <<EOF done <<EOF
$( sed -e '/^\s*#.*$/d' -e '/^\s*$/d' "${borgXtraListPath}" ) $( sed -e '/^\s*#.*$/d' -e '/^\s*$/d' "${borgXtraListPath}" )
EOF EOF
printf "${magenta}details:borgXtraListPath ${norm}-- ${ok}[OK]${norm}\n" \ printf "%sdetails:borgXtraListPath%s -- %s[OK]%s\n" \
>> "$logFile" "$magenta" "$norm" "$ok" "$norm" >> "$logFile"
includeXtra=1 includeXtra=1
fi fi
@ -527,9 +551,9 @@ if [ ! -d "${borgBaseDir}/tmp" ]; then
if ! mkdir "${borgBaseDir}/tmp"; then if ! mkdir "${borgBaseDir}/tmp"; then
exitError 132 "Unable to create borg ${borgBaseDir}/tmp directory" exitError 132 "Unable to create borg ${borgBaseDir}/tmp directory"
else else
printf "${cyan}[%s] -- [INFO] Created ${yellow}%s/tmp " \ printf "%s[%s] -- [INFO] Created %s%s/tmp " \
"$(stamp)" "${borgBaseDir}" >> "$logFile" "$cyan" "$(stamp)" "$yellow" "${borgBaseDir}" >> "$logFile"
printf "${cyan}--${norm}\n" >> "$logFile" printf "%s--%s\n" "$cyan" "$norm" >> "$logFile"
fi fi
fi fi
export TMPDIR="${borgBaseDir}/tmp" export TMPDIR="${borgBaseDir}/tmp"
@ -556,66 +580,66 @@ if [ "$includeXtra" -eq 1 ]; then
fi fi
# execute borg # execute borg
printf "${cyan}[%s] -- [INFO] Executing borg backup operation --${norm}\n" \ printf "%s[%s] -- [INFO] Executing borg backup operation --%s\n" \
"$(stamp)" >> "$logFile" "$cyan" "$(stamp)" "$norm" >> "$logFile"
${borgCMD} 2>> "$logFile" ${borgCMD} 2>> "$logFile"
borgResult="$?" borgResult="$?"
## check borg exit status ## check borg exit status
if [ "$borgResult" -eq 0 ]; then if [ "$borgResult" -eq 0 ]; then
printf "${ok}[%s] -- [SUCCESS] Borg backup completed --${norm}\n" \ printf "%s[%s] -- [SUCCESS] Borg backup completed --%s\n" \
"$(stamp)" >> "$logFile" "$ok" "$(stamp)" "$norm" >> "$logFile"
elif [ "$borgResult" -eq 1 ]; then elif [ "$borgResult" -eq 1 ]; then
printf "${warn}[%s] -- [WARNING] Borg completed with warnings. " \ printf "%s[%s] -- [WARNING] Borg completed with warnings. " \
"$(stamp)" >> "$logFile" "$warn" "$(stamp)" >> "$logFile"
printf "Review this logfile for details --${norm}\n" >> "$logFile" printf "Review this logfile for details --%s\n" "$norm" >> "$logFile"
warnCount=$((warnCount+1)) warnCount=$((warnCount+1))
elif [ "$borgResult" -ge 2 ]; then elif [ "$borgResult" -ge 2 ]; then
err_1="Borg exited with a critical error. Please review this log file" err_1="Borg exited with a critical error. Please review this log file"
err_2="for details." err_2="for details."
exitError 138 "$err_1 $err_2" exitError 138 "$err_1 $err_2"
else else
printf "${warn}[%s] -- [WARNING] Borg exited with unknown return code. " \ printf "%s[%s] -- [WARNING] Borg exited with unknown return code. " \
"$(stamp)" >> "$logFile" "$warn" "$(stamp)" >> "$logFile"
printf "Review this logfile for details --${norm}\n" >> "$logFile" printf "Review this logfile for details --%s\n" "$norm" >> "$logFile"
warnCount=$((warnCount+1)) warnCount=$((warnCount+1))
fi fi
### execute borg prune if paramters are provided, otherwise skip with a warning ### execute borg prune if paramters are provided, otherwise skip with a warning
if [ -n "${borgPruneSettings}" ]; then if [ -n "${borgPruneSettings}" ]; then
printf "${cyan}[%s] -- [INFO] Executing borg prune operation --${norm}\n" \ printf "%s[%s] -- [INFO] Executing borg prune operation --%s\n" \
"$(stamp)" >> "$logFile" "$cyan" "$(stamp)" "$norm" >> "$logFile"
borg prune --show-rc -v ${borgPruneParams} ${borgPruneSettings} \ borg prune --show-rc -v ${borgPruneParams} ${borgPruneSettings} \
2>> "$logFile" 2>> "$logFile"
borgPruneResult="$?" borgPruneResult="$?"
else else
printf "${warn}[%s] -- [WARNING] No prune parameters provided. " \ printf "%s[%s] -- [WARNING] No prune parameters provided. " \
"$(stamp)" >> "$logFile" "$warn" "$(stamp)" >> "$logFile"
printf "Your archive will continue growing with each backup --${norm}\n" \ printf "Your archive will continue growing with each backup --%s\n" \
>> "$logFile" "$norm" >> "$logFile"
warnCount=$((warnCount+1)) warnCount=$((warnCount+1))
fi fi
## report on prune operation if executed ## report on prune operation if executed
if [ -n "${borgPruneResult}" ]; then if [ -n "${borgPruneResult}" ]; then
if [ "${borgPruneResult}" -eq 0 ]; then if [ "${borgPruneResult}" -eq 0 ]; then
printf "${ok}[%s] -- [SUCCESS] Borg prune completed --${norm}\n" \ printf "%s[%s] -- [SUCCESS] Borg prune completed --%s\n" \
"$(stamp)" >> "$logFile" "$ok" "$(stamp)" "$norm" >> "$logFile"
elif [ "$borgPruneResult" -eq 1 ]; then elif [ "$borgPruneResult" -eq 1 ]; then
printf "${warn}[%s] -- [WARNING] Borg prune completed with warnings. " \ printf "%s[%s] -- [WARNING] Borg prune completed with warnings. " \
"$(stamp)" >> "$logFile" "$warn" "$(stamp)" >> "$logFile"
printf "Review this logfile for details --${norm}\n" >> "$logFile" printf "Review this logfile for details --%s\n" "$norm" >> "$logFile"
warnCount=$((warnCount+1)) warnCount=$((warnCount+1))
elif [ "$borgPruneResult" -ge 2 ]; then elif [ "$borgPruneResult" -ge 2 ]; then
err_1="Borg prune exited with a critical error. Please review this" err_1="Borg prune exited with a critical error. Please review this"
err_2="log file for details." err_2="log file for details."
exitError 139 "$err_1 $err_2" exitError 139 "$err_1 $err_2"
else else
printf "${warn}[%s] -- [WARNING] Borg prune exited with an unknown " \ printf "%s[%s] -- [WARNING] Borg prune exited with an unknown " \
"$(stamp)" >> "$logFile" "$warn" "$(stamp)" >> "$logFile"
printf "return code. Review this logfile for details --${norm}\n" \ printf "return code. Review this logfile for details --%s\n" \
>> "$logFile" "$norm" >> "$logFile"
warnCount=$((warnCount+1)) warnCount=$((warnCount+1))
fi fi
fi fi
@ -624,21 +648,21 @@ fi
### all processes successfully completed, cleanup and exit gracefully ### all processes successfully completed, cleanup and exit gracefully
# note successful completion of borg commands # note successful completion of borg commands
printf "${ok}[%s] -- [SUCCESS] Backup operations completed --${norm}\n" \ printf "%s[%s] -- [SUCCESS] Backup operations completed --%s\n" \
"$(stamp)" >> "$logFile" "$ok" "$(stamp)" "$norm" >> "$logFile"
# cleanup # cleanup
cleanup cleanup
# note complete success, tally warnings and exit # note complete success, tally warnings and exit
printf "${ok}[%s] -- [SUCCESS] All processes completed --${norm}\n" \ printf "%s[%s] -- [SUCCESS] All processes completed --%s\n" \
"$(stamp)" >> "$logFile" "$ok" "$(stamp)" "$norm" >> "$logFile"
printf "${magenta}[%s] --- %s execution completed ---${norm}\n" \ printf "%s[%s] --- %s execution completed ---%s\n" \
"$(stamp)" "$scriptName" >> "$logFile" "$magenta" "$(stamp)" "$scriptName" "$norm" >> "$logFile"
if [ "$warnCount" -gt 0 ]; then if [ "$warnCount" -gt 0 ]; then
printf "${warn}%s warnings issued!${norm}\n" "${warnCount}" >> "$logFile" printf "%s%s warnings issued!%s\n" "$warn" "${warnCount}" "$norm" >> "$logFile"
else else
printf "${ok}0 warnings issued.${norm}\n" >> "$logFile" printf "%s0 warnings issued.%s\n" "$ok" "$norm" >> "$logFile"
fi fi
exit 0 exit 0