From 91a670f11bef268735dcf1af7718911abce1b31f Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 22 Dec 2015 23:08:15 +0000 Subject: [PATCH] Suspend sites while backing up This avoids backup verification failures --- src/freedombone-backup-local | 51 ++++++++++++++++++++++++++++++++++- src/freedombone-backup-remote | 38 +++++++++++++++++++++++++- 2 files changed, 87 insertions(+), 2 deletions(-) diff --git a/src/freedombone-backup-local b/src/freedombone-backup-local index e13fea99..9fc85b87 100755 --- a/src/freedombone-backup-local +++ b/src/freedombone-backup-local @@ -49,13 +49,37 @@ fi ADMIN_USERNAME= ADMIN_NAME= +# The name of a currently suspended site +# Sites are suspended so that verification should work +SUSPENDED_SITE= + DATABASE_PASSWORD='' if [ -f /root/dbpass ]; then DATABASE_PASSWORD=$(cat /root/dbpass) fi +function suspend_site { + # suspends a given website + SUSPENDED_SITE="$1" + nginx_dissite $SUSPENDED_SITE + service nginx reload +} + +function restart_site { + # restarts a given website + if [ ! $SUSPENDED_SITE ]; then + return + fi + nginx_ensite $SUSPENDED_SITE + service nginx reload + SUSPENDED_SITE= +} function update_domains { + GIT_DOMAIN_NAME='gogs' + if grep -q "Gogs domain" $COMPLETION_FILE; then + GIT_DOMAIN_NAME=$(cat $COMPLETION_FILE | grep "Gogs domain" | awk -F ':' '{print $2}') + fi MICROBLOG_DOMAIN_NAME='microblog' if grep -q "GNU Social domain" $COMPLETION_FILE; then MICROBLOG_DOMAIN_NAME=$(cat $COMPLETION_FILE | grep "GNU Social domain" | awk -F ':' '{print $2}') @@ -68,6 +92,10 @@ function update_domains { if grep -q "Blog domain" $COMPLETION_FILE; then FULLBLOG_DOMAIN_NAME=$(cat $COMPLETION_FILE | grep "Blog domain" | awk -F ':' '{print $2}') fi + OWNCLOUD_DOMAIN_NAME='owncloud' + if grep -q "Owncloud domain" $COMPLETION_FILE; then + OWNCLOUD_DOMAIN_NAME=$(cat $COMPLETION_FILE | grep "Owncloud domain" | awk -F ':' '{print $2}') + fi } function mount_drive { @@ -133,6 +161,7 @@ function unmount_drive { function backup_database { if [ ${#DATABASE_PASSWORD} -lt 2 ]; then echo $"No MariaDB password was given" + restart_site exit 10 fi if [ ! -d $USB_MOUNT/backup/${1} ]; then @@ -152,6 +181,7 @@ function backup_database { rm -rf /root/temp${1}data umount $USB_MOUNT rm -rf $USB_MOUNT + restart_site exit 5 fi } @@ -163,6 +193,7 @@ function backup_directory_to_usb { BACKUP_KEY_EXISTS=$(gpg --list-keys "$ADMIN_NAME (backup key)") if [ ! "$?" = "0" ]; then echo $"Backup key could not be found" + restart_site exit 6 fi MY_BACKUP_KEY_ID=$(gpg --list-keys "$ADMIN_NAME (backup key)" | grep 'pub ' | awk -F ' ' '{print $2}' | awk -F '/' '{print $2}') @@ -179,6 +210,7 @@ function backup_directory_to_usb { shred -zu ${1}/* rm -rf ${1} fi + restart_site exit 71 fi obnam forget --keep=30d -r $USB_MOUNT/backup/${2} --encrypt-with $MY_BACKUP_KEY_ID @@ -189,6 +221,7 @@ function backup_directory_to_usb { shred -zu ${1}/* rm -rf ${1} fi + restart_site exit 7 fi if [[ ${1} == "/root/temp"* || ${1} == *"tempbackup" ]]; then @@ -326,9 +359,23 @@ function backup_directories { do # if this directory exists then backup the given database required_directory=$(echo $dr | awk -F ',' '{print $1}' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') + database_name=$(echo $dr | awk -F ',' '{print $2}' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') + + if [[ "$database_name" == *"hubzilla"* ]]; then + suspend_site ${HUBZILLA_DOMAIN_NAME} + fi + if [[ "$database_name" == *"gnusocial"* ]]; then + suspend_site ${MICROBLOG_DOMAIN_NAME} + fi + if [[ "$database_name" == *"owncloud"* ]]; then + suspend_site ${OWNCLOUD_DOMAIN_NAME} + fi + if [[ "$database_name" == *"gogs"* ]]; then + suspend_site ${GIT_DOMAIN_NAME} + fi + if [[ $required_directory != "none" ]]; then if [ -d $required_directory ]; then - database_name=$(echo $dr | awk -F ',' '{print $2}' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') if [[ $database_name != "none" ]]; then backup_database $database_name fi @@ -342,6 +389,8 @@ function backup_directories { echo $"Backing up $source_directory to $dest_directory" backup_directory_to_usb $source_directory $dest_directory fi + + restart_site done } diff --git a/src/freedombone-backup-remote b/src/freedombone-backup-remote index 597a740e..2a16985b 100755 --- a/src/freedombone-backup-remote +++ b/src/freedombone-backup-remote @@ -66,10 +66,32 @@ if [ ! -d $SERVER_DIRECTORY/backup ]; then mkdir -p $SERVER_DIRECTORY/backup fi +# The name of a currently suspended site +# Sites are suspended so that verification should work +SUSPENDED_SITE= + +function suspend_site { + # suspends a given website + SUSPENDED_SITE="$1" + nginx_dissite $SUSPENDED_SITE + service nginx reload +} + +function restart_site { + # restarts a given website + if [ ! $SUSPENDED_SITE ]; then + return + fi + nginx_ensite $SUSPENDED_SITE + service nginx reload + SUSPENDED_SITE= +} + function backup_directory_to_friend { BACKUP_KEY_EXISTS=$(gpg --list-keys "$ADMIN_NAME (backup key)") if [ ! "$?" = "0" ]; then echo $"Backup key could not be found" + restart_site exit 43382 fi ADMIN_BACKUP_KEY_ID=$(gpg --list-keys "$ADMIN_NAME (backup key)" | grep 'pub ' | awk -F ' ' '{print $2}' | awk -F '/' '{print $2}') @@ -86,6 +108,7 @@ function backup_directory_to_friend { fi # Send a warning email echo "Unable to verify ${2}" | mail -s "${PROJECT_NAME} backup to friends" ${ADMIN_EMAIL_ADDRESS} + restart_site exit 953 fi obnam forget --keep=30d -r $SERVER_DIRECTORY/backup/${2} --encrypt-with ${ADMIN_BACKUP_KEY_ID} @@ -96,6 +119,7 @@ function backup_directory_to_friend { fi # Send a warning email echo "Unable to backup ${2}" | mail -s "${PROJECT_NAME} backup to friends" ${ADMIN_EMAIL_ADDRESS} + restart_site exit 853 fi if [[ ${1} == "/root/temp"* || ${1} == *"tempbackup" ]]; then @@ -107,6 +131,7 @@ function backup_directory_to_friend { function backup_database_to_friend { if [ ${#DATABASE_PASSWORD} -lt 2 ]; then echo $"No MariaDB password was given" + restart_site exit 5783 fi if [ ! -d $SERVER_DIRECTORY/backup/${1} ]; then @@ -126,6 +151,7 @@ function backup_database_to_friend { rm -rf /root/temp${1}data # Send a warning email echo $"Unable to export ${1} database" | mail -s $"${PROJECT_NAME} backup to friends" $ADMIN_EMAIL_ADDRESS + restart_site exit 5738 fi } @@ -226,10 +252,12 @@ function backup_gnusocial { if grep -q "GNU Social domain" $COMPLETION_FILE; then MICROBLOG_DOMAIN_NAME=$(cat $COMPLETION_FILE | grep "GNU Social domain" | awk -F ':' '{print $2}') if [ -d /var/www/${MICROBLOG_DOMAIN_NAME}/htdocs ]; then + suspend_site ${MICROBLOG_DOMAIN_NAME} backup_database_to_friend gnusocial backup_directory_to_friend /root/tempgnusocialdata gnusocialdata echo $"Backing up GNU social installation" backup_directory_to_friend /var/www/${MICROBLOG_DOMAIN_NAME}/htdocs gnusocial + restart_site else echo $"GNU Social domain specified but not found in /var/www/${MICROBLOG_DOMAIN_NAME}" fi @@ -240,10 +268,12 @@ function backup_hubzilla { if grep -q "Hubzilla domain" $COMPLETION_FILE; then HUBZILLA_DOMAIN_NAME=$(cat $COMPLETION_FILE | grep "Hubzilla domain" | awk -F ':' '{print $2}') if [ -d /var/www/${HUBZILLA_DOMAIN_NAME} ]; then + suspend_site ${HUBZILLA_DOMAIN_NAME} backup_database_to_friend hubzilla backup_directory_to_friend /root/temphubzilladata hubzilladata echo "Backing up Hubzilla installation" backup_directory_to_friend /var/www/${HUBZILLA_DOMAIN_NAME}/htdocs hubzilla + restart_site else echo $"Hubzilla domain specified but not found in /var/www/${HUBZILLA_DOMAIN_NAME}" exit 2578 @@ -253,16 +283,21 @@ function backup_hubzilla { function backup_owncloud { if [ -d /etc/owncloud ]; then + OWNCLOUD_DOMAIN_NAME=$(cat $COMPLETION_FILE | grep "Owncloud domain" | awk -F ':' '{print $2}') + suspend_site ${OWNCLOUD_DOMAIN_NAME} backup_database_to_friend owncloud backup_directory_to_friend /root/tempownclouddata ownclouddata echo $"Backing up Owncloud data" backup_directory_to_friend /var/lib/owncloud owncloud backup_directory_to_friend /etc/owncloud owncloud2 + restart_site fi } function backup_gogs { if [ -d /home/git/go/src/github.com/gogits ]; then + GIT_DOMAIN_NAME=$(cat $COMPLETION_FILE | grep "Gogs domain" | awk -F ':' '{print $2}') + suspend_site ${GIT_DOMAIN_NAME} backup_database_to_friend gogs backup_directory_to_friend /root/tempgogsdata gogsdata echo $"Obtaining Gogs settings backup" @@ -272,6 +307,7 @@ function backup_gogs { backup_directory_to_friend /home/git/gogs-repositories gogsrepos echo $"Obtaining Gogs authorized_keys backup" backup_directory_to_friend /home/git/.ssh gogsssh + restart_site fi } @@ -537,7 +573,7 @@ do if [ $REMOTE_SERVER ]; then REMOTE_DOMAIN=$(echo "${remote_server}" | awk -F ' ' '{print $1}' | awk -F '@' '{print $2}') REMOTE_SSH_PORT=$(echo "${remote_server}" | awk -F ' ' '{print $2}') - REMOTE_DIRECTORY=$(echo "${remote_server}" | awk -F ' ' '{print $3}') + REMOTE_DIRECTORY=$(echo "${remote_server}" | awk -F ' ' '{print $3}') REMOTE_PASSWORD=$(echo "${remote_server}" | awk -F ' ' '{print $4}') NOW=$(date +"%Y-%m-%d %H:%M:%S") REMOTE_SERVER=$REMOTE_SERVER:$REMOTE_DIRECTORY