X-Git-Url: https://git.ao2.it/drupal-init-tools.git/blobdiff_plain/9d19d72cfc995a307d7168732c16788aa1428184..HEAD:/libexec/bootstrap.sh diff --git a/libexec/bootstrap.sh b/libexec/bootstrap.sh index ff69fb0..b599825 100755 --- a/libexec/bootstrap.sh +++ b/libexec/bootstrap.sh @@ -20,13 +20,15 @@ set -e usage() { cat <&2 ;; @@ -48,6 +53,9 @@ do shift done +[ -f "bootstrap.conf" ] || { echo "Aborting, run this command from the Drupal project directory." 1>&2; exit 1; } + +# shellcheck disable=SC1091 . bootstrap.conf declare -p DB_NAME @@ -68,18 +76,42 @@ declare -p WEB_SERVER_GROUP [ "x$INSTALLATION_PROFILE" = "x" ] && { echo "INSTALLATION_PROFILE not specified, using the \"standard\" profile!"; INSTALLATION_PROFILE="standard"; } -if [ "x$MYSQL_ROOT_PASSWORD" = "x" ]; +if [ "$MYSQL_PASSWORDLESS_ACCESS" = true ]; then - read -s -p "MySQL root password: " MYSQL_ROOT_PASSWORD - echo + MYSQL_SU_USER="${USER}" +else + # XXX Deprecate MYSQL_ROOT_PASSWORD, it will be removed eventually, + # but for now add some backwards compatibility mapping. + if [ "x$MYSQL_ROOT_PASSWORD" != "x" ]; + then + echo "WARN: MYSQL_ROOT_PASSWORD is deprecated, use MYSQL_SU_USER and MYSQL_SU_PASSWORD" 1>&2 + MYSQL_SU_USER="root" + MYSQL_SU_PASSWORD="$MYSQL_ROOT_PASSWORD" + fi + + if [ "x$MYSQL_SU_USER" = "x" ]; + then + echo "Aborting, for password regulated access specify MYSQL_SU_USER in bootstrap.conf" 1>&2 + exit 1 + fi + + if [ "x$MYSQL_SU_PASSWORD" = "x" ]; + then + read -r -s -p "MySQL password for \"${MYSQL_SU_USER}\": " MYSQL_SU_PASSWORD + echo + fi + + DRUSH_DB_SU_CREDENTIALS=(--db-su-pw'='"${MYSQL_SU_PASSWORD}") fi -SITE_LOCAL_PATH="${PWD}/web" +DRUSH_DB_SU_CREDENTIALS+=(--db-su'='"${MYSQL_SU_USER}") + +WEB_ROOT="${PWD}/web" command -v composer &> /dev/null || { echo "Aborting, 'composer' not available." 1>&2; exit 1; } command -v git &> /dev/null || { echo "Aborting, 'git' not available." 1>&2; exit 1; } -[ -d "$SITE_LOCAL_PATH" ] || composer install +[ -d "$WEB_ROOT" ] || composer install DRUSH="${PWD}/vendor/bin/drush" DRUPAL_CONSOLE="${PWD}/vendor/bin/drupal" @@ -87,34 +119,65 @@ DRUPAL_CONSOLE="${PWD}/vendor/bin/drupal" [ -x "$DRUSH" ] || { echo "Aborting, '$DRUSH' not available." 1>&2; exit 1; } [ -x "$DRUPAL_CONSOLE" ] || { echo "Aborting, '$DRUPAL_CONSOLE' not available." 1>&2; exit 1; } -# This becomes unnecessary if the installation profile gets pulled in by -# composer.json, like suggested in +# The following becomes unnecessary if the installation profile gets pulled in +# by composer.json, like suggested in # https://github.com/drupal-composer/drupal-project/issues/249 -if ! echo $INSTALLATION_PROFILE | egrep -q "^(minimal|standard)$"; +if ! echo "$INSTALLATION_PROFILE" | grep -q -E "^(minimal|standard)$"; then - if [ -d $SITE_LOCAL_PATH/profiles/$INSTALLATION_PROFILE ]; + if [ -d "${WEB_ROOT}/profiles/${INSTALLATION_PROFILE}" ] && [ "$OVERWRITE_PROFILE" != "true" ]; then - echo "Installation profile '$INSTALLATION_PROFILE' already there." + echo "Installation profile '$INSTALLATION_PROFILE' already there." 1>&2 + echo "Use --overwrite-profile to copy over it." 1>&2 + exit 1 else - cp -a $INSTALLATION_PROFILE $SITE_LOCAL_PATH/profiles + if [ -d "$INSTALLATION_PROFILE" ]; + then + cp -a "$INSTALLATION_PROFILE" "${WEB_ROOT}/profiles" + else + echo "Local installation profile '$INSTALLATION_PROFILE' not found." 1>&2 + echo "Cannot honour the --overwrite-profile option." 1>&2 + fi fi fi -pushd "$SITE_LOCAL_PATH" +# Make sure that drush knows what the actual base URI is, this is needed to +# have a consistent behavior between the cli and the web interface, for +# example in the case of modules that use base_path(). +if grep -q "^[[:space:]]*uri:" drush/drush.yml; +then + sed -i -e "s@^\([[:space:]]*\)uri: .*@\1uri: 'http://localhost/${SITE_BASE_PATH}'@g" drush/drush.yml +else + echo "" >> drush/drush.yml + echo "options:" >> drush/drush.yml + echo " uri: 'http://localhost/${SITE_BASE_PATH}'" >> drush/drush.yml +fi + +pushd "$WEB_ROOT" > /dev/null +# Update the install_profile setting if it's already there +if grep -q "^\\\$settings\['install_profile'\] =" sites/default/settings.php; +then + chmod 755 sites/default + chmod 644 sites/default/settings.php + sed -i -e "s/^\(\$settings\['install_profile'\]\) = '[^']*';/\1 = '$INSTALLATION_PROFILE';/g" sites/default/settings.php + chmod 444 sites/default/settings.php + chmod 555 sites/default +fi + +# Install the site $DRUSH --verbose --yes \ site-install \ - --db-su=root \ - --db-su-pw="$MYSQL_ROOT_PASSWORD" \ + "${DRUSH_DB_SU_CREDENTIALS[@]}" \ --db-url="mysql://${DB_USER}:${DB_PASS}@localhost/${DB_NAME}" \ --site-name="$SITE_NAME" \ --site-mail="$SITE_MAIL" \ + --sites-subdir="default" \ --account-name="$ACCOUNT_NAME" \ --account-pass="$ACCOUNT_PASS" \ --account-mail="$ACCOUNT_MAIL" \ "$INSTALLATION_PROFILE" -if $DRUSH pm-info --fields=status locale | grep -q enabled; +if $DRUSH pm-list --type=module --field=name --status=enabled --pipe | grep -q "^locale$"; then # This is necessary for multi-language sites, it fixes some issues like: # "The Translation source field needs to be installed." @@ -130,18 +193,12 @@ sudo chgrp -R "$WEB_SERVER_GROUP" sites/default/files [ -d ../config/sync ] && sudo chgrp -R "$WEB_SERVER_GROUP" ../config/sync -# Enables clean URLs -sed -i "s@# RewriteBase /drupal\$@RewriteBase ${SITE_BASE_PATH}@" .htaccess +# Don't force RewriteBase it is not generally needed +#sed -i "s@RewriteBase /drupal\$@RewriteBase ${SITE_BASE_PATH}@" .htaccess chmod 755 sites/default chmod 644 sites/default/settings.php -# Update the install_profile if it's already there -if grep -q "^\\\$settings\['install_profile'\] =" sites/default/settings.php; -then - sed -i -e "s/^\(\$settings\['install_profile'\]\) = '[^']*';/\1 = '$INSTALLATION_PROFILE';/g" sites/default/settings.php -fi - # Add some basic settings to settings.php if ! grep -q "^\\\$settings\['trusted_host_patterns'\] =" sites/default/settings.php; then @@ -159,8 +216,16 @@ then composer --working-dir=../ require drupal/devel $DRUSH --yes en devel - cp sites/example.settings.local.php sites/default/settings.local.php - chmod 444 sites/default/settings.local.php + if [ ! -e sites/default/settings.local.php ]; + then + cp sites/example.settings.local.php sites/default/settings.local.php + + # Disable some overly permissive settings + sed -i -e "s/^\(\$settings\['rebuild_access'\]\).*$/\1 = FALSE;/g" sites/default/settings.local.php + sed -i -e "s/^\(\$settings\['skip_permissions_hardening'\]\).*$/\1 = FALSE;/g" sites/default/settings.local.php + + chmod 444 sites/default/settings.local.php + fi if ! grep -q "^include \$app_root . '/' . \$site_path . '/settings.local.php';" sites/default/settings.php; then @@ -178,8 +243,10 @@ chmod 555 sites/default if [ -d core/.git ]; then git -C core/ config --local alias.core-diff "diff --src-prefix=a/core/ --dst-prefix=b/core/" - echo "Added a 'git core-diff' to the drupal/core repository clone." - echo "This command helps creating core patches ready for upstream." + git -C core/ config --local alias.core-format-patch "format-patch --src-prefix=a/core/ --dst-prefix=b/core/" + echo "Added 'git core-diff' and 'git core-format-patch' commands to the drupal/core" + echo "repository clone. These commands help creating core patches ready for upstream" + echo "in a split-core setup." fi -popd +popd > /dev/null