Skip to content

Instantly share code, notes, and snippets.

@x86demon
Last active June 24, 2024 19:58
Show Gist options
  • Save x86demon/e5d09cd01efca764a189fdbfb8a88662 to your computer and use it in GitHub Desktop.
Save x86demon/e5d09cd01efca764a189fdbfb8a88662 to your computer and use it in GitHub Desktop.
Oro Reinstall script
#!/bin/bash
currentDir=${PWD##*/}
repoDir=$(basename $(dirname $(dirname $(readlink -f .))))
APP_CONSOLE="bin/console"
CONFIG_DIR="config"
CACHE_DIR="var/cache"
APP_NAME="ORO"
ENV=$1
if [[ ! -f ${APP_CONSOLE} ]]
then
echo "Please, run in application folder"
exit
fi
CURRENT_GIT_BRANCH=$(git branch --show-current)
COMPOSER_BIN="composer"
XDEBUG_INI=$(php --ini | egrep -o '\/[A-Za-z0-9|\/|\.|-]+/xdebug.ini')
XDEBUG_INI_BAK="${XDEBUG_INI}.bak"
rm .php8*
if [[ -f .php-version ]]
then
PHP_VERSION=$(<.php-version)
touch ".php${PHP_VERSION}"
fi
IS_MONOLITIC=1
APP_HOST=$currentDir.$repoDir.loc
if [[ ${currentDir} == *".local"* ]]
then
APP_HOST=$currentDir
IS_MONOLITIC=0
fi
ADDITIONAL_ARGS="--language=en --formatting-code=en_US"
if [[ $3 ]]
then
ADDITIONAL_ARGS="${ADDITIONAL_ARGS} --skip-assets --skip-translations"
fi
PARAMETERS_FILE="./${CONFIG_DIR}/parameters.yml"
if [[ ${ENV} == "test" ]]
then
PARAMETERS_FILE="./${CONFIG_DIR}/parameters_test.yml"
fi
function parse_yaml {
local prefix=$2
local s='[[:space:]]*' w='[a-zA-Z0-9_]*' fs=$(echo @|tr @ '\034')
sed -ne "s|^\($s\):|\1|" \
-e "s|^\($s\)\($w\)$s:$s[\"']\(.*\)[\"']$s\$|\1$fs\2$fs\3|p" \
-e "s|^\($s\)\($w\)$s:$s\(.*\)$s\$|\1$fs\2$fs\3|p" $1 |
awk -F$fs '{
indent = length($1)/2;
vname[indent] = $2;
for (i in vname) {if (i > indent) {delete vname[i]}}
if (length($3) > 0) {
vn=""; for (i=0; i<indent; i++) {vn=(vn)(vname[i])("_")}
printf("%s%s%s=\"%s\"\n", "'$prefix'",vn, $2, $3);
}
}'
}
function load_config {
local env_file='.env-app.local'
if [[ ${ENV} == "test" ]]
then
env_file='.env-app.test.local'
fi
if [[ -f ".env-app" ]]
then
mv ${PARAMETERS_FILE} ${PARAMETERS_FILE}.bak
cp ${PARAMETERS_FILE}.dist ${PARAMETERS_FILE}
source ${env_file}
# Based on https://stackoverflow.com/questions/6174220/parse-url-in-shell-script
local proto="`echo ${ORO_DB_URL} | grep '://' | sed -e's,^\(.*://\).*,\1,g'`"
local url=`echo ${ORO_DB_URL} | sed -e s,$proto,,g`
local userpass="`echo $url | grep '@' | cut -d@ -f1`"
local pass=`echo $userpass | grep ':' | cut -d: -f2`
if [ -n "$pass" ]; then
local user=`echo $userpass | grep ':' | cut -d: -f1`
else
local user=$userpass
fi
# extract the host -- updated
local hostport=`echo $url | sed -e s,$userpass@,,g | cut -d/ -f1`
local port=`echo $hostport | grep ':' | cut -d: -f2`
if [ -n "$port" ]; then
local host=`echo $hostport | grep ':' | cut -d: -f1`
else
local host=$hostport
fi
# extract the path (if any)
local pathquery="`echo $url | grep '/' | cut -d/ -f2-`"
local query=`echo $pathquery | grep '?' | cut -d? -f2`
if [ -n "$query" ]; then
local path=`echo $pathquery | grep '?' | cut -d? -f1`
else
local path=pathquery
fi
if [[ ${proto} == "postgres://" ]]
then
DB_DRIVER="pdo_pgsql"
fi
DB_USER=${user}
DB_PASS=${pass}
DB_NAME=${path}
DB_HOST=${host}
DB_PORT=${port}
else
if [[ -f ${PARAMETERS_FILE}.bak ]]
then
mv ${PARAMETERS_FILE}.bak ${PARAMETERS_FILE}
fi
eval $(parse_yaml ${PARAMETERS_FILE} "CONF_")
DB_DRIVER=${CONF_parameters__database_driver}
DB_HOST=${CONF_parameters__database_host}
DB_PORT=${CONF_parameters__database_port}
DB_NAME=${CONF_parameters__database_name}
DB_USER=${CONF_parameters__database_user}
DB_PASS=${CONF_parameters__database_password}
fi
if [[ ${DB_PORT} != 'null' && 'X'${DB_HOST} != 'X' ]]
then
DB_HOST="-h ${DB_HOST}"
else
DB_HOST='-h localhost'
fi
if [[ ${DB_PORT} != 'null' && 'X'${DB_PORT} != 'X' ]]
then
DB_PORT="-p ${DB_PORT}"
else
DB_PORT=''
fi
}
sudo rm -rf var/sessions
sudo rm var/logs/*.log
sudo chown $USER:nginx -R `pwd`;sudo chmod g+rwX -R `pwd`
sudo rm -rf ${CACHE_DIR}/prod
if [[ -f $XDEBUG_INI ]]
then
echo "Disabling XDebug extension"
sudo mv $XDEBUG_INI $XDEBUG_INI_BAK
fi
COMPOSER_FILE=composer
if [[ ${IS_MONOLITIC} -eq 1 && -f dev.json ]]
then
COMPOSER_FILE=dev
fi
if [ -d "vendor" ] && md5sum --status -c ${COMPOSER_FILE}.lock.md5 >/dev/null 2>&1; then
echo "Composer dependencies are fresh"
else
if [[ ${IS_MONOLITIC} -eq 1 ]]
then
echo "Installing composer dependencies"
rm -rf ./vendor/
ORO_ENV=dev COMPOSER=${COMPOSER_FILE}.json ${COMPOSER_BIN} install -o --ignore-platform-reqs --ignore-platform-req=ext-mongodb
fi
md5sum ${COMPOSER_FILE}.lock > ${COMPOSER_FILE}.lock.md5
fi
if [[ ${ENV} == "composer" ]]
then
exit
fi
load_config
echo "Recreating DB ${DB_DRIVER} ${DB_NAME}"
if [[ ${DB_DRIVER} == "pdo_pgsql" ]]
then
echo "Creating PostgreSQL database ${DB_NAME}"
echo "Drop DB connections"
PGPASSWORD=${DB_PASS} psql -U ${DB_USER} ${DB_HOST} ${DB_PORT} -c "SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = '${DB_NAME}' AND pid <> pg_backend_pid();"
echo "Drop DB"
PGPASSWORD=${DB_PASS} dropdb -U ${DB_USER} ${DB_HOST} ${DB_PORT} ${DB_NAME}
echo "Create DB"
PGPASSWORD=${DB_PASS} createdb -U ${DB_USER} ${DB_HOST} ${DB_PORT} ${DB_NAME}
echo "Add extension"
PGPASSWORD=${DB_PASS} psql -U ${DB_USER} ${DB_HOST} ${DB_PORT} -c 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp";' -d ${DB_NAME};
else
echo "Creating MySQL database ${DB_NAME}"
mysqladmin --user=${DB_USER} --password=${DB_PASS} --force drop ${DB_NAME}
mysqladmin --user=${DB_USER} --password=${DB_PASS} --force create ${DB_NAME}
fi
echo "Dropping caches"
if [[ ${ENV} == "test" ]]
then
rm -rf ${CACHE_DIR}/test
echo "Reinstalling TEST"
sed -i "s/installed"\:".*/installed"\:" ~/g" ${CONFIG_DIR}/parameters_test.yml
$APP_CONSOLE oro:install -v --env=test --timeout=9999999
else
rm -rf ${CACHE_DIR}/dev
echo "Reinstalling APP for http://$APP_HOST"
sed -i "s/installed"\:".*/installed"\:" ~/g" ${CONFIG_DIR}/parameters.yml
echo $APP_CONSOLE oro:install --skip-download-translations --env=prod -vvv --organization-name="$APP_NAME" --user-name=admin --user-email=admin@example.com --user-firstname=John --user-lastname=Doe --user-password=admin --application-url="http://$APP_HOST" --sample-data=$2 --timeout=999999 --drop-database --language=en --formatting-code=en_US ${ADDITIONAL_ARGS}
$APP_CONSOLE oro:install --env=prod --skip-download-translations -vvv --organization-name="$APP_NAME" --user-name=admin --user-email=admin@example.com --user-firstname=John --user-lastname=Doe --user-password=admin --application-url="http://$APP_HOST" --sample-data=$2 --timeout=999999 --drop-database ${ADDITIONAL_ARGS}
fi
sudo chown $USER:nginx -R `pwd`;sudo chmod g+rwX -R `pwd`
if [[ "`ping -c 1 ${APP_HOST}`" ]]
then
echo "Host is configured correctly"
else
echo "Adding ${APP_HOST} to hosts"
sudo -- sh -c -e "echo '127.0.0.1 ${APP_HOST}' >> /etc/hosts";
fi
if [[ -f $XDEBUG_INI_BAK ]]
then
echo "Reverting XDebug extension"
sudo mv $XDEBUG_INI_BAK $XDEBUG_INI
fi
rm var/log/*.log
echo "Installed application http://${APP_HOST}/index_dev.php"
@x86demon
Copy link
Author

x86demon commented Aug 19, 2016

HowTo
Script should be executed from application folder where app/console is accessible
Usage
Reinstall dev env with sample data
oro_reinstall dev y

Reinstall dev env without sample data
oro_reinstall dev n

Reinstall test env
oro_reinstall test

Supported directory structures to get host name update automatically:
/var/www/project/oro-mono/<project_dir> for <app_name>.<project_dir>.loc hosts (monolithic repo)
/var/www/project/oro-dev/<project_dir>.local for <project_dir>.local hosts (service projects, public repo)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment