2 # Bootstrap a Drupal project
 
   4 # Copyright (C) 2017  Antonio Ospite <ao2@ao2.it>
 
   6 # This program is free software: you can redistribute it and/or modify
 
   7 # it under the terms of the GNU General Public License as published by
 
   8 # the Free Software Foundation, either version 2 of the License, or
 
   9 # (at your option) any later version.
 
  11 # This program is distributed in the hope that it will be useful,
 
  12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 
  13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
  14 # GNU General Public License for more details.
 
  16 # You should have received a copy of the GNU General Public License
 
  17 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
  23 usage: drin $(basename "$0" .sh) [--devel|--overwrite-profile|-h|--help]
 
  25 Bootstrap a Drupal project, using settings from a 'bootstrap.conf' file.
 
  28   --devel              install drupal/devel and use a settings.local.php file
 
  29   --overwrite-profile  allow overwriting the current installation profile
 
  30   -h, --help           display this usage message and exit
 
  46       OVERWRITE_PROFILE="true"
 
  49       echo "Error: Unknown option '${1}'" 1>&2
 
  55 [ -f "bootstrap.conf" ] || { echo "Aborting, run this command from the Drupal project directory." 1>&2; exit 1; }
 
  57 # shellcheck disable=SC1091
 
  64 declare -p ACCOUNT_NAME
 
  65 declare -p ACCOUNT_PASS
 
  66 declare -p ACCOUNT_MAIL
 
  70 declare -p SITE_BASE_PATH
 
  72 declare -p TRUSTED_HOSTS
 
  74 declare -p WEB_SERVER_GROUP
 
  76 [ "x$INSTALLATION_PROFILE" = "x" ] && { echo "INSTALLATION_PROFILE not specified, using the \"standard\" profile!"; INSTALLATION_PROFILE="standard"; }
 
  78 if [ "$MYSQL_PASSWORDLESS_ACCESS" = true ];
 
  80   MYSQL_SU_USER="${USER}"
 
  82   # XXX Deprecate MYSQL_ROOT_PASSWORD, it will be removed eventually,
 
  83   # but for now add some backwards compatibility mapping.
 
  84   if [ "x$MYSQL_ROOT_PASSWORD" != "x" ];
 
  86     echo "WARN: MYSQL_ROOT_PASSWORD is deprecated, use MYSQL_SU_USER and MYSQL_SU_PASSWORD" 1>&2
 
  88     MYSQL_SU_PASSWORD="$MYSQL_ROOT_PASSWORD"
 
  91   if [ "x$MYSQL_SU_USER" = "x" ];
 
  93     echo "Aborting, for password regulated access specify MYSQL_SU_USER in bootstrap.conf" 1>&2
 
  97   if [ "x$MYSQL_SU_PASSWORD" = "x" ];
 
  99     read -r -s -p "MySQL password for \"${MYSQL_SU_USER}\": " MYSQL_SU_PASSWORD
 
 103   DRUSH_DB_SU_CREDENTIALS=(--db-su-pw'='"${MYSQL_SU_PASSWORD}")
 
 106 DRUSH_DB_SU_CREDENTIALS+=(--db-su'='"${MYSQL_SU_USER}")
 
 108 WEB_ROOT="${PWD}/web"
 
 110 command -v composer &> /dev/null || { echo "Aborting, 'composer' not available." 1>&2; exit 1; }
 
 111 command -v git &> /dev/null || { echo "Aborting, 'git' not available." 1>&2; exit 1; }
 
 113 [ -d "$WEB_ROOT" ] || composer install
 
 115 DRUSH="${PWD}/vendor/bin/drush"
 
 116 DRUPAL_CONSOLE="${PWD}/vendor/bin/drupal"
 
 118 [ -x "$DRUSH" ] || { echo "Aborting, '$DRUSH' not available." 1>&2; exit 1; }
 
 119 [ -x "$DRUPAL_CONSOLE" ] || { echo "Aborting, '$DRUPAL_CONSOLE' not available." 1>&2; exit 1; }
 
 121 # This becomes unnecessary if the installation profile gets pulled in by
 
 122 # composer.json, like suggested in
 
 123 # https://github.com/drupal-composer/drupal-project/issues/249
 
 124 if ! echo "$INSTALLATION_PROFILE" | grep -q -E "^(minimal|standard)$";
 
 126   if [ -d "${WEB_ROOT}/profiles/${INSTALLATION_PROFILE}" ] && [ "$OVERWRITE_PROFILE" != "true" ];
 
 128     echo "Installation profile '$INSTALLATION_PROFILE' already there." 1>&2
 
 129     echo "Use --overwrite-profile to copy over it." 1>&2
 
 132     cp -a "$INSTALLATION_PROFILE" "${WEB_ROOT}/profiles"
 
 138 # Update the install_profile if it's already there
 
 139 if grep -q "^\\\$settings\['install_profile'\] =" sites/default/settings.php;
 
 141   chmod 755 sites/default
 
 142   chmod 644 sites/default/settings.php
 
 143   sed -i -e "s/^\(\$settings\['install_profile'\]\) = '[^']*';/\1 = '$INSTALLATION_PROFILE';/g" sites/default/settings.php
 
 144   chmod 444 sites/default/settings.php
 
 145   chmod 555 sites/default
 
 148 $DRUSH --verbose --yes \
 
 150   "${DRUSH_DB_SU_CREDENTIALS[@]}" \
 
 151   --db-url="mysql://${DB_USER}:${DB_PASS}@localhost/${DB_NAME}" \
 
 152   --site-name="$SITE_NAME" \
 
 153   --site-mail="$SITE_MAIL" \
 
 154   --account-name="$ACCOUNT_NAME" \
 
 155   --account-pass="$ACCOUNT_PASS" \
 
 156   --account-mail="$ACCOUNT_MAIL" \
 
 157   "$INSTALLATION_PROFILE"
 
 159 if $DRUSH pm-info --fields=status locale | grep -q enabled;
 
 161   # This is necessary for multi-language sites, it fixes some issues like:
 
 162   #   "The Translation source field needs to be installed."
 
 163   $DRUSH --yes entity-updates
 
 165   # Update translations of contrib modules
 
 166   $DRUSH --yes locale-update
 
 169 # This fixes permissions when installing under $HOME/public_html/
 
 170 chmod 775 sites/default/files
 
 171 sudo chgrp -R "$WEB_SERVER_GROUP" sites/default/files
 
 173 [ -d ../config/sync ] && sudo chgrp -R "$WEB_SERVER_GROUP" ../config/sync
 
 176 sed -i "s@\(# \)\{0,1\}RewriteBase .*\$@RewriteBase ${SITE_BASE_PATH}@" .htaccess
 
 178 chmod 755 sites/default
 
 179 chmod 644 sites/default/settings.php
 
 181 # Add some basic settings to settings.php
 
 182 if ! grep -q "^\\\$settings\['trusted_host_patterns'\] =" sites/default/settings.php;
 
 184   echo "\$settings['trusted_host_patterns'] = [" >> sites/default/settings.php
 
 185   for host in "${TRUSTED_HOSTS[@]}"
 
 187     echo "  '^${host}\$'," >> sites/default/settings.php
 
 189   echo "];" >> sites/default/settings.php
 
 192 if [ "$DEVEL_MODE" = "true" ];
 
 194   # NOTE: don't run composer under web/ but in the project dir
 
 195   composer --working-dir=../ require drupal/devel
 
 196   $DRUSH --yes en devel
 
 198   if [ ! -e sites/default/settings.local.php ];
 
 200     cp sites/example.settings.local.php sites/default/settings.local.php
 
 202     # Disable some overly permissive settings
 
 203     sed -i -e "s/^\(\$settings\['rebuild_access'\]\).*$/\1 = FALSE;/g" sites/default/settings.local.php
 
 204     sed -i -e "s/^\(\$settings\['skip_permissions_hardening'\]\).*$/\1 = FALSE;/g" sites/default/settings.local.php
 
 206     chmod 444 sites/default/settings.local.php
 
 209   if ! grep -q "^include \$app_root . '/' . \$site_path . '/settings.local.php';" sites/default/settings.php;
 
 211     echo "include \$app_root . '/' . \$site_path . '/settings.local.php';" >> sites/default/settings.php
 
 215 chmod 444 sites/default/settings.php
 
 216 chmod 555 sites/default
 
 218 # If using a git checkout of Drupal core, set up a diff alias.
 
 220 # This is useful because the Automated Test infrastructure of drupal.org does
 
 221 # not expect patches to be created from a split core directory.
 
 224   git -C core/ config --local alias.core-diff "diff --src-prefix=a/core/ --dst-prefix=b/core/"
 
 225   echo "Added a 'git core-diff' command to the drupal/core repository clone."
 
 226   echo "This command helps creating core patches ready for upstream."