You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							176 lines
						
					
					
						
							4.8 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							176 lines
						
					
					
						
							4.8 KiB
						
					
					
				
								#!/bin/bash
							 | 
						|
								
							 | 
						|
								### error_handling
							 | 
						|
								
							 | 
						|
								function trap_error() {
							 | 
						|
								    error_code=$1
							 | 
						|
								    error_line=$2
							 | 
						|
								
							 | 
						|
								    if [[ ${error_code} -lt 100 ]]; then
							 | 
						|
								        printf "\nEXIT #${error_code} due to error at line ${error_line} : \n-----------------------------------------\n"
							 | 
						|
								        sed "${error_line}q;d" $0
							 | 
						|
								        echo
							 | 
						|
								    fi
							 | 
						|
								    exit $error_code
							 | 
						|
								}
							 | 
						|
								set -e
							 | 
						|
								trap 'trap_error $? $LINENO' ERR
							 | 
						|
								
							 | 
						|
								### ------------------
							 | 
						|
								
							 | 
						|
								function detectWordpress() {
							 | 
						|
								    local result=$(pwd)
							 | 
						|
								    while [[ ! ("$result" == / || -f "$result/wp-config.php") ]]; do
							 | 
						|
								        result=$(dirname "$result")
							 | 
						|
								    done
							 | 
						|
								
							 | 
						|
								    if [[ "$result" == / ]]; then
							 | 
						|
								        echo >&2 "no WORDPRESS detected!"
							 | 
						|
								        exit 100
							 | 
						|
								    fi
							 | 
						|
								
							 | 
						|
								    echo "$result"
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								function getConfigComment() {
							 | 
						|
								    local result=$(grep -e "^#" $WP_CONFIG | grep "$1" | head -n1 | cut -d ',' -f2 | cut -d \' -f2)
							 | 
						|
								    if [[ -z "$result" ]]; then
							 | 
						|
								        echo "config comment: $1 not found!"
							 | 
						|
								        exit 2
							 | 
						|
								    fi
							 | 
						|
								    echo "$result"
							 | 
						|
								}
							 | 
						|
								function getConfigEntry() {
							 | 
						|
								    local result=$(grep "$1" $WP_CONFIG | head -n1 | cut -d ',' -f2 | cut -d \' -f2)
							 | 
						|
								    if [[ -z "$result" ]]; then
							 | 
						|
								        echo "config entry: $1 not found!"
							 | 
						|
								        exit 2
							 | 
						|
								    fi
							 | 
						|
								    echo "$result"
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								function sql() {
							 | 
						|
								    local result=$(echo "$1" | mysql -srN -u $DB_USER -h $DB_HOST $DB_NAME -p$DB_PASS 2>&1)
							 | 
						|
								    if [[ $result =~ ^ERROR ]]; then
							 | 
						|
								        echo >&2 "sql failure: $result"
							 | 
						|
								        exit 3
							 | 
						|
								    else
							 | 
						|
								        echo "$result"
							 | 
						|
								    fi
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								function sqlFile() {
							 | 
						|
								    local result=$(cat "$1" | mysql -srN -u $DB_USER -h $DB_HOST $DB_NAME -p$DB_PASS 2>&1)
							 | 
						|
								    if [[ $result =~ ^ERROR ]]; then
							 | 
						|
								        echo >&2 "sql failure: $result"
							 | 
						|
								        exit 3
							 | 
						|
								    else
							 | 
						|
								        echo "$result"
							 | 
						|
								    fi
							 | 
						|
								}
							 | 
						|
								function changeHome() {
							 | 
						|
								    local FROM=$1
							 | 
						|
								    local TO=$2
							 | 
						|
								    sql "UPDATE wp_options SET option_value = replace(option_value, '$FROM', '$TO') WHERE option_name = 'home' OR option_name = 'siteurl'"
							 | 
						|
								    sql "UPDATE wp_posts SET guid = replace(guid, '$FROM','$TO')"
							 | 
						|
								    sql "UPDATE wp_posts SET post_content = replace(post_content, '$FROM', '$TO')"
							 | 
						|
								    sql "UPDATE wp_postmeta SET meta_value = replace(meta_value,'$FROM','$TO')"
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								function lastMigration() {
							 | 
						|
								    sql "SELECT migration_file FROM migrations ORDER BY last_run DESC LIMIT 1"
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								function upgradeMigration() {
							 | 
						|
								    local LAST_MIGRATION=$1
							 | 
						|
								    local UPGRADE=false
							 | 
						|
								    if [[ "$LAST_MIGRATION" == '' ]]; then
							 | 
						|
								        UPGRADE=true
							 | 
						|
								    fi
							 | 
						|
								
							 | 
						|
								    local MIG_BASE="$WP_BASE/wp-content/migrations"
							 | 
						|
								    local MIGRATIONS=$(ls -p1 $MIG_BASE | grep -v /)
							 | 
						|
								    local MIG_FILE
							 | 
						|
								    for mig in $MIGRATIONS; do
							 | 
						|
								        if [[ "$UPGRADE" == true ]]; then
							 | 
						|
								            printf "applying %50s ... " $mig
							 | 
						|
								            printf "%d %d" $(sqlFile $MIG_BASE/$mig)
							 | 
						|
								            echo " DONE"
							 | 
						|
								            MIG_FILE=$mig
							 | 
						|
								        else
							 | 
						|
								            printf "useless %50s \n" $mig
							 | 
						|
								            if [[ "$LAST_MIGRATION" == "$mig" ]]; then
							 | 
						|
								                UPGRADE=true
							 | 
						|
								            fi
							 | 
						|
								        fi
							 | 
						|
								    done
							 | 
						|
								
							 | 
						|
								    if [[ $UPGRADE == true && $MIG_FILE != '' ]]; then
							 | 
						|
								        local done=$(sql "INSERT INTO migrations(migration_file, last_run) VALUES ('$mig', NOW())")
							 | 
						|
								        echo "all migrations succeeded, wrote: $mig"
							 | 
						|
								    else
							 | 
						|
								        echo "already up-to-date"
							 | 
						|
								    fi
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								function buildMigrations() {
							 | 
						|
								    if [[ ! -d "$WP_BASE"/wp-content/migrations ]]; then
							 | 
						|
								        mkdir -p "$WP_BASE"/wp-content/migrations
							 | 
						|
								        echo "migrations folder created!"
							 | 
						|
								    fi
							 | 
						|
								
							 | 
						|
								    sql "CREATE TABLE IF NOT EXISTS migrations (id int(11) NOT NULL AUTO_INCREMENT, migration_file varchar(255) COLLATE utf8_unicode_ci NOT NULL, last_run varchar(45) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (id) )"
							 | 
						|
								
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								function playEnvironment() {
							 | 
						|
								
							 | 
						|
								    buildMigrations
							 | 
						|
								
							 | 
						|
								    local PLATFORM=$1
							 | 
						|
								    local PLATFORM_BASE="$WP_BASE/wp-content/migrations/$PLATFORM"
							 | 
						|
								    if [[ -d "$PLATFORM_BASE" ]]; then
							 | 
						|
								        echo play platform $PLATFORM
							 | 
						|
								
							 | 
						|
								        local MIGRATIONS=$(ls -p1 $PLATFORM_BASE | grep -v /)
							 | 
						|
								        for mig in $MIGRATIONS; do
							 | 
						|
								            printf "applying %50s ... " $mig
							 | 
						|
								            printf "%d %d" $(sqlFile $PLATFORM_BASE/$mig)
							 | 
						|
								            echo " DONE"
							 | 
						|
								        done
							 | 
						|
								    fi
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								## MAIN
							 | 
						|
								## ----
							 | 
						|
								
							 | 
						|
								WP_BASE=$(detectWordpress)
							 | 
						|
								WP_CONFIG="$WP_BASE/wp-config.php"
							 | 
						|
								echo "WP_BASE = $WP_BASE"
							 | 
						|
								
							 | 
						|
								WP_HOME=$(getConfigComment WP_HOME)
							 | 
						|
								echo "WP_HOME = $WP_HOME"
							 | 
						|
								
							 | 
						|
								DB_HOST=$(getConfigEntry DB_HOST)
							 | 
						|
								DB_NAME=$(getConfigEntry DB_NAME)
							 | 
						|
								DB_USER=$(getConfigEntry DB_USER)
							 | 
						|
								DB_PASS=$(getConfigEntry DB_PASSWORD)
							 | 
						|
								
							 | 
						|
								CURRENT_HOME=$(sql "SELECT option_value FROM wp_options WHERE option_name = 'home'")
							 | 
						|
								if [[ "$CURRENT_HOME" != "$WP_HOME" ]]; then
							 | 
						|
								    echo "HOME detected = $CURRENT_HOME , needs to apply changes"
							 | 
						|
								    $(changeHome "$CURRENT_HOME" "$WP_HOME")
							 | 
						|
								fi
							 | 
						|
								
							 | 
						|
								if [[ "$WP_HOME" =~ https?:\/\/beta[0-9]*\..*|https?:\/\/.*\.beta[0-9]*\..* ]]; then
							 | 
						|
								    playEnvironment BETA
							 | 
						|
								else
							 | 
						|
								    if [[ "$WP_HOME" =~ https?:\/\/dev[0-9]*\..*|https?:\/\/.*\.dev[0-9]*\..* ]]; then
							 | 
						|
								        playEnvironment DEV
							 | 
						|
								    else
							 | 
						|
								        playEnvironment PROD
							 | 
						|
								    fi
							 | 
						|
								fi
							 | 
						|
								
							 | 
						|
								CURRENT_MIGRATION=$(lastMigration)
							 | 
						|
								upgradeMigration "$CURRENT_MIGRATION"
							 |