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|-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 # shellcheck disable=SC1091
62 declare -p ACCOUNT_NAME
63 declare -p ACCOUNT_PASS
64 declare -p ACCOUNT_MAIL
68 declare -p SITE_BASE_PATH
70 declare -p TRUSTED_HOSTS
72 declare -p WEB_SERVER_GROUP
74 [ "x$INSTALLATION_PROFILE" = "x" ] && { echo "INSTALLATION_PROFILE not specified, using the \"standard\" profile!"; INSTALLATION_PROFILE="standard"; }
76 if [ "x$MYSQL_ROOT_PASSWORD" = "x" ];
78 read -r -s -p "MySQL root password: " MYSQL_ROOT_PASSWORD
82 SITE_LOCAL_PATH="${PWD}/web"
84 command -v composer &> /dev/null || { echo "Aborting, 'composer' not available." 1>&2; exit 1; }
85 command -v git &> /dev/null || { echo "Aborting, 'git' not available." 1>&2; exit 1; }
87 [ -d "$SITE_LOCAL_PATH" ] || composer install
89 DRUSH="${PWD}/vendor/bin/drush"
90 DRUPAL_CONSOLE="${PWD}/vendor/bin/drupal"
92 [ -x "$DRUSH" ] || { echo "Aborting, '$DRUSH' not available." 1>&2; exit 1; }
93 [ -x "$DRUPAL_CONSOLE" ] || { echo "Aborting, '$DRUPAL_CONSOLE' not available." 1>&2; exit 1; }
95 # This becomes unnecessary if the installation profile gets pulled in by
96 # composer.json, like suggested in
97 # https://github.com/drupal-composer/drupal-project/issues/249
98 if ! echo "$INSTALLATION_PROFILE" | egrep -q "^(minimal|standard)$";
100 if [ -d "${SITE_LOCAL_PATH}/profiles/${INSTALLATION_PROFILE}" -a "$OVERWRITE_PROFILE" != "true" ];
102 echo "Installation profile '$INSTALLATION_PROFILE' already there." 1>&2
103 echo "Use --overwrite-profile to copy over it." 1>&2
106 cp -a "$INSTALLATION_PROFILE" "${SITE_LOCAL_PATH}/profiles"
110 pushd "$SITE_LOCAL_PATH"
112 # Update the install_profile if it's already there
113 if grep -q "^\\\$settings\['install_profile'\] =" sites/default/settings.php;
115 chmod 755 sites/default
116 chmod 644 sites/default/settings.php
117 sed -i -e "s/^\(\$settings\['install_profile'\]\) = '[^']*';/\1 = '$INSTALLATION_PROFILE';/g" sites/default/settings.php
118 chmod 444 sites/default/settings.php
119 chmod 555 sites/default
122 $DRUSH --verbose --yes \
125 --db-su-pw="$MYSQL_ROOT_PASSWORD" \
126 --db-url="mysql://${DB_USER}:${DB_PASS}@localhost/${DB_NAME}" \
127 --site-name="$SITE_NAME" \
128 --site-mail="$SITE_MAIL" \
129 --account-name="$ACCOUNT_NAME" \
130 --account-pass="$ACCOUNT_PASS" \
131 --account-mail="$ACCOUNT_MAIL" \
132 "$INSTALLATION_PROFILE"
134 if $DRUSH pm-info --fields=status locale | grep -q enabled;
136 # This is necessary for multi-language sites, it fixes some issues like:
137 # "The Translation source field needs to be installed."
138 $DRUSH --yes entity-updates
140 # Update translations of contrib modules
141 $DRUSH --yes locale-update
144 # This fixes permissions when installing under $HOME/public_html/
145 chmod 775 sites/default/files
146 sudo chgrp -R "$WEB_SERVER_GROUP" sites/default/files
148 [ -d ../config/sync ] && sudo chgrp -R "$WEB_SERVER_GROUP" ../config/sync
151 sed -i "s@# RewriteBase /drupal\$@RewriteBase ${SITE_BASE_PATH}@" .htaccess
153 chmod 755 sites/default
154 chmod 644 sites/default/settings.php
156 # Add some basic settings to settings.php
157 if ! grep -q "^\\\$settings\['trusted_host_patterns'\] =" sites/default/settings.php;
159 echo "\$settings['trusted_host_patterns'] = [" >> sites/default/settings.php
160 for host in "${TRUSTED_HOSTS[@]}"
162 echo " '^${host}\$'," >> sites/default/settings.php
164 echo "];" >> sites/default/settings.php
167 if [ "$DEVEL_MODE" = "true" ];
169 # NOTE: don't run composer under web/ but in the project dir
170 composer --working-dir=../ require drupal/devel
171 $DRUSH --yes en devel
173 if [ ! -e sites/default/settings.local.php ];
175 cp sites/example.settings.local.php sites/default/settings.local.php
177 # Disable some overly permissive settings
178 sed -i -e "s/^\(\$settings\['rebuild_access'\]\).*$/\1 = FALSE;/g" sites/default/settings.local.php
179 sed -i -e "s/^\(\$settings\['skip_permissions_hardening'\]\).*$/\1 = FALSE;/g" sites/default/settings.local.php
181 chmod 444 sites/default/settings.local.php
184 if ! grep -q "^include \$app_root . '/' . \$site_path . '/settings.local.php';" sites/default/settings.php;
186 echo "include \$app_root . '/' . \$site_path . '/settings.local.php';" >> sites/default/settings.php
190 chmod 444 sites/default/settings.php
191 chmod 555 sites/default
193 # If using a git checkout of Drupal core, set up a diff alias.
195 # This is useful because the Automated Test infrastructure of drupal.org does
196 # not expect patches to be created from a split core directory.
199 git -C core/ config --local alias.core-diff "diff --src-prefix=a/core/ --dst-prefix=b/core/"
200 echo "Added a 'git core-diff' to the drupal/core repository clone."
201 echo "This command helps creating core patches ready for upstream."