#!/bin/bash
set -eux
touch ./var/projectSetupLog
function addLogMessage {
echo -e "\n>>>>>>>>>>>> $1 <<<<<<<<<<<<\n"
echo "[$(date)] $1" >> ./var/projectSetupLog
}
function parseUserIsset {
USER_ISSET=$(
php bin/console doctrine:query:sql "$1" \
| awk -F "string '" '{print $2}' \
| awk -F "' \(length=" '{print $1}' \
| tr -d '[:space:]'
)
}
# Если проект не установлен, то устанавливаем его
if [[ ! -f ./var/projectIsInstalled ]]; then
addLogMessage "Начало установки проекта..."
RANDOM_STRING=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)
addLogMessage 'Генерация ключей авторизации...'
openssl genrsa -out ./config/jwt/private.pem -aes256 -passout pass:${RANDOM_STRING} 4096
openssl rsa -pubout -in ./config/jwt/private.pem -out ./config/jwt/public.pem -passin pass:${RANDOM_STRING}
chmod 644 ./config/jwt/private.pem
cp ./phpunit.xml.dist ./phpunit.xml
addLogMessage 'Создание и наполнение переменных окружений в проект...'
env | sort
# Application
cp ./.env ./.env.local && chmod 777 ./.env.local
sed -i "s/^APP_SECRET=/APP_SECRET=${RANDOM_STRING}/" ./.env.local
sed -i "s/^JWT_PASSPHRASE=/JWT_PASSPHRASE=${RANDOM_STRING}/" ./.env.local
sed -i "s/^LOCALE=/LOCALE=ru_Ru/" ./.env.local
sed -i "s/^WORKSPACE_IP=/WORKSPACE_IP=ibs-mysql/" ./.env.local
sed -i "s/^MYSQL_HOST=/MYSQL_HOST=ibs-mysql/" ./.env.local
sed -i "s/^MYSQL_PORT=/MYSQL_PORT=3306/" ./.env.local
sed -i "s/^MYSQL_ROOT_PASSWORD=/MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}/" ./.env.local
sed -i "s/^MYSQL_DATABASE=/MYSQL_DATABASE=${MYSQL_DATABASE}/" ./.env.local
sed -i "s/^MYSQL_USER=/MYSQL_USER=${MYSQL_USER}/" ./.env.local
sed -i "s/^MYSQL_PASSWORD=/MYSQL_PASSWORD=${MYSQL_PASSWORD}/" ./.env.local
sed -i "s/^NGINX_HOST_HTTP_PORT=/NGINX_HOST_HTTP_PORT=${NGINX_HOST_HTTP_PORT}/" ./.env.local
sed -i "s/^NGINX_HOST_HTTPS_PORT=/NGINX_HOST_HTTPS_PORT=${NGINX_HOST_HTTPS_PORT}/" ./.env.local
source ./.env.local
# Tests
cp ./.env.test ./.env.test.local && chmod 777 ./.env.test.local
sed -i "s/^APP_SECRET=/APP_SECRET=${RANDOM_STRING}/" ./.env.test.local
sed -i "s/^JWT_PASSPHRASE=/JWT_PASSPHRASE=${RANDOM_STRING}/" ./.env.test.local
sed -i "s/^LOCALE=/LOCALE=ru_Ru/" ./.env.test.local
sed -i "s/^WORKSPACE_IP=/WORKSPACE_IP=ibs-mysql/" ./.env.test.local
sed -i "s/^MYSQL_HOST=/MYSQL_HOST=ibs-mysql/" ./.env.test.local
sed -i "s/^MYSQL_PORT=/MYSQL_PORT=3306/" ./.env.test.local
sed -i "s/^MYSQL_ROOT_PASSWORD=/MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}-test/" ./.env.test.local
sed -i "s/^MYSQL_DATABASE=/MYSQL_DATABASE=${MYSQL_DATABASE}-test/" ./.env.test.local
sed -i "s/^MYSQL_USER=/MYSQL_USER=${MYSQL_USER}-test/" ./.env.test.local
sed -i "s/^MYSQL_PASSWORD=/MYSQL_PASSWORD=${MYSQL_PASSWORD}-test/" ./.env.test.local
sed -i "s/^NGINX_HOST_HTTP_PORT=/NGINX_HOST_HTTP_PORT=${NGINX_HOST_HTTP_PORT}-test/" ./.env.test.local
sed -i "s/^NGINX_HOST_HTTPS_PORT=/NGINX_HOST_HTTPS_PORT=${NGINX_HOST_HTTPS_PORT}-test/" ./.env.test.local
# Заменяем переменные на значения в конфигурациях (названия и их значения берем из env)
addLogMessage 'Заменяем переменные на значения в конфигурациях (названия и их значения берем из env)...'
addLogMessage "/usr/local/etc/php/conf.d/xdebug.ini OLD ==> $(grep remote_host /usr/local/etc/php/conf.d/xdebug.ini)"
IFS=$'\n'
for ENV_VARIABLE in $(env | grep IBS)
do
ENV_VARIABLE_NAME=$(echo ${ENV_VARIABLE} | cut -f1 -d=)
ENV_VARIABLE_VALUE=$(echo ${ENV_VARIABLE} | cut -f2 -d=)
sed -i "s/\${${ENV_VARIABLE_NAME}}/${ENV_VARIABLE_VALUE}/g" /usr/local/etc/php/conf.d/xdebug.ini
done
addLogMessage "/usr/local/etc/php/conf.d/xdebug.ini NEW ==> $(grep remote_host /usr/local/etc/php/conf.d/xdebug.ini)"
addLogMessage 'Подтягиваем composer зависимости...'
composer install -n
addLogMessage 'Обновление таблиц в БД по схемам сущностей...'
php ./bin/console doctrine:schema:update --force
addLogMessage 'Создаем пользователей...'
### super-admin ###
# TODO: Попробовать научить доктринку форматировать вывод не в стиле php var_dump()
parseUserIsset "SELECT COUNT(username) FROM user WHERE username = 'super-admin'"
if [[ ${USER_ISSET} == 0 ]]; then
php bin/console fos:user:create super-admin super-admin@example.com super-admin-password --super-admin
addLogMessage 'Пользователь admin:admin-password с ролью ROLE_SUPER_ADMIN успешно создан.'
else
addLogMessage 'Пользователь admin:admin-password с ролью ROLE_SUPER_ADMIN уже существует.'
fi
### admin ###
parseUserIsset "SELECT COUNT(username) FROM user WHERE username = 'admin'"
if [[ ${USER_ISSET} == 0 ]]; then
php bin/console fos:user:create admin admin@example.com admin-password
php ./bin/console fos:user:promote admin ROLE_ADMIN
addLogMessage 'Пользователь admin:admin-password с ролью ROLE_ADMIN успешно создан.'
else
addLogMessage 'Пользователь admin:admin-password с ролью ROLE_ADMIN уже существует.'
fi
### test ###
parseUserIsset "SELECT COUNT(username) FROM user WHERE username = 'test'"
if [[ ${USER_ISSET} == 0 ]]; then
php bin/console fos:user:create test test@example.com test-password
addLogMessage 'Пользователь test:test-password успешно создан, активированный, но не имеет ни одной роли.'
else
addLogMessage 'Пользователь test:test-password уже существует, активированный, но не имеет ни одной роли.'
fi
### inactive-user ###
parseUserIsset "SELECT COUNT(username) FROM user WHERE username = 'inactive-user'"
if [[ ${USER_ISSET} == 0 ]]; then
php bin/console fos:user:create inactive-user inactive-user@example.com inactive-user-password --inactive
addLogMessage 'Пользователь inactive-user:inactive-user-password успешно создан, не активирован и не имеет ни одной роли.'
else
addLogMessage 'Пользователь inactive-user:inactive-user-password уже существует, не активирован и не имеет ни одной роли.'
fi
touch ./var/projectIsInstalled && chmod 777 ./var/projectIsInstalled
echo "[$(date)] The project has been successfully installed!" > ./var/projectIsInstalled
fi
addLogMessage 'Запускаем php-fpm...'
exec "${@}"