Skip to content

Instantly share code, notes, and snippets.

@sahidursuman
Forked from andergmartins/update-site.sh
Last active August 29, 2015 14:07
Show Gist options
  • Save sahidursuman/8f8f9bd888aa9700628c to your computer and use it in GitHub Desktop.
Save sahidursuman/8f8f9bd888aa9700628c to your computer and use it in GitHub Desktop.
#!/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