From 31422c5475cdbf660af7a4dfe936f402048e7ade Mon Sep 17 00:00:00 2001 From: Christoph Date: Thu, 26 Nov 2020 10:37:01 +0100 Subject: [PATCH] Add Script 'restore-website-from-backup.sh'. --- .gitignore | 1 + bin/restore-website-from-backup.sh | 908 +++++++++++++++++++ conf/restore-website-from-backup.conf.sample | 80 ++ 3 files changed, 989 insertions(+) create mode 100755 bin/restore-website-from-backup.sh create mode 100644 conf/restore-website-from-backup.conf.sample diff --git a/.gitignore b/.gitignore index db5b411..e281df1 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ /conf/logrotate.conf /conf/rcopy.conf /conf/manual_hosts.conf +/conf/restore-website-from-backup.conf /conf/*.key /hosts/*.sh /hosts/BAK/* diff --git a/bin/restore-website-from-backup.sh b/bin/restore-website-from-backup.sh new file mode 100755 index 0000000..11f61c5 --- /dev/null +++ b/bin/restore-website-from-backup.sh @@ -0,0 +1,908 @@ +#!/usr/bin/env bash + +script_name="$(basename $(realpath $0))" +working_dir="$(dirname $(realpath $0))" + +conf_file="$(dirname "${working_dir}")/conf/${script_name%%.*}.conf" + +log_file="$(mktemp)" + +backup_date=$(date +%Y-%m-%d-%H%M) + + +# ============= +# --- Some functions +# ============= + +usage() { + + + [[ -n "$1" ]] && error "$1" + + + [[ $terminal ]] && echo -e " +\033[1mUsage:\033[m + + $(basename $0) [OPTION [OPTION .. + +\033[1mDescription\033[m + + Script restores a website from backup system. + +\033[1mOptions\033[m + + -b + Sets batch mode to true - no interaction will be made. + + -d + Name of database concerning to the restoring website. + + -h + Prints this help. + + -s + The (backuped) server holding the production website. + + -t + The backup date. + + -w + the website + +\033[1mFiles\033[m + + Configuration file: $conf_file + +\033[1mExample:\033[m + + Restore website 'cloud-01.oopen.de' from server 'cl-01.oopen.de' at 11/24/2020 (24 November 2020). + Run in batch mode. + + \033[1m$(basename $0) -b -d cloud_01 -s cl-01.oopen.de -t 2020-11-24 -w cloud-01.oopen.de\033[m + +" + + clean_up 1 + +} + + +clean_up() { + + + if [[ -f "$_backup_crontab_file" ]]; then + + blank_line + echononl " (Re)Install Crontab from previously saved crontab file + '$_backup_crontab_file'.." + + crontab $_backup_crontab_file >> $log_file 2>&1 + + if [[ $? -eq 0 ]]; then + echo_ok + else + echo_failed + error "$(cat $log_file)" + fi + + fi + + # Perform program exit housekeeping + rm -f $log_file + blank_line + exit $1 +} + +is_number() { + + return $(test ! -z "${1##*[!0-9]*}" > /dev/null 2>&1); + + # - also possible + # - + #[[ ! -z "${1##*[!0-9]*}" ]] && return 0 || return 1 + #return $([[ ! -z "${1##*[!0-9]*}" ]]) +} + +echononl(){ + if $terminal ; then + echo X\\c > /tmp/shprompt$$ + if [ `wc -c /tmp/shprompt$$ | awk '{print $1}'` -eq 1 ]; then + echo -e -n "$*\\c" 1>&2 + else + echo -e -n "$*" 1>&2 + fi + rm /tmp/shprompt$$ + fi +} +echo_done() { + if $terminal ; then + echo -e "\033[75G[ \033[32mdone\033[m ]" + fi +} +echo_ok() { + if $terminal ; then + echo -e "\033[75G[ \033[32mok\033[m ]" + fi +} +echo_warning() { + if $terminal ; then + echo -e "\033[75G[ \033[33m\033[1mwarn\033[m ]" + fi +} +echo_failed(){ + if $terminal ; then + echo -e "\033[75G[ \033[1;31mfailed\033[m ]" + fi +} +echo_skipped() { + if $terminal ; then + echo -e "\033[75G[ \033[37mskipped\033[m ]" + fi +} + +fatal (){ + blank_line + if $terminal ; then + echo -e "\t[ \033[31m\033[1mFatal\033[m ]: \033[37m\033[1m$*\033[m" + echo "" + echo -e "\t\033[31m\033[1m Script will be interrupted..\033[m\033[m" + else + echo "fatal: $*" + echo "Script will be interrupted.." + fi + clean_up 1 +} + +error(){ + blank_line + if $terminal ; then + echo -e "\t[ \033[31m\033[1mFehler\033[m ]: $*" + else + echo "Error: $*" + fi + blank_line +} + +warn (){ + blank_line + if $terminal ; then + echo -e "\t[ \033[33m\033[1mWarning\033[m ]: $*" + else + echo "Warning: $*" + fi + blank_line +} + +info (){ + if $terminal ; then + echo "" + echo -e "\t[ \033[32m\033[1mInfo\033[m ]: $*" + echo "" + fi +} + +## - Check if a given array (parameter 2) contains a given string (parameter 1) +## - +containsElement () { + local e + for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done + return 1 +} + +trim() { + local var="$*" + var="${var#"${var%%[![:space:]]*}"}" # remove leading whitespace characters + var="${var%"${var##*[![:space:]]}"}" # remove trailing whitespace characters + echo -n "$var" +} + +blank_line() { + if $terminal ; then + echo "" + fi +} + + + +# ---------- +# - Jobhandling +# ---------- + +# - Run 'clean_up' for signals SIGHUP SIGINT SIGTERM +# - +trap clean_up SIGHUP SIGINT SIGTERM + + + +# ============= +# --- Some +# ============= + +# - Support systemd ? +# - +if [[ "X$(which systemd)" = "X" ]]; then + SYSTEMD_EXISTS=false +else + SYSTEMD_EXISTS=true +fi + +# - Running in a terminal? +# - +if [[ -t 1 ]] ; then + terminal=true +else + terminal=false +fi + +#clear + +if $terminal ; then + echo "" + echo -e "\033[32m-----\033[m" + echo "Configure Recovery Cloud System from Backup" + echo -e "\033[32m-----\033[m" +fi + + +# ---------- +# Read Configurations from $conf_file +# ---------- + + +# - Give your default values here +# - +BATCH_MODE=false +IS_NEXTCLOUD=false + +DEFAULT_BACKUP_BASE_DIR="/backup" + +DEFAULT_DATABASE_TYPE="mysql" +DEFAULT_MYSQL_CREDENTIALS="--defaults-file=/usr/local/mysql/sys-maint.cnf" + +# Note: +# HTTP_USER/HTTP_GROUP from this backup machine! +# +DEFAULT_HTTP_USER="www-data" +DEFAULT_HTTP_GROUP="www-data" +DEFAULT_PHP_ENGINE="FPM" + +DEFAULT_LOCAL_WEBSITE_BASE_DIR="/var/www" + +blank_line +echononl " Include Configuration file.." +if [[ ! -f $conf_file ]]; then + echo_skipped + warn "No configuration file '$conf_file' found!\n + Loading default values.." +else + source $conf_file + echo_done +fi +blank_line + + +# ---------- +# - Read commandline parameter +# ---------- + +while getopts bd:hs:t:w: opt ; do + case $opt in + b) BATCH_MODE=true + ;; + d) DATABASE_NAME="$OPTARG" + ;; + h) usage + ;; + s) SERVER="$OPTARG" + ;; + t) BACKUP_DATE="$OPTARG" + ;; + w) WEBSITE="$OPTARG" + ;; + \?) usage ;; + esac +done + +[[ -z "$DATABASE_TYPE" ]] && DATABASE_TYPE="$DEFAULT_DATABASE_TYPE" +[[ -z "$MYSQL_CREDENTIALS" ]] && MYSQL_CREDENTIALS="$DEFAULT_MYSQL_CREDENTIALS" + +[[ -z "$BACKUP_BASE_DIR" ]] && BACKUP_BASE_DIR="$DEFAULT_BACKUP_BASE_DIR" +if [[ ! -d "$BACKUP_BASE_DIR" ]] ; then + fatal "Backup Base Directory (${BACKUP_BASE_DIR}) NOT found!" +fi + +[[ -z "$LOCAL_WEBSITE_BASE_DIR" ]] && LOCAL_WEBSITE_BASE_DIR="$DEFAULT_LOCAL_WEBSITE_BASE_DIR" + +[[ -z "$PHP_ENGINE" ]] && PHP_ENGINE="$DEFAULT_PHP_ENGINE" + + +# Check PHP Version +# +PHP_VERSION="" +if [[ "$PHP_ENGINE" = "FPM" ]] ; then + if [[ -z "$PHP_VERSION" ]] ; then + if [[ -h "/usr/local/php" ]]; then + PHP_VERSION="$(realpath /usr/local/php | cut -d'-' -f2 | cut -d'.' -f1,2)" + fi + fi +fi + + +# - Determin PHP binary +# - +php_binary="$(realpath "$(which php)")" +if [[ -z "$php_binary" ]]; then + if [[ -x "/usr/local/php/bin/php" ]]; then + php_binary="/usr/local/php/bin/php" + else + fatal "No PHP binary present" + fi +else + if [[ ! -x "$php_binary" ]]; then + fatal "Found PHP binary '$php_binary', but this file is not executable!" + fi +fi + + +# - Determin user/group of the webserver +# - +httpd_binary="`which httpd`" +if [ -z "$httpd_binary" ]; then + httpd_binary="$(ps -axu | grep httpd | grep -e "^root" | grep -v grep | awk '{print$11}')" + if [ -z "$httpd_binary" ]; then + if [ -x "/usr/local/apache2/bin/httpd" ]; then + httpd_binary="/usr/local/apache2/bin/httpd" + fi + fi +fi + +if [ -x "$httpd_binary" ];then + + # - Determin websever user + # - + _HTTP_USER="`$httpd_binary -t -D DUMP_RUN_CFG 2> /dev/null | grep -i -e "^User" | awk '{print$2}' | cut -d\"=\" -f2 | tr -d '"'`" > /dev/null 2>&1 + + _HTTP_GROUP="`$httpd_binary -t -D DUMP_RUN_CFG 2> /dev/null | grep -i -e "^Group" | awk '{print$2}' | cut -d\"=\" -f2 | tr -d '"'`" > /dev/null 2>&1 + + # - Is webserver running ? + # - + PID=$(ps aux | grep "$(realpath $httpd_binary)" | grep -e "^root" | grep -v grep | awk '{print$2}') + if [[ "X${PID}X" = "XX" ]] ;then + IS_HTTPD_RUNNING=false + else + IS_HTTPD_RUNNING=true + fi +fi + +if [[ -n "$_HTTP_USER" ]] ; then + if [[ -n "$HTTP_USER" ]] && [[ "$_HTTP_USER" != "$HTTP_USER" ]]; then + warn "The script has determined \033[1;37m${_HTTP_USER}\033[m as Webservers user. This\n value differs from the value given in your configuration file, \n which is \033[1;37m${HTTP_USER}\033[m and takes precedence." + else + HTTP_USER=$_HTTP_USER + fi +else + [[ -n "$HTTP_USER" ]] || HTTP_USER=$DEFAULT_HTTP_USER +fi +if [[ -n "$_HTTP_GROUP" ]] ; then + if [[ -n "$HTTP_GROUP" ]] && [[ "$_HTTP_GROUP" != "$HTTP_GROUP" ]]; then + warn "The script has determined \033[1;37m${_HTTP_GROUP}\033[m as Webservers group. This\n value differs from the value given in your configuration file, \n which is \033[1;37m${HTTP_GROUP}\033[m and takes precedence." + else + HTTP_GROUP=$_HTTP_GROUP + fi +else + [[ -n "$HTTP_GROUP" ]] || HTTP_GROUP=$DEFAULT_HTTP_GROUP +fi + + +# ---------- +# - Read in parameters from command line +# ---------- + +if $terminal && ! $BATCH_MODE ; then + + declare -a unsorted_server_arr + declare -a server_arr + declare -a unsorted_version_arr + declare -a version_arr + declare -a unsorted_website_arr + declare -a website_arr + + # Get list (array) of backuped servers + # + while IFS='' read -r -d '' _server_backuped ; do + + [[ "$(basename "$_server_backuped")" = "www" ]] && continue + [[ "$(basename "$_server_backuped")" = "lost+found" ]] && continue + unsorted_server_arr+=("$(basename "$_server_backuped")") + + done < <(find "${BACKUP_BASE_DIR}" -mindepth 1 -maxdepth 1 -type d -print0) + + # - Sort array + # - + IFS=$'\n' server_arr=($(sort <<<"${unsorted_server_arr[*]}")) + + SERVER= + _OK=false + echo "" + echo "From which Server would you like to restore?" + echo "" + declare -i i=0 + for _server in ${server_arr[@]} ; do + IFS=':' read -a _arr <<< ${_server} + echo " [$i] ${_arr[0]}" + ((i++)) + done + echo + echononl " Eingabe: " + while ! $_OK ; do + read _IN + if is_number "$_IN" && [[ -n ${server_arr[$_IN]} ]]; then + IFS=':' read -a _arr <<< ${server_arr[$_IN]} + SERVER=${_arr[0]} + _OK=true + else + echo "" + echo -e "\tFalsche Eingabe !" + echo "" + echononl " Eingabe: " + fi + done + + for _dir in $(ls "${BACKUP_BASE_DIR}/${SERVER}/archive/") ; do + + [[ -d "${BACKUP_BASE_DIR}/${SERVER}/archive/$_dir" ]] || continue + _backup_date="$(echo "$_dir"| grep -o -E "[0-9]{4}-[0-9]{2}-[0-9]{2}")" + + unsorted_version_arr+=("$(basename "${_dir}"):${_backup_date}") + done + + if [[ ${#unsorted_version_arr[@]} -lt 1 ]] ; then + fatal "No backuped version present!" + fi + + # - Sort array + # - + IFS=$'\n' version_arr=($(sort <<<"${unsorted_version_arr[*]}")) + + + RESTORE_DIR="" + BACKUP_DATE="" + _OK=false + echo "" + echo "Which version would you like to restore?" + echo "" + declare -i i=0 + for _backup_version in ${version_arr[@]} ; do + IFS=':' read -a _arr <<< ${_backup_version} + #echo " [$i] Directory ${_arr[0]} Version from ${_arr[1]}" + echo -e " [$i] Backup Version from \033[1m${_arr[1]}\033[m" + ((i++)) + done + echo + echononl " Eingabe: " + while ! $_OK ; do + read _IN + if is_number "$_IN" && [[ -n ${version_arr[$_IN]} ]]; then + IFS=':' read -a _arr <<< ${version_arr[$_IN]} + BACKUP_DIR="${BACKUP_BASE_DIR}/${SERVER}/archive/${_arr[0]}" + BACKUP_DATE="${_arr[1]}" + _OK=true + else + echo "" + echo -e "\tFalsche Eingabe !" + echo "" + echononl " Eingabe: " + fi + done + + WEBSITE_BASE_DIR="${BACKUP_DIR}/var/www" + + + # Get list (array) of Websites + # + while IFS='' read -r -d '' _website ; do + + [[ "$(basename "$_website")" = "lost+found" ]] && continue + [[ "$(basename "$_website")" = "default" ]] && continue + [[ "$(basename "$_website")" = "dehydrated" ]] && continue + unsorted_website_arr+=("$(basename "$_website")") + + done < <(find "${WEBSITE_BASE_DIR}" -mindepth 1 -maxdepth 1 -type d -print0) + + if [[ ${#unsorted_website_arr} -eq 0 ]]; then + fatal "No backuped website dound at '${WEBSITE_BASE_DIR}'!" + fi + + # - Sort array + # - + IFS=$'\n' website_arr=($(sort <<<"${unsorted_website_arr[*]}")) + + WEBSITE= + _OK=false + echo "" + echo "Which site would you like to restore?" + echo "" + declare -i i=0 + for _site in ${website_arr[@]} ; do + IFS=':' read -a _arr <<< ${_site} + echo " [$i] ${_arr[0]}" + ((i++)) + done + echo + echononl " Eingabe: " + while ! $_OK ; do + read _IN + if is_number "$_IN" && [[ -n ${website_arr[$_IN]} ]]; then + WEBSITE=${website_arr[0]} + _OK=true + else + echo "" + echo -e "\tFalsche Eingabe !" + echo "" + echononl " Eingabe: " + fi + done + + RESTORE_DIR="${WEBSITE_BASE_DIR}/${WEBSITE}" + if [[ "$(basename $(realpath "${RESTORE_DIR}/htdocs"))" =~ ^nextcloud ]]; then + NC_RESTORE_VERSION="$(basename $(realpath "${RESTORE_DIR}/htdocs") | cut -d"-" -f2)" + IS_NEXTCLOUD=true + fi + + + DATABASE_NAME="" + echo "" + echo -e "\033[32m--\033[m" + echo "" + echo "Insert Database name for .." + echo "" + echo "" + echononl "Database name: " + read _DATABASE_NAME + while [ "X$(trim "$_DATABASE_NAME")" = "X" ] ; do + echo -e "\n\t\033[33m\033[1mEingabe erforderlich.\033[m\n" + echononl "Database name: " + read _DATABASE_NAME + done + DATABASE_NAME="$(trim "$_DATABASE_NAME")" + +else + + if [[ -z "$SERVER" ]]; then + fatal "No Server (Parameter '-s') given!" + fi + if [[ -z "$BACKUP_DATE" ]] ; then + fatal "No Backup date (Parameter '-t') given!" + else + BACKUP_DIR="${BACKUP_BASE_DIR}/${SERVER}/archive/Backup_${BACKUP_DATE}" + WEBSITE_BASE_DIR="${BACKUP_DIR}/var/www" + fi + + if [[ -z "${WEBSITE}" ]]; then + fatal "No Website (Parameter '-w') given!" + else + RESTORE_DIR="${WEBSITE_BASE_DIR}/${WEBSITE}" + NC_RESTORE_VERSION="$(basename $(realpath "${RESTORE_DIR}/htdocs") | cut -d"-" -f2)" + fi + + if [[ -z "$DATABASE_NAME" ]] ; then + fatal "No Website (Parameter '-d') given!" + fi +fi + + +# ============= +# --- Some final checks +# ============= + +if ! $(ls /backup/cl-fm.oopen.de/MySQL/${DATABASE_NAME}/${DATABASE_NAME}-${BACKUP_DATE}-* > /dev/null 2>&1) ; then + if ! $(ls /backup/cl-fm.oopen.de/MariaDB/${DATABASE_NAME}/${DATABASE_NAME}-${BACKUP_DATE}-* > /dev/null 2>&1) ; then + fatal "No backuped database '${DATABASE_NAME} found!" + else + SQL_FILE="$(ls /backup/cl-fm.oopen.de/MariaDB/${DATABASE_NAME}/${DATABASE_NAME}-${BACKUP_DATE}-* | head -n 1)" + fi +else + SQL_FILE="$(ls /backup/cl-fm.oopen.de/MariaDB/${DATABASE_NAME}/${DATABASE_NAME}-${BACKUP_DATE}-* | head -n 1)" +fi + +if [[ ! -d "$WEBSITE_BASE_DIR" ]]; then + fatal "Websites base directory "${WEBSITE_BASE_DIR}" not present" +fi + + + +if $terminal ; then + echo "" + echo "" + echo -e "\033[32m--\033[m" + echo -e "\033[1;32mRecover \033[1;37m${WEBSITE}\033[1;32m from \033[1;37m${BACKUP_DATE}\033[1;32m - Start with Parameters:" + echo -e "\033[32m--\033[m" + echo "" + echo -e " Website to restore...................: $WEBSITE" + echo "" + echo -e " Backup base directory................: $BACKUP_BASE_DIR" + echo -e " Local Website Base Directory.........: $LOCAL_WEBSITE_BASE_DIR" + echo "" + if $IS_NEXTCLOUD ; then + echo -e " Version of backuped nextcloud........: $NC_RESTORE_VERSION" + echo "" + fi + echo -e " Backup Directory.....................: $BACKUP_DIR" + echo -e " Backup date .........................: $BACKUP_DATE" + echo "" + echo -e " Database type........................: $DATABASE_TYPE" + echo -e " Databse name.........................: $DATABASE_NAME" + echo -e " SQL File Path........................: $SQL_FILE" + echo "" + echo -e " Webserver user.......................: $HTTP_USER" + echo -e " Webserver group......................: $HTTP_GROUP" + echo "" + if [[ -n "$PHP_VERSION" ]]; then + echo -e " PHP version..........................: $PHP_VERSION" + echo -e " PHP Engine...........................: $PHP_ENGINE" + echo "" + fi + if [[ "$DATABASE_TYPE" = "mysql" ]] ; then + echo -e " Mysql Credentials....................: $MYSQL_CREDENTIALS" + fi + echo "" + + echo "" + echo -n " Type upper case 'YES' to continue executing with this parameters: " + read OK + if [[ "$OK" = "YES" ]] ; then + echo "" + echo "" + echo -e "\033[1;32mLet's go\033[1;37m..\033[m" + else + fatal "Abort by user request - Answer as not 'YES'" + fi +fi + + +# ----- +# - Doing some pre-script tasks +# ----- + +if $terminal ; then + echo "" + echo "" + echo -e "\033[37m\033[1mDoing some pre-script tasks..\033[m" + echo "" +fi + + +# - Deaktiviere Cronjobs +# - +_backup_crontab_file=/tmp/crontab_root.${backup_date} +echononl " Backup Crontab to '$_backup_crontab_file'" +crontab -l > $_backup_crontab_file 2> $log_file +if [[ $? -eq 0 ]]; then + echo_ok +else + echo_failed + fatal "$(cat $log_file)" +fi + +echononl " Remove crontab for root.." +crontab -r > $log_file 2>&1 +if [[ $? -eq 0 ]]; then + echo_ok +else + echo_failed + fatal "$(cat $log_file)" +fi + + +# - Stop Apache Webserver +# - +blank_line +echononl " Stop Apache Webserver.." +if $SYSTEMD_EXISTS ; then + systemctl stop apache2 + if [[ $? -eq 0 ]]; then + echo_ok + else + echo_failed + fatal "$(cat $log_file)" + fi +else + /etc/init.d/apache2 stop + if [[ $? -eq 0 ]]; then + echo_ok + else + echo_failed + fatal "$(cat $log_file)" + fi +fi + +blank_line +echononl " Create Directory '$BACKUP_BASE_DIR'.." +if [[ ! -d "$BACKUP_BASE_DIR" ]]; then + mkdir -p "$BACKUP_BASE_DIR" > $log_file 2>&1 + if [[ $? -eq 0 ]]; then + echo_ok + else + echo_failed + fatal "$(cat $log_file)" + fi +else + echo_skipped +fi + + +# ----- +# - Main Part of Script +# ----- + +if $terminal ; then + echo "" + echo "" + echo -e "\033[37m\033[1mMain Part of Script.\033[m" + echo "" +fi + +echononl " Restore Database '${DATABASE_NAME}'.." +mysql $MYSQL_CREDENTIAL_ARGS $DATABASE_NAME < $SQL_FILE > $log_file 2>&1 +if [[ $? -eq 0 ]]; then + echo_ok +else + echo_failed + fatal "$(cat $log_file)" +fi + +echononl " Sync Webspace - site '${WEBSITE}' from '${BACKUP_DATE}'.." +rsync -a --delete "$RESTORE_DIR" "${LOCAL_WEBSITE_BASE_DIR}/" > $log_file 2>&1 +if [[ $? -eq 0 ]]; then + echo_ok +else + echo_failed + echo -e "\n rsync -a --delete \"$RESTORE_DIR\" \"${LOCAL_WEBSITE_BASE_DIR}/\"" + fatal "$(cat $log_file)" +fi + +if $IS_NEXTCLOUD ; then + echononl " Set maintanance mod on site '${WEBSITE}' to 'off'.." + if [[ -f "${LOCAL_WEBSITE_BASE_DIR}/${WEBSITE}/htdocs/config/config.php" ]] ; then + perl -i -n -p -e "s/^(\s*)(.*'maintenance'.*)/\1'maintenance' => false,/" \ + "${LOCAL_WEBSITE_BASE_DIR}/${WEBSITE}/htdocs/config/config.php" > $log_file 2>&1 + if [[ $? -eq 0 ]]; then + echo_ok + else + echo_failed + echo -e "\n rsync -a --delete \"$RESTORE_DIR\" \"${LOCAL_WEBSITE_BASE_DIR}/\"" + fatal "$(cat $log_file)" + fi + else + echo_skipped + error "Configuration file '${LOCAL_WEBSITE_BASE_DIR}/${WEBSITE}/htdocs/config/config.php' not found!" + fi +fi + + +echononl " Set Permissons on local website directory\n '${LOCAL_WEBSITE_BASE_DIR}/${WEBSITE}'.." +chown "$HTTP_USER":"$HTTP_GROUP" "${LOCAL_WEBSITE_BASE_DIR}/${WEBSITE}" > $log_file 2>&1 +if [[ $? -eq 0 ]]; then + echo_ok +else + echo_failed + echo -e "\n chown \"$HTTP_USER\":\"$HTTP_GROUP\" \"${LOCAL_WEBSITE_BASE_DIR}/${WEBSITE}\"" + error "$(cat $log_file)" +fi + +echononl " Copy info file 'BACKUP-DATE' to Documentroot.." +if [[ -d "${LOCAL_WEBSITE_BASE_DIR}/${WEBSITE}" ]]; then + echo "${BACKUP_DATE}" > "${LOCAL_WEBSITE_BASE_DIR}/${WEBSITE}/BACKUP-DATE" 2> $log_file + if [[ $? -eq 0 ]]; then + echo_ok + else + echo_failed + fatal "$(cat $log_file)" + fi +else + echo_skipped + warn "Local wbesite directory '${LOCAL_WEBSITE_BASE_DIR}/${WEBSITE}' does not exists!" +fi + + +# ----- +# - Doing some post-script tasks +# ----- + +if $terminal ; then + echo "" + echo "" + echo -e "\033[37m\033[1mDoing some post-script tasks..\033[m" + echo "" +fi + +echononl " Restart PHP engine.." +if [[ "$PHP_ENGINE" = "FPM" ]] && [[ -n "$PHP_VERSION" ]]; then + if $SYSTEMD_EXISTS ; then + systemctl restart php-${PHP_VERSION}-fpm > $log_file 2>&1 + if [[ $? -eq 0 ]]; then + echo_ok + else + echo_failed + error "$(cat $log_file)" + fi + else + /etc/init.d/php-${PHP_VERSION}-fpm restart > $log_file 2>&1 + if [[ $? -eq 0 ]]; then + echo_ok + else + echo_failed + error "$(cat $log_file)" + fi + fi +else + echo_skipped +fi + +# - Start Apache Webserver +# - +blank_line +echononl " Start Apache Webserver.." +if $SYSTEMD_EXISTS ; then + systemctl start apache2 > $log_file 2>&1 + if [[ $? -eq 0 ]]; then + echo_ok + else + echo_failed + error "$(cat $log_file)" + fi +else + /etc/init.d/apache2 start > $log_file 2>&1 + if [[ $? -eq 0 ]]; then + echo_ok + else + echo_failed + error "$(cat $log_file)" + fi +fi + +_redis_cli_bin="$(which redis-cli)" +if [[ -z "$_redis_cli_bin" ]]; then + if [[ -x "/usr/local/bin/redis-cli" ]]; then + _redis_cli_bin="/usr/local/bin/redis-cli" + fi +fi + + +echononl " Flush redis cache.." +if [[ -x "$_redis_cli_bin" ]]; then + $_redis_cli_bin flushall > $log_file 2>&1 + if [[ $? -eq 0 ]]; then + echo_ok + else + echo_failed + error "$(cat $log_file)" + fi +else + echo_skipped +fi + + +echononl " Restart redis server.." +if $SYSTEMD_EXISTS ; then + systemctl restart redis-server > $log_file 2>&1 + if [[ $? -eq 0 ]]; then + echo_ok + else + echo_failed + error "$(cat $log_file)" + fi +else + /etc/init.d/redis-server restart > $log_file 2>&1 + if [[ $? -eq 0 ]]; then + echo_ok + else + echo_failed + error "$(cat $log_file)" + fi +fi + +blank_line + + +clean_up 1 diff --git a/conf/restore-website-from-backup.conf.sample b/conf/restore-website-from-backup.conf.sample new file mode 100644 index 0000000..b3798b0 --- /dev/null +++ b/conf/restore-website-from-backup.conf.sample @@ -0,0 +1,80 @@ +# ============================================================== +# --- +# Parameter Settings for Script 'restore-website-from-backup.sh' +# --- +# ============================================================== + +# - BACKUP_BASE_DIR +# - +# - Base Directory which holds all server backups +# - +# - Defaults to +# - BACKUP_BASE_DIR="/backup" +# - +#BACKUP_BASE_DIR="/backup" + + +# - MYSQL_CREDENTIALS +# - +# - Giving password on command line is insecure an sind mysql 5.5 +# - you will get a warning doing so. +# - +# - Reading username/password fro file ist also possible, using MySQL/MariaDB +# - commandline parameter '--defaults-file'. +# - +# - Since Version 5.6, that method is considered as insecure. +# - To avoid giving the password on command line, we use an +# - encrypted option file +# - +# - Create (encrypted) option file: +# - $ mysql_config_editor set --login-path=local --socket=/var/run/mysqld/mysqld.sock --user=backup --password +# - $ Password: +# - +# - Use of option file: +# - $ mysql --login-path=local ... +# - +# - Example +# - MYSQL_CREDENTIALS="--login-path=local" +# - MYSQL_CREDENTIALS="--defaults-file=/etc/mysql/debian.cnf" (Debian default) +# - MYSQL_CREDENTIALS="--defaults-file=/usr/local/mysql/sys-maint.cnf" +# - +# - # MariaDB 10.4.x +# - MYSQL_CREDENTIALS="-u root -S /tmp/mysql.sock" +# - +# - Defaults to +# - MYSQL_CREDENTIALS="--defaults-file=/usr/local/mysql/sys-maint.cnf" +# - +#MYSQL_CREDENTIALS="--defaults-file=/usr/local/mysql/sys-maint.cnf" + + +# - HTTP_USERA - local Webservers user +# - +# - If ommitted, script tries to determine the user under which user the webserver +# - is running. If that fails, parameter defaults to 'www-data' +# - +#HTTP_USER="www-data" + + +# - HTTP_GROUP - local Webservers group +# - +# - If ommitted, script tries to determine the user under which group the webserver +# - is running. If that fails, parameter defaults to 'www-data' +# - +#HTTP_GROUP="www-data" + + +# - PHP_ENGINE - PHP engine +# - +# - Possible values: 'FPM' 'FCGI' 'MOD-PHP' +# - +# - Defaults to 'FPM' +# - +#PHP_ENGINE="FPM" + + +# - LOCAL_WEBSITE_BASE_DIR +# - +# - Defaults to: +# - LOCAL_WEBSITE_BASE_DIR="/var/www" +# - +#LOCAL_WEBSITE_BASE_DIR="/var/www"