seafileBackup/backup_new.sh

216 lines
5.4 KiB
Bash
Executable File

#!/bin/sh
#######
### Backup Seafile/Seafile Pro server on bare-metal (NOT DOCKER)
#######
### text formatting presents
norm="\e[0m"
bold="\e[1m"
err="\e[1;31m"
warn="\e[1;93m"
ok="\e[32m"
yellow="\e[93m"
cyan="\e[96m"
mag="\e[95m"
### functions
# bad parameter passed to script
badParam () {
if [ "$1" = "empty" ]; then
printf "${err}\nError: '%s' cannot have a NULL (empty) value.\n" "$2"
printf "${cyan}Please use '--help' for assistance${norm}\n\n"
exit 1
elif [ "$1" = "dne" ]; then
printf "${err}\nError: '%s %s'\n" "$2" "$3"
printf "file or directory does not exist.${norm}\n\n"
exit 1
elif [ "$1" = "user" ]; then
printf "${err}\nError: '%s %s': User does not exist!${norm}\n\n" \
"$2" "$3"
exit 1
fi
}
# control seafile services (systemd)
seafSvc () {
if [ "$1" = "start" ]; then
if ! systemctl start "${seafSvc}" >> "$logFile" 2>&1; then
echo "error starting seafile service"
exit 100
fi
if ! systemctl start "${seafHub}" >> "$logFile" 2>&1; then
echo "error starting seahub service"
exit 101
fi
elif [ "$1" = "stop" ]; then
if ! systemctl stop "${seafHub}" >> "$logFile" 2>&1; then
echo "error stopping seahub service"
exit 103
fi
if ! systemctl stop "${seafSvc}" >> "$logFile" 2>&1; then
echo "error stopping seafile service"
exit 102
fi
fi
}
# generate dynamic timestamps
stamp () {
(date +%F" "%T)
}
### end of functions
### default variable values
## script related
# store logfile in the same directory as this script file using the same file
# name as the script but with the extension '.log'
scriptPath="$( CDPATH= cd -- "$( dirname -- "$0" )" && pwd -P )"
scriptName="$( basename "$0" )"
logFile="$scriptPath/${scriptName%.*}.log"
# borg output verbosity -- normal
borgCreateParams='--stats'
borgPruneParams='--list'
configDetails="$scriptPath/seafbackup.details"
# 503 related
err503Path="$scriptPath/503_backup.html"
err503File="${err503Path##*/}"
webroot="/usr/share/nginx/html"
# seafile related
offlineBackup=0
seafSvc="seafile.service"
seafHub="seahub.service"
seafUser="seafile"
seafDir="/opt/seafile"
seafData="/var/seafile"
### process startup parameters
while [ $# -gt 0 ]; do
case "$1" in
-h|-\?|--help)
# display help
scriptHelp
exit 0
;;
-l|--log)
# set log file location
if [ -n "$2" ]; then
logFile="${2%/}"
shift
else
badParam empty "$@"
fi
;;
-v|--verbose)
# set verbose logging from borg
borgCreateParams='--list --stats'
borgPruneParams='--list'
;;
-c|--config|--details)
# location of config details file
if [ -n "$2" ]; then
if [ -f "$2" ]; then
configDetails="${2%/}"
shift
else
badParam dne "$@"
fi
else
badParam empty "$@"
fi
;;
-5|--503)
# FULL path to 503 file
if [ -n "$2" ]; then
err503Path="${2%/}"
err503File="${2##*/}"
shift
else
badParam empty "$@"
fi
;;
-w|--webroot)
# path to webroot (copy 503)
if [ -n "$2" ]; then
webroot="${2%/}"
shift
else
badParam empty "$@"
fi
;;
-p|--seaf|--seafdir)
# path to seafile program directory
if [ -n "$2" ]; then
seafDir="${2%/}"
shift
else
badParam empty "$@"
fi
;;
-d|--data|--datadir|--seafdata)
# path to seafile data directory
if [ -n "$2" ]; then
seafData="${2%/}"
shift
else
badParam empty "$@"
fi
;;
-o|--offline)
# shutdown seafile during backup
offlineBackup=1
;;
-u|--user|--seafuser)
# name of seafile system user
if [ -n "$2" ]; then
if ! id "$2" > /dev/null 2>&1; then
badParam user "$@"
else
seafUser="${2%/}"
shift
fi
else
badParam empty "$@"
fi
;;
*)
printf "${err}\nUnknown option: %s\n" "$1"
printf "${cyan}Use '--help' for valid options.{$norm}\n\n"
exit 1
;;
esac
shift
done
### start logging
printf "${mag}[%s] --- Start %s execution ---${norm}\n" \
"$(stamp)" "$scriptName" >> "$logFile"
printf "${cyan}[%s] -- [INFO] Log located at ${yellow}%s${cyan} --${norm}\n" \
"$(stamp)" "$logFile" >> "$logFile"
### stop seahub and sefile service
exit 0
### error codes
# 1: parameter error
# 2: not run as root
# 100: could not start seafile service
# 101: could not start seahub service
# 102: could not stop seafile service
# 103: could not stop seahub service