#!/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 } exitError () { printf "${err}[%s] -- [ERROR] %s: %s --${norm}\n" \ "$(stamp)" "$1" "$2" >> "$logFile" exit "$1" } # control seafile services (systemd) seafSvc () { if [ "$1" = "start" ]; then if ! systemctl start "${seafService}" >> "$logFile" 2>&1; then printf "${err}Error 100: Could not start '%s'${norm}\n" \ "${seafService}" >> "$logFile" exit 100 fi if ! systemctl start "${seafHub}" >> "$logFile" 2>&1; then printf "${err}Error 101: Could not start '%s'${norm}\n" \ "${seafHub}" >> "$logFile" exit 101 fi elif [ "$1" = "stop" ]; then if ! systemctl stop "${seafHub}" >> "$logFile" 2>&1; then printf "${err}Error 103: Could not stop '%s'${norm}\n" \ "${seafHub}" >> "$logFile" exit 103 fi if ! systemctl stop "${seafService}" >> "$logFile" 2>&1; then printf "${err}Error 102: Could not stop '%s'${norm}\n" \ "${seafService}" >> "$logFile" 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 seafService="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 if [ -f "$2" ]; then err503Path="${2%/}" err503File="${2##*/}" shift else badParam dne "$@" fi else badParam empty "$@" fi ;; -w|--webroot) # path to webroot (copy 503) if [ -n "$2" ]; then if [ -f "$2" ]; then webroot="${2%/}" shift else badParam dne "$@" fi else badParam empty "$@" fi ;; -p|--seaf|--seafdir) # path to seafile program directory if [ -n "$2" ]; then if [ -d "$2" ]; then seafDir="${2%/}" shift else badParam dne "$@" fi else badParam empty "$@" fi ;; -d|--data|--datadir|--seafdata) # path to seafile data directory if [ -n "$2" ]; then if [ -d "$2" ]; then seafData="${2%/}" shift else badParam dne "$@" fi 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 seafile service if offline backup requested if [ "$offlineBackup" -eq 1 ]; then seafSvc stop fi 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