Compare commits

..

No commits in common. "12bc49a59e419d8ca20bb00026f4ea5cecae0259" and "ed9db22534924a259c4f4f302d98fd1d33400259" have entirely different histories.

View File

@ -12,6 +12,7 @@ lit="\e[93m"
op="\e[39m" op="\e[39m"
info="\e[96m" info="\e[96m"
note="\e[95m" note="\e[95m"
stamp="[`date +%Y-%m-%d` `date +%H:%M:%S`]"
### Functions ### ### Functions ###
@ -100,10 +101,6 @@ function scriptHelp {
exit 1 exit 1
} }
function stamp {
echo `date +%F" "%T`
}
### quit -- exit the script after logging any errors, warnings, etc. ### quit -- exit the script after logging any errors, warnings, etc.
function quit { function quit {
# list generated warnings, if any # list generated warnings, if any
@ -120,7 +117,7 @@ function quit {
fi fi
if [ -z "${exitError}" ]; then if [ -z "${exitError}" ]; then
# exit cleanly # exit cleanly
echo -e "${note}[$(stamp)] -- ${scriptName} completed" \ echo -e "${note}${stamp} -- ${scriptName} completed" \
"--${normal}" >> "$logFile" "--${normal}" >> "$logFile"
exit 0 exit 0
else else
@ -177,10 +174,10 @@ function cleanup {
checkResult="$?" checkResult="$?"
if [ "$checkResult" = "0" ]; then if [ "$checkResult" = "0" ]; then
# directory still exists # directory still exists
exitWarn+=("[$(stamp)]_111") exitWarn+=("${stamp}_111")
else else
# directory removed # directory removed
echo -e "${op}[$(stamp)] Removed SQL temp directory${normal}" \ echo -e "${op}${stamp} Removed SQL temp directory${normal}" \
>> "$logFile" >> "$logFile"
fi fi
@ -188,21 +185,21 @@ function cleanup {
# check value of 'clean503' to see if this is necessary (=1) otherwise, skip # check value of 'clean503' to see if this is necessary (=1) otherwise, skip
if [ "$clean503" = "1" ]; then if [ "$clean503" = "1" ]; then
# proceed with cleanup # proceed with cleanup
echo -e "${op}[$(stamp)] Removing 503 error page..." >> "$logFile" echo -e "${op}${stamp} Removing 503 error page..." >> "$logFile"
rm -f "$webroot/$err503File" >> "$logFile" 2>&1 rm -f "$webroot/$err503File" >> "$logFile" 2>&1
# verify file is actually gone # verify file is actually gone
checkExist ff "$webroot/$err503File" checkExist ff "$webroot/$err503File"
checkResult="$?" checkResult="$?"
if [ "$checkResult" = "0" ]; then if [ "$checkResult" = "0" ]; then
# file still exists # file still exists
exitWarn+=("[$(stamp)]_5030") exitWarn+=("${stamp}_5030")
else else
# file removed # file removed
echo -e "${info}[$(stamp)] -- [INFO] 503 page removed from webroot" \ echo -e "${info}${stamp} -- [INFO] 503 page removed from webroot" \
"--${normal}" >> "$logFile" "--${normal}" >> "$logFile"
fi fi
else else
echo -e "${op}[$(stamp)] 503 error page never copied to webroot," \ echo -e "${op}${stamp} 503 error page never copied to webroot," \
"nothing to cleanup" >> "$logFile" "nothing to cleanup" >> "$logFile"
fi fi
@ -210,18 +207,18 @@ function cleanup {
# start and verify postfix # start and verify postfix
operateDocker start postfix operateDocker start postfix
if [ "$dockerResultState" = "true" ]; then if [ "$dockerResultState" = "true" ]; then
echo -e "${info}[$(stamp)] -- [INFO] Postfix container is running --" \ echo -e "${info}${stamp} -- [INFO] Postfix container is running --" \
"${normal}" >> "$logFile" "${normal}" >> "$logFile"
else else
exitError+=("[$(stamp)]_103") exitError+=("${stamp}_103")
fi fi
# start and verify dovecot # start and verify dovecot
operateDocker start dovecot operateDocker start dovecot
if [ "$dockerResultState" = "true" ]; then if [ "$dockerResultState" = "true" ]; then
echo -e "${info}[$(stamp)] -- [INFO] Dovecot container is running --" \ echo -e "${info}${stamp} -- [INFO] Dovecot container is running --" \
"${normal}" >> "$logFile" "${normal}" >> "$logFile"
else else
exitError+=("[$(stamp)]_104") exitError+=("${stamp}_104")
fi fi
} }
@ -229,7 +226,7 @@ function cleanup {
function operateDocker { function operateDocker {
# determine action to take # determine action to take
if [ "$1" = "stop" ]; then if [ "$1" = "stop" ]; then
echo -e "${op}[$(stamp)] Stopping ${2}-mailcow container...${normal}" \ echo -e "${op}${stamp} Stopping ${2}-mailcow container...${normal}" \
>> "$logFile" >> "$logFile"
docker-compose stop --timeout ${dockerStopTimeout} ${2}-mailcow \ docker-compose stop --timeout ${dockerStopTimeout} ${2}-mailcow \
2>> "$logFile" 2>> "$logFile"
@ -240,7 +237,7 @@ if [ "$1" = "stop" ]; then
dockerResultExit=$(docker inspect -f '{{ .State.ExitCode }}' \ dockerResultExit=$(docker inspect -f '{{ .State.ExitCode }}' \
${COMPOSE_PROJECT_NAME}_${2}-mailcow_1) ${COMPOSE_PROJECT_NAME}_${2}-mailcow_1)
elif [ "$1" = "start" ]; then elif [ "$1" = "start" ]; then
echo -e "${op}[$(stamp)] Starting ${2}-mailcow container...${normal}" \ echo -e "${op}${stamp} Starting ${2}-mailcow container...${normal}" \
>> "$logFile" >> "$logFile"
docker-compose start ${2}-mailcow 2>> "$logFile" docker-compose start ${2}-mailcow 2>> "$logFile"
# verify # verify
@ -445,11 +442,11 @@ fi
### Log start of script operations ### Log start of script operations
echo -e "${note}[$(stamp)] --- Start $scriptName execution ---${normal}" \ echo -e "${note}${stamp} --- Start $scriptName execution ---${normal}" \
>> "$logFile" >> "$logFile"
echo -e "${info}[$(stamp)] -- [INFO] using ${lit}${mailcowConfigFilePath}" \ echo -e "${info}${stamp} -- [INFO] using ${lit}${mailcowConfigFilePath}" \
>> "$logFile" >> "$logFile"
echo -e "${info}[$(stamp)] -- [INFO] using ${lit}${dockerComposeFilePath}" \ echo -e "${info}${stamp} -- [INFO] using ${lit}${dockerComposeFilePath}" \
>> "$logFile" >> "$logFile"
### Import additional variables from mailcow configuration file ### Import additional variables from mailcow configuration file
@ -475,7 +472,7 @@ dockerVolumeCrypt=$(docker volume inspect -f '{{ .Mountpoint }}' ${COMPOSE_PROJE
### Create sqlDump temporary directory and sqlDumpFile name ### Create sqlDump temporary directory and sqlDumpFile name
sqlDumpDir=$( mktemp -d ) sqlDumpDir=$( mktemp -d )
sqlDumpFile="backup-`date +%Y%m%d_%H%M%S`.sql" sqlDumpFile="backup-`date +%Y%m%d_%H%M%S`.sql"
echo -e "${info}[$(stamp)] -- [INFO] mySQL dump file will be stored" \ echo -e "${info}${stamp} -- [INFO] mySQL dump file will be stored" \
"at: ${lit}${sqlDumpDir}/${sqlDumpFile}${normal}" >> "$logFile" "at: ${lit}${sqlDumpDir}/${sqlDumpFile}${normal}" >> "$logFile"
@ -488,9 +485,9 @@ echo -e "${info}[$(stamp)] -- [INFO] mySQL dump file will be stored" \
## Check if webroot has been specified, if not, skip this entire section since there is nowhere to copy the 503 file. ## Check if webroot has been specified, if not, skip this entire section since there is nowhere to copy the 503 file.
if [ -z "$webroot" ]; then if [ -z "$webroot" ]; then
# no webroot path provided # no webroot path provided
echo -e "${info}[$(stamp)] -- [INFO] ${warn503} --${normal}" \ echo -e "${info}${stamp} -- [INFO] ${warn503} --${normal}" \
>> "$logFile" >> "$logFile"
exitWarn+=("[$(stamp)]_5031") exitWarn+=("${stamp}_5031")
clean503=0 clean503=0
else else
# verify webroot actually exists # verify webroot actually exists
@ -498,41 +495,41 @@ else
checkResult="$?" checkResult="$?"
if [ "$checkResult" = "1" ]; then if [ "$checkResult" = "1" ]; then
# webroot directory specified could not be found # webroot directory specified could not be found
echo -e "${info}[$(stamp)] -- [INFO] ${warn503} --${normal}" \ echo -e "${info}${stamp} -- [INFO] ${warn503} --${normal}" \
>> "$logFile" >> "$logFile"
exitWarn+=("[$(stamp)]_5032") exitWarn+=("${stamp}_5032")
clean503=0 clean503=0
else else
# webroot exists # webroot exists
echo -e "${op}[$(stamp)] Using webroot: ${lit}${webroot}${normal}" \ echo -e "${op}${stamp} Using webroot: ${lit}${webroot}${normal}" \
>> "$logFile" >> "$logFile"
# Verify 503 file existance at given path # Verify 503 file existance at given path
checkExist ff "$err503Path" checkExist ff "$err503Path"
checkResult="$?" checkResult="$?"
if [ "$checkResult" = "1" ]; then if [ "$checkResult" = "1" ]; then
# 503 file could not be found # 503 file could not be found
echo -e "${info}[$(stamp)] -- [INFO] ${warn503} --${normal}" \ echo -e "${info}${stamp} -- [INFO] ${warn503} --${normal}" \
>> "$logFile" >> "$logFile"
exitWarn+=("[$(stamp)]_5033") exitWarn+=("${stamp}_5033")
clean503=0 clean503=0
else else
# 503 file exists and webroot is valid. Let's copy it! # 503 file exists and webroot is valid. Let's copy it!
echo -e "${op}[$(stamp)] ${err503File} found at ${lit}${err503Path}" \ echo -e "${op}${stamp} ${err503File} found at ${lit}${err503Path}" \
"${normal}" >> "$logFile" "${normal}" >> "$logFile"
echo -e "${op}[$(stamp)] Copying 503 error page to webroot..." \ echo -e "${op}${stamp} Copying 503 error page to webroot..." \
"${normal}" >> "$logFile" "${normal}" >> "$logFile"
cp "${err503Path}" "$webroot/" >> "$logFile" 2>&1 cp "${err503Path}" "$webroot/" >> "$logFile" 2>&1
copyResult="$?" copyResult="$?"
# verify copy was successful # verify copy was successful
if [ "$copyResult" = "1" ]; then if [ "$copyResult" = "1" ]; then
# copy was unsuccessful # copy was unsuccessful
echo -e "${info}[$(stamp)] -- [INFO] ${warn503} --${normal}" \ echo -e "${info}${stamp} -- [INFO] ${warn503} --${normal}" \
>> "$logFile" >> "$logFile"
exitWarn+=("[$(stamp)]_5035") exitWarn+=("${stamp}_5035")
clean503=0 clean503=0
else else
# copy was successful # copy was successful
echo -e "${info}[$(stamp)] -- [INFO] 503 error page" \ echo -e "${info}${stamp} -- [INFO] 503 error page" \
"successfully copied to webroot --${normal}" >> "$logFile" "successfully copied to webroot --${normal}" >> "$logFile"
clean503=1 clean503=1
fi fi
@ -552,10 +549,10 @@ cd "$mailcowPath"
operateDocker stop postfix operateDocker stop postfix
# process result # process result
if [ "$dockerResultState" = "false" ] && [ "$dockerResultExit" -eq 0 ]; then if [ "$dockerResultState" = "false" ] && [ "$dockerResultExit" -eq 0 ]; then
echo -e "${info}[$(stamp)] -- [INFO] Postfix container stopped --${normal}" \ echo -e "${info}${stamp} -- [INFO] Postfix container stopped --${normal}" \
>> "$logFile" >> "$logFile"
else else
exitError+=("[$(stamp)]_101") exitError+=("${stamp}_101")
cleanup cleanup
quit quit
fi fi
@ -563,77 +560,77 @@ fi
operateDocker stop dovecot operateDocker stop dovecot
# process result # process result
if [ "$dockerResultState" = "false" ] && [ "$dockerResultExit" -eq 0 ]; then if [ "$dockerResultState" = "false" ] && [ "$dockerResultExit" -eq 0 ]; then
echo -e "${info}[$(stamp)] -- [INFO] Dovecot container stopped --${normal}" \ echo -e "${info}${stamp} -- [INFO] Dovecot container stopped --${normal}" \
>> "$logFile" >> "$logFile"
else else
exitError+=("[$(stamp)]_102") exitError+=("${stamp}_102")
cleanup cleanup
quit quit
fi fi
### Dump SQL ### Dump SQL
echo -e "${op}[$(stamp)] Dumping mailcow SQL database...${normal}" >> "$logFile" echo -e "${op}${stamp} Dumping mailcow SQL database...${normal}" >> "$logFile"
docker-compose exec -T mysql-mailcow mysqldump --default-character-set=utf8mb4 \ docker-compose exec -T mysql-mailcow mysqldump --default-character-set=utf8mb4 \
-u${DBUSER} -p${DBPASS} ${DBNAME} > "$sqlDumpDir/$sqlDumpFile" \ -u${DBUSER} -p${DBPASS} ${DBNAME} > "$sqlDumpDir/$sqlDumpFile" \
2>> "$logFile" 2>> "$logFile"
dumpResult=$(docker-compose exec -T mysql-mailcow echo "$?") dumpResult=$(docker-compose exec -T mysql-mailcow echo "$?")
## very mysqldump completed successfully ## very mysqldump completed successfully
if [ "$dumpResult" = "0" ]; then if [ "$dumpResult" = "0" ]; then
echo -e "${info}[$(stamp)] -- [INFO] mySQLdump completed successfully --" \ echo -e "${info}${stamp} -- [INFO] mySQLdump completed successfully --" \
"${normal}" >> "$logFile" "${normal}" >> "$logFile"
else else
exitError+=("[$(stamp)]_201") exitError+=("${stamp}_201")
fi fi
## verify the dump file was actually written to disk ## verify the dump file was actually written to disk
checkExist fs "$sqlDumpDir/$sqlDumpFile" checkExist fs "$sqlDumpDir/$sqlDumpFile"
checkResult="$?" checkResult="$?"
if [ "$checkResult" = "0" ]; then if [ "$checkResult" = "0" ]; then
echo -e "${ok}[$(stamp)] -- [SUCCESS] SQL successfully dumped --" \ echo -e "${ok}${stamp} -- [SUCCESS] SQL successfully dumped --" \
"${normal}" >> "$logFile" "${normal}" >> "$logFile"
else else
exitError+=("[$(stamp)]_201") exitError+=("${stamp}_201")
fi fi
### Save redis state ### Save redis state
## Delete any existing redis dump file otherwise our file check will be useless ## Delete any existing redis dump file otherwise our file check will be useless
echo -e "${op}[$(stamp)] Cleaning up old redis state backup...${normal}" \ echo -e "${op}${stamp} Cleaning up old redis state backup...${normal}" \
>> "$logFile" >> "$logFile"
checkExist ff "$dockerVolumeRedis/dump.rdb" checkExist ff "$dockerVolumeRedis/dump.rdb"
checkResult="$?" checkResult="$?"
if [ "$checkResult" = "0" ]; then if [ "$checkResult" = "0" ]; then
echo -e "${lit}[$(stamp)] Old redis backup found. ${op}Deleting..." \ echo -e "${lit}${stamp} Old redis backup found. ${op}Deleting..." \
"${normal}" >> "$logFile" "${normal}" >> "$logFile"
rm -f "$dockerVolumeRedis/dump.rdb" 2>> "$logFile" rm -f "$dockerVolumeRedis/dump.rdb" 2>> "$logFile"
echo -e "${op}[$(stamp)] ...done${normal}" >> "$logFile" echo -e "${op}${stamp} ...done${normal}" >> "$logFile"
else else
echo -e "${op}[$(stamp)] No old redis backup found${normal}" \ echo -e "${op}${stamp} No old redis backup found${normal}" \
>> "$logFile" >> "$logFile"
fi fi
## Export redis ## Export redis
echo -e "${op}[$(stamp)] Saving redis state information...${normal}" >> "$logFile" echo -e "${op}${stamp} Saving redis state information...${normal}" >> "$logFile"
docker-compose exec -T redis-mailcow redis-cli save >> "$logFile" 2>&1 docker-compose exec -T redis-mailcow redis-cli save >> "$logFile" 2>&1
saveResult=$(docker-compose exec -T redis-mailcow echo "$?") saveResult=$(docker-compose exec -T redis-mailcow echo "$?")
# verify save operation completed successfully # verify save operation completed successfully
if [ "$saveResult" = "0" ]; then if [ "$saveResult" = "0" ]; then
echo -e "${info}[$(stamp)] -- [INFO] redis save-state successful --" \ echo -e "${info}${stamp} -- [INFO] redis save-state successful --" \
"${normal}" >> "$logFile" "${normal}" >> "$logFile"
else else
exitError+=("[$(stamp)]_202") exitError+=("${stamp}_202")
fi fi
## verify save-file written to disk ## verify save-file written to disk
checkExist fs "$dockerVolumeRedis/dump.rdb" checkExist fs "$dockerVolumeRedis/dump.rdb"
checkResult="$?" checkResult="$?"
if [ "$checkResult" = "0" ]; then if [ "$checkResult" = "0" ]; then
echo -e "${ok}[$(stamp)] -- [SUCCESS] redis state saved --${normal}" \ echo -e "${ok}${stamp} -- [SUCCESS] redis state saved --${normal}" \
>> "$logFile" >> "$logFile"
else else
exitError+=("[$(stamp)]_202") exitError+=("${stamp}_202")
fi fi
### Call borgbackup to copy actual files ### Call borgbackup to copy actual files
echo -e "${op}[$(stamp)] Pre-backup tasks completed, calling borgbackup..." \ echo -e "${op}${stamp} Pre-backup tasks completed, calling borgbackup..." \
"${normal}" >> "$logFile" "${normal}" >> "$logFile"
## Get borgbackup settings and repo details ## Get borgbackup settings and repo details
@ -642,10 +639,10 @@ mapfile -t borgConfig < "$borgDetails"
## check if any required borg configuration variables in defintion file are ## check if any required borg configuration variables in defintion file are
## empty and exit with error, otherwise, map array items to variables ## empty and exit with error, otherwise, map array items to variables
# check: borg base directory # check: borg base directory
echo -e "${op}[$(stamp)] Verifying supplied borg configuration variables..." \ echo -e "${op}${stamp} Verifying supplied borg configuration variables..." \
"${normal}" >> "$logFile" "${normal}" >> "$logFile"
if [ -z "${borgConfig[0]}" ]; then if [ -z "${borgConfig[0]}" ]; then
exitError+=("[$(stamp)]_210") exitError+=("${stamp}_210")
cleanup cleanup
quit quit
else else
@ -654,16 +651,16 @@ else
checkResult="$?" checkResult="$?"
if [ "$checkResult" = "1" ]; then if [ "$checkResult" = "1" ]; then
# borg base directory specified could not be found # borg base directory specified could not be found
exitError+=("[$(stamp)]_210") exitError+=("${stamp}_210")
cleanup cleanup
quit quit
fi fi
echo -e "${op}[$(stamp)] Borg base dir... OK${normal}" >> "$logFile" echo -e "${op}${stamp} Borg base dir... OK${normal}" >> "$logFile"
export BORG_BASE_DIR="${borgConfig[0]%/}" export BORG_BASE_DIR="${borgConfig[0]%/}"
fi fi
# check: path to SSH keyfile # check: path to SSH keyfile
if [ -z "${borgConfig[1]}" ]; then if [ -z "${borgConfig[1]}" ]; then
exitError+=("[$(stamp)]_211") exitError+=("${stamp}_211")
cleanup cleanup
quit quit
else else
@ -671,28 +668,28 @@ else
checkResult="$?" checkResult="$?"
if [ "$checkResult" = 1 ]; then if [ "$checkResult" = 1 ]; then
# SSH keyfile specified could not be found # SSH keyfile specified could not be found
exitError+=("[$(stamp)]_211") exitError+=("${stamp}_211")
cleanup cleanup
quit quit
fi fi
echo -e "${op}[$(stamp)] Borg SSH key... OK${normal}" >> "$logFile" echo -e "${op}${stamp} Borg SSH key... OK${normal}" >> "$logFile"
export BORG_RSH="ssh -i ${borgConfig[1]}" export BORG_RSH="ssh -i ${borgConfig[1]}"
fi fi
# check: name of borg repo # check: name of borg repo
if [ -z "${borgConfig[2]}" ]; then if [ -z "${borgConfig[2]}" ]; then
exitError+=("[$(stamp)]_212") exitError+=("${stamp}_212")
cleanup cleanup
quit quit
else else
echo -e "${op}[$(stamp)] Borg REPO name... OK${normal}" >> "$logFile" echo -e "${op}${stamp} Borg REPO name... OK${normal}" >> "$logFile"
export BORG_REPO="${borgConfig[2]}" export BORG_REPO="${borgConfig[2]}"
fi fi
# repo password # repo password
if [ -n "${borgConfig[3]}" ]; then if [ -n "${borgConfig[3]}" ]; then
echo -e "${op}[$(stamp)] Borg SSH/REPO password... OK${normal}" >> "$logFile" echo -e "${op}${stamp} Borg SSH/REPO password... OK${normal}" >> "$logFile"
export BORG_PASSPHRASE="${borgConfig[3]}" export BORG_PASSPHRASE="${borgConfig[3]}"
else else
exitWarn+=("[$(stamp)]_2111") exitWarn+=("${stamp}_2111")
# if the password was omitted by mistake, export a dummy password so borg # if the password was omitted by mistake, export a dummy password so borg
# fails with an error instead of sitting and waiting for input # fails with an error instead of sitting and waiting for input
export BORG_PASSPHRASE="DummyPasswordSoBorgFails" export BORG_PASSPHRASE="DummyPasswordSoBorgFails"
@ -705,32 +702,32 @@ borgExclude="${borgConfig[5]}"
borgPrune="${borgConfig[6]}" borgPrune="${borgConfig[6]}"
# export: borg remote path (if not blank) # export: borg remote path (if not blank)
if [ -n "${borgConfig[7]}" ]; then if [ -n "${borgConfig[7]}" ]; then
echo -e "${op}[$(stamp)] Borg REMOTE path... OK${normal}" >> "$logFile" echo -e "${op}${stamp} Borg REMOTE path... OK${normal}" >> "$logFile"
export BORG_REMOTE_PATH="${borgConfig[7]}" export BORG_REMOTE_PATH="${borgConfig[7]}"
else else
exitWarn+=("[$(stamp)]_2112") exitWarn+=("${stamp}_2112")
fi fi
## If borgXtra exists, map contents to an array variable ## If borgXtra exists, map contents to an array variable
if [ -n "$borgXtra" ]; then if [ -n "$borgXtra" ]; then
echo -e "${op}[$(stamp)] Processing referenced extra files list for" \ echo -e "${op}${stamp} Processing referenced extra files list for" \
"borgbackup to include in backup${normal}" >> "$logFile" "borgbackup to include in backup${normal}" >> "$logFile"
checkExist ff "$borgXtra" checkExist ff "$borgXtra"
checkResult="$?" checkResult="$?"
if [ "$checkResult" = "0" ]; then if [ "$checkResult" = "0" ]; then
echo -e "${op}[$(stamp)] Found ${lit}${borgXtra}${normal}" >> "$logFile" echo -e "${op}${stamp} Found ${lit}${borgXtra}${normal}" >> "$logFile"
mapfile -t xtraFiles < "$borgXtra" mapfile -t xtraFiles < "$borgXtra"
echo -e "${op}[$(stamp)] Processed extra files list for inclusion in" \ echo -e "${op}${stamp} Processed extra files list for inclusion in" \
"borgbackup${normal}" >> "$logFile" "borgbackup${normal}" >> "$logFile"
else else
exitWarn+=("[$(stamp)]_2113") exitWarn+=("${stamp}_2113")
fi fi
else else
# no extra locations specified # no extra locations specified
echo -e "${op}[$(stamp)] No additional locations specified for backup." \ echo -e "${op}${stamp} No additional locations specified for backup." \
"Only Mailcow data and config files will be backed up.${normal}" \ "Only Mailcow data and config files will be backed up.${normal}" \
>> "$logFile" >> "$logFile"
exitWarn+=("[$(stamp)]_2116") exitWarn+=("${stamp}_2116")
fi fi
## Check if borgExclude exists since borg will throw an error if it's missing ## Check if borgExclude exists since borg will throw an error if it's missing
@ -738,16 +735,16 @@ if [ -n "$borgExclude" ]; then
checkExist ff "$borgExclude" checkExist ff "$borgExclude"
checkResult="$?" checkResult="$?"
if [ "$checkResult" = "0" ]; then if [ "$checkResult" = "0" ]; then
echo -e "${op}[$(stamp)] Found ${lit}${borgExclude}${normal}" \ echo -e "${op}${stamp} Found ${lit}${borgExclude}${normal}" \
>> "$logFile" >> "$logFile"
else else
# file not found, unset the variable so it's like it was not specified # file not found, unset the variable so it's like it was not specified
# in the first place and continue with backup # in the first place and continue with backup
unset borgExclude unset borgExclude
exitWarn+=("[$(stamp)]_2114") exitWarn+=("${stamp}_2114")
fi fi
else else
echo -e "${op}[$(stamp)] Exclusion pattern file not specified." \ echo -e "${op}${stamp} Exclusion pattern file not specified." \
"No exclusions will be processed${normal}" >> "$logFile" "No exclusions will be processed${normal}" >> "$logFile"
fi fi
@ -758,13 +755,13 @@ fi
## the 'noexec' option for security. Thus, we will use/create a 'tmp' folder ## the 'noexec' option for security. Thus, we will use/create a 'tmp' folder
## within the BORG_BASE_DIR and instruct python to use that instead of /tmp ## within the BORG_BASE_DIR and instruct python to use that instead of /tmp
# check if BORG_BASE_DIR/tmp exists, if not, create it # check if BORG_BASE_DIR/tmp exists, if not, create it
echo -e "${op}[$(stamp)] Checking for tmp directory at ${lit}${BORG_BASE_DIR}" \ echo -e "${op}${stamp} Checking for tmp directory at ${lit}${BORG_BASE_DIR}" \
"${normal}" >> "$logFile" "${normal}" >> "$logFile"
checkExist fd "$BORG_BASE_DIR/tmp" checkExist fd "$BORG_BASE_DIR/tmp"
checkResult="$?" checkResult="$?"
if [ "$checkResult" = "1" ]; then if [ "$checkResult" = "1" ]; then
# folder not found # folder not found
echo -e "${op}[$(stamp)] tmp folder not found... creating${lit}" \ echo -e "${op}${stamp} tmp folder not found... creating${lit}" \
"${BORG_BASE_DIR}/tmp${normal}" >> "$logFile" "${BORG_BASE_DIR}/tmp${normal}" >> "$logFile"
mkdir "$BORG_BASE_DIR/tmp" 2>> "$logFile" mkdir "$BORG_BASE_DIR/tmp" 2>> "$logFile"
# verify folder created # verify folder created
@ -772,17 +769,17 @@ if [ "$checkResult" = "1" ]; then
checkResult="$?" checkResult="$?"
if [ "$checkResult" = "0" ]; then if [ "$checkResult" = "0" ]; then
# folder exists # folder exists
echo -e "${op}[$(stamp)] tmp folder created within borg base directory" \ echo -e "${op}${stamp} tmp folder created within borg base directory" \
"${normal}" >> "$logFile" "${normal}" >> "$logFile"
else else
# problem creating folder and script will exit # problem creating folder and script will exit
exitError+=("[$(stamp)]_215") exitError+=("${stamp}_215")
cleanup cleanup
quit quit
fi fi
else else
# folder found # folder found
echo -e "${op}[$(stamp)] tmp folder found within borg base directory" \ echo -e "${op}${stamp} tmp folder found within borg base directory" \
"${normal}" >> "$logFile" "${normal}" >> "$logFile"
fi fi
# export TMPDIR environment variable # export TMPDIR environment variable
@ -793,7 +790,7 @@ export TMPDIR="${BORG_BASE_DIR}/tmp"
# commandline depends on whether borgExclude is empty or not # commandline depends on whether borgExclude is empty or not
if [ -z "$borgExclude" ]; then if [ -z "$borgExclude" ]; then
# borgExclude is empty # borgExclude is empty
echo -e "${bold}${op}[$(stamp)] Executing borg without exclusions${normal}" \ echo -e "${bold}${op}${stamp} Executing borg without exclusions${normal}" \
>> "$logFile" >> "$logFile"
borg --show-rc create ${borgCreateParams} ::`date +%Y-%m-%d_%H%M%S` \ borg --show-rc create ${borgCreateParams} ::`date +%Y-%m-%d_%H%M%S` \
${xtraFiles[@]} \ ${xtraFiles[@]} \
@ -803,7 +800,7 @@ if [ -z "$borgExclude" ]; then
2>> "$logFile" 2>> "$logFile"
else else
# borgExclude is not empty # borgExclude is not empty
echo -e "${bold}${op}[$(stamp)] Executing borg with exclusions${normal}" \ echo -e "${bold}${op}${stamp} Executing borg with exclusions${normal}" \
>> "$logFile" >> "$logFile"
borg --show-rc create ${borgCreateParams} --exclude-from ${borgExclude} \ borg --show-rc create ${borgCreateParams} --exclude-from ${borgExclude} \
::`date +%Y-%m-%d_%H%M%S` \ ::`date +%Y-%m-%d_%H%M%S` \
@ -817,54 +814,54 @@ fi
## Check status of borg operation ## Check status of borg operation
borgResult="$?" borgResult="$?"
if [ "$borgResult" -eq 0 ]; then if [ "$borgResult" -eq 0 ]; then
echo -e "${ok}[$(stamp)] -- [SUCCESS] Borg backup completed successfully --" \ echo -e "${ok}${stamp} -- [SUCCESS] Borg backup completed successfully --" \
"${normal}" >> "$logFile" "${normal}" >> "$logFile"
elif [ "$borgResult" -eq 1 ]; then elif [ "$borgResult" -eq 1 ]; then
exitWarn+=("[$(stamp)]_2200") exitWarn+=("${stamp}_2200")
elif [ "$borgResult" -ge 2 ]; then elif [ "$borgResult" -ge 2 ]; then
exitError+=("[$(stamp)]_220") exitError+=("${stamp}_220")
cleanup cleanup
quit quit
else else
exitWarn+=("[$(stamp)]_2201") exitWarn+=("${stamp}_2201")
fi fi
## Generate and execute borg prune ## Generate and execute borg prune
# command depends on whether or not parameters have been defined # command depends on whether or not parameters have been defined
if [ -n "$borgPrune" ]; then if [ -n "$borgPrune" ]; then
# parameters defined # parameters defined
echo -e "${bold}${op}[$(stamp)] Executing borg prune operation${normal}" \ echo -e "${bold}${op}${stamp} Executing borg prune operation${normal}" \
>> "$logFile" >> "$logFile"
borg prune --show-rc -v ${borgPruneParams} ${borgPrune} \ borg prune --show-rc -v ${borgPruneParams} ${borgPrune} \
2>> "$logFile" 2>> "$logFile"
# check return-status # check return-status
pruneResult="$?" pruneResult="$?"
if [ "$pruneResult" -eq 0 ]; then if [ "$pruneResult" -eq 0 ]; then
echo -e "${ok}[$(stamp)] -- [SUCCESS] Borg prune completed successfully" \ echo -e "${ok}${stamp} -- [SUCCESS] Borg prune completed successfully" \
"--${normal}" >> "$logFile" "--${normal}" >> "$logFile"
elif [ "$pruneResult" -eq 1 ]; then elif [ "$pruneResult" -eq 1 ]; then
exitWarn+=("[$(stamp)]_2210") exitWarn+=("${stamp}_2210")
elif [ "$pruneResult" -ge 2 ]; then elif [ "$pruneResult" -ge 2 ]; then
exitError+=("[$(stamp)]_221") exitError+=("${stamp}_221")
else else
exitWarn+=("[$(stamp)]_2212") exitWarn+=("${stamp}_2212")
fi fi
else else
# parameters not defined... skip pruning # parameters not defined... skip pruning
exitWarn+=("[$(stamp)]_2115") exitWarn+=("${stamp}_2115")
fi fi
### borgbackup completed ### borgbackup completed
echo -e "${op}[$(stamp)] Borgbackup completed... begin cleanup" \ echo -e "${op}${stamp} Borgbackup completed... begin cleanup" \
"${normal}" >> "$logFile" "${normal}" >> "$logFile"
### Exit script ### Exit script
echo -e "${bold}${op}[$(stamp)] ***Normal exit process***${normal}" \ echo -e "${bold}${op}${stamp} ***Normal exit process***${normal}" \
>> "$logFile" >> "$logFile"
cleanup cleanup
echo -e "${bold}${ok}[$(stamp)] -- [SUCCESS] All processes completed" \ echo -e "${bold}${ok}${stamp} -- [SUCCESS] All processes completed" \
"successfully --${normal}" >> "$logFile" "successfully --${normal}" >> "$logFile"
quit quit