#!/bin/bash # # Restore a website from backup. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public # License along with this program. If not, see # . # Load. source $APP_BASE/lib/hydra/functions || exit 1 hydra_config_load # Basic parameters. SITE="$2" SITES="/var/sites" FOLDER="$SITES/$SITE" WWW="/var/www/data" # Syntax check. if [ -z "$SITE" ]; then hydra_action_usage exit 1 fi # Check restore strategy. if [ "$1" == "backups" ]; then SITE="$3" if [ -z "$SITE" ]; then hydra_action_usage exit 1 fi hydra_backup_environment_local_website $2 $SITE elif [ "$1" == "localhost" ] || [ "$1" == "`facter hostname`" ]; then hydra_backup_environment_local else hydra_backup_environment_remote $1 restore fi # Set site user. if hydra_check_user $SITE; then SITE_USER="$SITE" TRAC_USER="$SITE" else SITE_USER="root" TRAC_USER="www-data" fi # Set site group. if hydra_check_group $SITE; then SITE_GROUP="$SITE" TRAC_GROUP="$SITE" else SITE_GROUP="root" TRAC_GROUP="www-data" fi # Local backups are stored compressed if [ "$1" == "localhost" ] || [ "$1" == "backups" ]; then if [ -e "$RESTOREDIR/$SITE.tar.bz2" ]; then ( cd $RESTOREDIR && tar xvf $SITE.tar.bz2 ) fi fi # Check if folder exist on the backup. if [ ! -d "$RESTOREDIR/$FOLDER" ]; then echo "Folder $FOLDER does not exist at restored backup $RESTOREDIR" exit 1 fi # Check if there's already a site folder and backup it. if [ -e "$FOLDER" ]; then echo "Folder $FOLDER already exists, backing it up first..." hydractl backup-site $SITE if [ "$?" != "0" ]; then echo "Error backing up $FOLDER" exit 1 else echo "Erasing old site folder" rm -rf $FOLDER fi fi # Copy site folder from backup if [ -d "$RESTOREDIR/$FOLDER" ]; then echo "Copying site $SITE from backup $RESTOREDIR..." cp -a $RESTOREDIR/$FOLDER $FOLDER fi # Delete uncompressed local backup if [ "$1" == "localhost" ] || [ "$1" == "backups" ]; then rm -rf $RESTOREDIR/$FOLDER fi # Fix permissions chown -R root.root $FOLDER # Trac if [ -e "$FOLDER/trac" ]; then # Optionally also: gvcache/ log/ ( cd $FOLDER/trac && chown -R $TRAC_USER.$TRAC_GROUP attachments conf db auth plugins .egg-cache ) fi # PmWiki if [ -e "$FOLDER/wiki" ]; then ( cd $FOLDER/wiki && chown -R $SITE_USER.$SITE_GROUP wiki.d uploads ) chown $SITE.root $FOLDER/wiki/local/config.php chmod 660 $FOLDER/wiki/local/config.php fi # Site if [ -e "$FOLDER/site" ]; then chown -R $SITE_USER.$SITE_GROUP $FOLDER/site fi # Drupal if [ -e "$FOLDER/drupal" ]; then SERIES="$4" chown -R $SITE_USER.$SITE_GROUP $FOLDER/drupal/files chown root.$SITE_GROUP $FOLDER/drupal/settings.php chmod 640 $FOLDER/drupal/settings.php if [ -e "/etc/apache2/sites-available/$SITE" ]; then SERVER_ALIAS="`grep ServerAlias /etc/apache2/sites-available/$SITE | sed -e 's/ServerAlias//'`" fi if [ ! -z "$SERIES" ]; then if [ -e "$WWW/drupal-$SERIES/sites" ]; then echo "Creating basic drupal symlinks..." ( cd $WWW/drupal-$SERIES/sites ln -sf $FOLDER/drupal $SITE ln -sf $FOLDER/drupal $SITE.`facter domain` for server_alias in $SERVER_ALIAS; do if [ ! -e "$server_alias" ]; then ln -sf $FOLDER/drupal $server_alias fi done ) else echo "No drupal $SERIES found in the system, so no symlink handling" fi else echo "No drupal series argument provided, so no symlink handling" fi fi # Restore database hydractl backup-restore-database $* # Ikiwiki if [ -e "$FOLDER/ikiwiki" ]; then echo "Restoring ikiwiki for $SITE..." file="/etc/ikiwiki/$SITE.setup" if [ -e "$file" ] && [ -e "/var/git/repositories/$SITE.git" ]; then site="`basename $file .setup`" git clone file:///var/git/repositories/$SITE /var/sites/$SITE/ikiwiki_src ikiwiki --setup $file --rebuild chown -R $SITE_USER.$SITE_GROUP /var/sites/$SITE/ikiwiki* else echo "Either $file or git repository not found for $SITE ikiwiki instance" fi fi # Moin if [ -e "$FOLDER/moin" ]; then echo "Restoring moin for $SITE..." chown -R root.root $FOLDER/moin/ chown -R $SITE_USER.$SITE_GROUP $FOLDER/moin/{cgi-bin,data,underlay} fi