Created
September 30, 2014 23:20
-
-
Save andergmartins/6295fec55fb9a796968c to your computer and use it in GitHub Desktop.
Code to synchronize your copy of a site
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
################################################################################ | |
# DEFAULT VARIABLES | |
################################################################################ | |
LOCAL_PATH=/var/www | |
LOCAL_DOMAIN=mylocaltest.dev | |
LOCAL_DB_NAME=myuser | |
LOCAL_DB_USER=root | |
LOCAL_DB_PASSWORD=myrootpassword | |
SHOULD_SYNC_FILES=1 | |
SHOULD_SYNC_DATABASE=1 | |
SHOULD_USE_CACHED_DATABASE=0 | |
ESCAPED_LOCAL_PATH=$(echo $LOCAL_PATH | sed -e 's/\\/\\\\/g' -e 's/\//\\\//g' -e 's/&/\\\&/g') | |
ESCAPED_REMOTE_PATH=$(echo $REMOTE_PATH | sed -e 's/\\/\\\\/g' -e 's/\//\\\//g' -e 's/&/\\\&/g') | |
BACKUP_FILENAME=`cat /dev/urandom | tr -cd 'a-f0-9' | head -c 32` | |
DATABASE_BACKUP_CACHE_FILE="/tmp/database_backup_cache.txt" | |
PROGNAME=$(basename $0) | |
################################################################################ | |
# PARSE COMMAND ARGUMENTS | |
################################################################################ | |
show_help () { | |
cat <<EOF | |
Usage: update-site [OPTIONS] | |
Options | |
-f Sync only files | |
-d Sync only the database | |
-c Will use the cached database if available to sync, instead of build and download live from the server | |
EOF | |
exit 1 | |
} | |
while getopts fdhco: opt "$@" | |
do | |
case "$opt" in | |
f) SHOULD_SYNC_DATABASE=0;; | |
d) SHOULD_SYNC_FILES=0;; | |
c) SHOULD_USE_CACHED_DATABASE=1;; | |
h) show_help;; | |
\?) show_help;; | |
esac | |
done | |
################################################################################ | |
# METHODS | |
################################################################################ | |
# Params: $1 = Message | |
echo_header () { | |
echo "$(tput setaf 4)$1$(tput sgr0)" | |
} | |
# Params: $1 = Message | |
echo_alert () { | |
echo "$(tput setaf 3)$1$(tput sgr0)" | |
} | |
# Params: $1 = Message | |
echo_error () { | |
echo "" | |
echo "$(tput setab 1)${PROGNAME}: ${1:-"Unknown Error"}$(tput sgr0)" 1>&2 | |
echo "" | |
} | |
# Params: $1 = Message | |
echo_error_exit () { | |
echo_error "$1" | |
exit 1 | |
} | |
# Params: $1 query | |
run_query () { | |
mysql -u $LOCAL_DB_USER -p$LOCAL_DB_PASSWORD $LOCAL_DB_NAME -e "$1" | |
} | |
# Check if local database exists and create it if necessary | |
check_database_exists () { | |
mysql -u $LOCAL_DB_USER -p$LOCAL_DB_PASSWORD -e "CREATE DATABASE IF NOT EXISTS $LOCAL_DB_NAME;" | |
run_query "GRANT USAGE ON *.* TO root@localhost IDENTIFIED BY 'root';" | |
run_query "GRANT ALL PRIVILEGES ON $LOCAL_DB_NAME.* TO root@localhost;" | |
run_query "FLUSH PRIVILEGES;" | |
} | |
# Params: $1 = table name, $2 = field name | |
fix_table_data () { | |
echo "Fixing table: $1, field: $2" | |
run_query "UPDATE $1 SET $2 = REPLACE($2, '$REMOTE_DOMAIN', '$LOCAL_DOMAIN');" | |
} | |
fix_user_passwords () { | |
echo "Changing user passwords to 'vagrant'" | |
run_query "UPDATE mydbprefix_users SET password = '63623900c8bbf21c706c45dcb7a2c083'" | |
} | |
sync_files () { | |
echo_header "Synchronizing all files..." | |
rsync -avzhe ssh\ | |
--progress\ | |
--stats\ | |
--delete-before\ | |
--exclude '*.jpa'\ | |
--exclude '/administrator/components/com_akeeba/backup/*'\ | |
--exclude '.ftpquota'\ | |
--exclude 'error_log'\ | |
--exclude '*.log'\ | |
--exclude 'media/kunena/attachments'\ | |
--exclude '/cache/*'\ | |
--exclude 'lost+found'\ | |
--exclude '/tmp/*'\ | |
--exclude '/cgi-bin/*'\ | |
$REMOTE_USER@$REMOTE_IP:$REMOTE_PATH/ $LOCAL_PATH/ || echo_error "Unable to complete the files sync operation. Please, run this command again with the -f argument." | |
} | |
fix_files () { | |
# Remove htaccess/htpasswd from administrator | |
echo_header "Removing htaccess/htpasswd from administrator..." | |
[ -f $LOCAL_PATH/administrator/.htaccess ] && rm $LOCAL_PATH/administrator/.htaccess | |
[ -f $LOCAL_PATH/administrator/.htpasswd ] && rm $LOCAL_PATH/administrator/.htpasswd | |
# Fix the .htaccess file | |
echo_header "Updating local files content..." | |
sed -i "s/$REMOTE_DOMAIN/$LOCAL_DOMAIN/g" $LOCAL_PATH/.htaccess | |
sed -i "s/$REMOTE_DOMAIN/$LOCAL_DOMAIN/g" $LOCAL_PATH/images/.htaccess | |
# Fix the configuration.php file | |
chmod +w $LOCAL_PATH/configuration.php | |
sed -i "s/\$user = '$REMOTE_DB_USER';/\$user = '$LOCAL_DB_USER';/" $LOCAL_PATH/configuration.php | |
sed -i "s/\$password = '$REMOTE_DB_PASSWORD';/\$password = '$LOCAL_DB_PASSWORD';/" $LOCAL_PATH/configuration.php | |
sed -i "s/\$db = '$REMOTE_DB_NAME';/\$db = '$LOCAL_DB_NAME';/" $LOCAL_PATH/configuration.php | |
sed -i "s/\$caching = '1';/\$caching = '0';/" $LOCAL_PATH/configuration.php | |
sed -i "s/\$force_ssl = '1';/\$force_ssl = '0';/" $LOCAL_PATH/configuration.php | |
sed -i "s/\$cachetime = '15';/\$cachetime = '9999';/" $LOCAL_PATH/configuration.php | |
sed -i "s/$ESCAPED_REMOTE_PATH/$ESCAPED_LOCAL_PATH/g" $LOCAL_PATH/configuration.php | |
chmod -w $LOCAL_PATH/configuration.php | |
# Add the .gitignore file again | |
touch $LOCAL_PATH/.gitignore | |
} | |
sync_database () { | |
if [ $SHOULD_USE_CACHED_DATABASE = "0" ]; | |
then | |
DB_BACKUP_FILENAME=`cat /dev/urandom | tr -cd 'a-f0-9' | head -c 32` | |
LOCAL_DB_BACKUP_FILE=/tmp/$DB_BACKUP_FILENAME | |
REMOTE_DB_BACKUP_FILE=$REMOTE_BACKUP_PATH/$DB_BACKUP_FILENAME | |
# Remove old database backup if exists | |
if [ -f $DATABASE_BACKUP_CACHE_FILE ]; | |
then | |
echo "Cleaning database backup cache file..." | |
TMP_DB_BACKUP_FILENAME=`cat $DATABASE_BACKUP_CACHE_FILE` | |
TMP_DB_BACKUP_FILE=$LOCAL_PATH/tmp/$TMP_DB_BACKUP_FILENAME | |
if [ -f $TMP_DB_BACKUP_FILE ]; | |
then | |
rm -f $TMP_DB_BACKUP_FILE; | |
fi | |
rm -f $DATABASE_BACKUP_CACHE_FILE; | |
fi | |
# Store the database backup name for future use | |
echo $DB_BACKUP_FILENAME > $DATABASE_BACKUP_CACHE_FILE | |
# Create the remote database backup | |
echo_header "Creating remote database backup..." | |
ssh $REMOTE_USER@$REMOTE_IP "mysqldump -u $REMOTE_DB_USER -p$REMOTE_DB_PASSWORD $REMOTE_DB_NAME > $REMOTE_DB_BACKUP_FILE" | |
# Download remote database backup | |
echo_header "Downloading remote database backup..." | |
rsync -havzPe ssh\ | |
--progress\ | |
--remove-source-files\ | |
$REMOTE_USER@$REMOTE_IP:$REMOTE_DB_BACKUP_FILE $LOCAL_DB_BACKUP_FILE | |
else | |
echo "Using the cached database backup" | |
DB_BACKUP_FILENAME=`cat $DATABASE_BACKUP_CACHE_FILE` | |
LOCAL_DB_BACKUP_FILE=/tmp/$DB_BACKUP_FILENAME | |
if [ ! -f $LOCAL_DB_BACKUP_FILE ]; | |
then | |
echo_error "There is no cached database file. Remove the -c option to build a new cache and sync database" | |
exit 1 | |
fi | |
fi | |
check_database_exists | |
# Clean the local database | |
echo_header "Cleaning local database..." | |
TABLES=$(mysql -u $LOCAL_DB_USER -p$LOCAL_DB_PASSWORD $LOCAL_DB_NAME -e 'show tables' | awk '{ print $1}' | grep -v '^Tables' ) | |
for t in $TABLES | |
do | |
echo "Deleting local $t table from $LOCAL_DB_NAME database" | |
run_query "drop table $t" | |
done | |
# Sync the db dump to the local database | |
echo_header "Syncing local database with the backup..." | |
mysql -u $LOCAL_DB_USER -p$LOCAL_DB_PASSWORD $LOCAL_DB_NAME < $LOCAL_DB_BACKUP_FILE | |
} | |
fix_database () { | |
echo_header "Fixing local database data..." | |
fix_table_data "mydbprefix_betterpreview_sefs" "sef" | |
fix_table_data "mydbprefix_betterpreview_sefs" "url" | |
fix_table_data "mydbprefix_sef_redirect" "target" | |
fix_table_data "mydbprefix_redirect_links" "new_url" | |
fix_table_data "mydbprefix_sef_log" "referer" | |
fix_table_data "mydbprefix_weblinks" "url" | |
fix_user_passwords | |
} | |
################################################################################ | |
# SYNC | |
################################################################################ | |
if [ $SHOULD_SYNC_FILES = "1" ]; | |
then | |
sync_files | |
fix_files | |
fi | |
if [ $SHOULD_SYNC_DATABASE = "1" ] | |
then | |
sync_database | |
fix_database | |
fi | |
echo_alert "Finished" | |
exit 0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment