NextCloudBackup/backup.sh

251 lines
7.7 KiB
Bash
Raw Normal View History

2018-09-19 15:12:56 -06:00
#!/bin/bash
2018-09-19 15:31:07 -06:00
### Text formatting presets
normal="\e[0m"
bold="\e[1m"
default="\e[39m"
red="\e[31m"
green="\e[32m"
yellow="\e[33m"
magenta="\e[35m"
cyan="\e[36m"
stamp="[`date +%Y-%m-%d` `date +%H:%M:%S`]"
2018-09-19 15:12:56 -06:00
### Functions ###
### scriptHelp -- display usage information for this script
function scriptHelp {
echo "In the future, I will be something helpful!"
# exit with code 1 -- there is no use logging this
exit 1
2018-09-19 15:12:56 -06:00
}
2018-09-19 15:36:57 -06:00
### quit -- exit the script after logging any errors, warnings, etc. and
### cleaning up as necessary
function quit {
if [ -z "$1" ]; then
# exit cleanly
echo -e "${bold}${green}${stamp} -- [SUCCESS] Script completed" \
2018-09-19 15:50:50 -06:00
"--$normal" >> "$logFile"
2018-09-19 15:36:57 -06:00
exit 0
else
# log error code and exit with said code
echo -e "${bold}${red}${stamp} -- [ERROR] Script exited with code $1" \
2018-09-19 15:50:50 -06:00
" --$normal" >> "$logFile"
echo -e "${red}${errorExplain[$1]}$normal" >> "$logFile"
2018-09-19 15:36:57 -06:00
exit "$1"
fi
}
function checkExist {
if [ "$1" = "ff" ]; then
# find file
if [ -e "$2" ]; then
# found
echo -e "${normal}${stamp} File found:" \
"${bold}${yellow}${2}${normal}" >> "$logFileVerbose"
return 0
else
# not found
echo -e "${red}${stamp} File NOT found:"\
"${bold}${yellow}${2}${normal}" >> "$logFileVerbose"
return 1
fi
elif [ "$1" = "fd" ]; then
# find directory
if [ -d "$2" ]; then
# found
echo -e "${normal}${stamp} Dir found:" \
"${bold}${yellow}${2}${normal}" >> "$logFileVerbose"
return 0
else
# not found
echo -e "${red}${stamp} Dir NOT found:" \
"${bold}${yellow}${2}${normal}" >> "$logFileVerbose"
return 1
fi
fi
}
2018-09-19 15:12:56 -06:00
### End of Functions ###
### Default parameters
# store the logfile in the same directory as this script using the script's name
# with the extension .log
scriptPath="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
scriptName="$( basename ${0} )"
logFile="$scriptPath/${scriptName%.*}.log"
2018-09-19 15:45:59 -06:00
# set script parameters to null and initialize array variables
unset PARAMS
2018-09-19 16:30:18 -06:00
unset logLevel
unset logFileNormal
unset logFileVerbose
unset borgCreateParams
unset borgPruneParams
2018-09-19 17:01:02 -06:00
unset sqlDumpDir
2018-09-19 21:53:34 -06:00
unset 503Location
2018-09-19 22:14:19 -06:00
unset webroot
2018-09-19 15:45:59 -06:00
errorExplain=()
exitWarn=()
2018-09-19 15:45:59 -06:00
2018-09-19 15:12:56 -06:00
2018-09-19 15:51:38 -06:00
### Error codes
errorExplain[2]="This script MUST be run as ROOT."
2018-09-19 15:51:38 -06:00
2018-09-19 15:12:56 -06:00
### Process script parameters
# if no parameters provided, then show the help page and exit with error
if [ -z $1 ]; then
# show script help page
scriptHelp
2018-09-19 15:12:56 -06:00
fi
# use GetOpts to process parameters
2018-09-19 22:14:19 -06:00
while getopts ':l:nv5:w:' PARAMS; do
2018-09-19 15:12:56 -06:00
case "$PARAMS" in
l)
# use provided location for logFile
logFile="${OPTARG}"
;;
2018-09-19 16:30:18 -06:00
n)
# standard logging (script errors, Borg summary)
logLevel="normal"
;;
v)
# verbose logging (script errors, Borg details)
logLevel="verbose"
;;
2018-09-19 21:53:34 -06:00
5)
# 503 error page location
503Location="${OPTARG}"
;;
2018-09-19 22:14:19 -06:00
w)
# path to webroot for NextCloud installation
webroot="${OPTARG}"
;;
2018-09-19 15:41:44 -06:00
?)
# unrecognized parameters trigger scriptHelp
scriptHelp
2018-09-19 15:41:44 -06:00
;;
2018-09-19 15:12:56 -06:00
esac
done
### Verify script running as root, otherwise exit
if [ $(id -u) -ne 0 ]; then
quit 2
fi
2018-09-19 16:30:18 -06:00
### Set logging verbosity based on invocation parameters
if [ "$logLevel" = "normal" ]; then
borgCreateParams='--stats'
borgPruneParams="--list"
logFileVerbose="/dev/null"
2018-09-19 16:30:18 -06:00
logFileNormal="$logFile"
elif [ "$logLevel" = "verbose" ]; then
borgCreateParams='--list --stats'
borgPruneParams='--list'
logFileVerbose="$logFile"
logFileNormal="/dev/null"
2018-09-19 16:30:18 -06:00
fi
2018-09-19 16:00:38 -06:00
### Log start of script operations
echo -e "${bold}${stamp}-- Start $scriptName execution ---" >> "$logFile"
2018-09-19 16:31:52 -06:00
### Export logFile variable for use by Borg
export logFile="$logFile"
2018-09-19 17:08:52 -06:00
### Create sqlDump temporary directory and sqlDumpFile name
2018-09-19 17:01:02 -06:00
sqlDumpDir=$( mktemp -d )
echo -e "${cyan}${stamp} Created temp dir for SQLdump: $sqlDumpDir" \
>> "$logFileVerbose"
2018-09-19 17:08:52 -06:00
sqlDumpFile="backup-`date +%Y%m%d_%H%M%S`.sql"
echo -e "${normal}${stamp} mySQL dump file will be stored at:" \
"${bold}${yellow}${sqlDumpDir}/${sqlDumpFile}${normal}" \
2018-09-19 22:13:19 -06:00
| tee -a "$logFileNormal" "$logFileVerbose" > /dev/null
2018-09-19 16:00:38 -06:00
2018-09-19 15:12:56 -06:00
2018-09-19 21:53:34 -06:00
### 503 error page
# Verify 503 existance
if [ -z "$503Location" ]; then
# no 503 file has been provided
echo -e "${bold}${yellow}${stamp} -- [WARNING] No 503 error page file" \
"specified --${normal}" >> "$logFile"
echo -e "${bold}${yellow} Web users will NOT be informed the server" \
2018-09-19 22:13:19 -06:00
"is down.${normal}" | tee -a "$logFileNormal" "$logFileVerbose" \
> /dev/null
2018-09-19 21:53:34 -06:00
exitWarn+=('5031')
else
checkExist "$503Location"
checkResult="$?"
if [ "$checkResult" = "1" ]; then
# 503 file specified could not be found
echo -e "${bold}${yellow}${stamp} -- [WARNING] 503 error page file" \
"specified could not be found --${normal}" >> "$logFile"
echo -e "${bold}${yellow} Web users will NOT be informed the server" \
2018-09-19 22:13:19 -06:00
"is down.${normal}" | tee -a "$logFileNormal" "$logFileVerbose" \
> /dev/null
2018-09-19 21:53:34 -06:00
exitWarn+=('5032')
else
2018-09-19 22:13:19 -06:00
# 503 file found, copy it to the webroot after verifying it exists
if [ -z "$webroot" ]; then
# no webroot path provided
echo -e "${bold}${yellow}${stamp} -- [WARNING] No webroot path" \
"specified --${normal}" >> "$logFile"
echo -e "${bold}${yellow} Web users will NOT be informed the" \
"server is down.${normal}" | tee -a "$logFileNormal" \
"$logFileVerbose" > /dev/null
exitWarn+=('5033')
else
checkExist "$webroot"
checkResult="$?"
if [ "$checkResult" = "1" ]; then
# webroot directory specified could not be found
echo -e "${bold}${yellow}${stamp} -- [WARNING] webroot path" \
"specified could not be found --${normal}" >> "$logFile"
echo -e "${bold}${yellow} Web users will NOT be informed the" \
"server is down.${normal}" | tee -a "$logFileNormal" \
"$logFileVerbose" > /dev/null
exitWarn+=('5034')
else
# webroot exists and 503 exists, copy 503 to webroot
echo -e "${bold}${cyan}${stamp} Copying 503 error page to" \
"webroot..." >> "$logFileVerbose"
cp "$503Location" "$webroot/" 2>&1 >> "$logFileVerbose"
copyResult=$( echo "$?" )
# verify copy was successful
if [ "$copyResult" = "1" ]; then
echo -e "${bold}${yellow}${stamp} -- [WARNING]" \
"Error copying 503 error page file to webroot" \
"--${normal}" >> "$logFile"
echo -e "${bold}${yellow} Web users will NOT be" \
"informed the server is down.${normal}" | tee -a \
"$logFileNormal" "$logFileVerbose" > /dev/null
exitWarn+=('5035')
else
# copy was successful
echo -e "${bold}${cyan}${stamp} ...done" \
>> "$logFileVerbose"
fi
fi
fi
fi
fi
2018-09-19 21:53:34 -06:00
2018-09-19 15:12:56 -06:00
# This code should not be executed since the 'quit' function should terminate
# this script. Therefore, exit with code 99 if we get to this point.
exit 99