3b52f269824b9fdd08472dc51820f16940562d4f
[drupal-init-tools.git] / libexec / bootstrap.sh
1 #!/bin/bash
2 # Bootstrap a Drupal project
3 #
4 # Copyright (C) 2017  Antonio Ospite <ao2@ao2.it>
5 #
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.
10 #
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.
15 #
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/>.
18
19 set -e
20
21 usage() {
22   cat <<EOF
23 usage: drin $(basename $0 .sh) [--devel|-h|--help]
24
25 Bootstrap a Drupal project, using settings from a 'bootstrap.conf' file.
26
27 Options:
28   --devel             install drupal/devel and use a settings.local.php file
29   -h, --help          display this usage message and exit
30
31 EOF
32 }
33
34 while [ $# -gt 0 ];
35 do
36   case "$1" in
37     -h|--help)
38       usage
39       exit 0
40       ;;
41     --devel)
42       DEVEL_MODE="true"
43       ;;
44     -*)
45       echo "Error: Unknown option '${1}'" 1>&2
46       ;;
47   esac
48   shift
49 done
50
51 . bootstrap.conf
52
53 declare -p DB_NAME
54 declare -p DB_USER
55 declare -p DB_PASS
56
57 declare -p ACCOUNT_NAME
58 declare -p ACCOUNT_PASS
59 declare -p ACCOUNT_MAIL
60
61 declare -p SITE_NAME
62 declare -p SITE_MAIL
63 declare -p SITE_BASE_PATH
64
65 declare -p TRUSTED_HOSTS
66
67 declare -p WEB_SERVER_GROUP
68
69 [ "x$INSTALLATION_PROFILE" = "x" ] && { echo "INSTALLATION_PROFILE not specified, using the \"standard\" profile!"; INSTALLATION_PROFILE="standard"; }
70
71 if [ "x$MYSQL_ROOT_PASSWORD" = "x" ];
72 then
73   read -s -p "MySQL root password: " MYSQL_ROOT_PASSWORD
74   echo
75 fi
76
77 SITE_LOCAL_PATH="${PWD}/web"
78
79 command -v composer &> /dev/null || { echo "Aborting, 'composer' not available." 1>&2; exit 1; }
80 command -v git &> /dev/null || { echo "Aborting, 'git' not available." 1>&2; exit 1; }
81
82 [ -d "$SITE_LOCAL_PATH" ] || composer install
83
84 # TODO check if the commands are available
85 DRUSH="${PWD}/vendor/bin/drush"
86 DRUPAL_CONSOLE="${PWD}/vendor/bin/drupal"
87
88 [ -x "$DRUSH" ] || { echo "Aborting, '$DRUSH' not available." 1>&2; exit 1; }
89 [ -x "$DRUPAL_CONSOLE" ] || { echo "Aborting, '$DRUPAL_CONSOLE' not available." 1>&2; exit 1; }
90
91 # This becomes unnecessary if the installation profile gets pulled in by
92 # composer.json, like suggested in
93 # https://github.com/drupal-composer/drupal-project/issues/249
94 if ! echo $INSTALLATION_PROFILE | egrep -q "^(minimal|standard)$";
95 then
96   if [ -d $SITE_LOCAL_PATH/profiles/$INSTALLATION_PROFILE ];
97   then
98     echo "Installation profile '$INSTALLATION_PROFILE' already there."
99   else
100     cp -a $INSTALLATION_PROFILE $SITE_LOCAL_PATH/profiles
101   fi
102 fi
103
104 pushd "$SITE_LOCAL_PATH"
105
106 $DRUSH --verbose --yes \
107   site-install \
108   --db-su=root \
109   --db-su-pw="$MYSQL_ROOT_PASSWORD" \
110   --db-url="mysql://${DB_USER}:${DB_PASS}@localhost/${DB_NAME}" \
111   --site-name="$SITE_NAME" \
112   --site-mail="$SITE_MAIL" \
113   --account-name="$ACCOUNT_NAME" \
114   --account-pass="$ACCOUNT_PASS" \
115   --account-mail="$ACCOUNT_MAIL" \
116   "$INSTALLATION_PROFILE"
117
118 if $DRUSH pm-info --fields=status locale | grep -q enabled;
119 then
120   # This is necessary for multi-language sites, it fixes some issues like:
121   #   "The Translation source field needs to be installed."
122   $DRUSH --yes entity-updates
123
124   # Update translations of contrib modules
125   $DRUSH --yes locale-update
126 fi
127
128 # This fixes permissions when installing under $HOME/public_html/
129 chmod 775 sites/default/files
130 sudo chgrp -R "$WEB_SERVER_GROUP" sites/default/files
131
132 [ -d ../config/sync ] && sudo chgrp -R "$WEB_SERVER_GROUP" ../config/sync
133
134 # Enables clean URLs
135 sed -i "s@# RewriteBase /drupal\$@RewriteBase ${SITE_BASE_PATH}@" .htaccess
136
137 chmod 644 sites/default/settings.php
138
139 # Add some basic settings to settings.php
140 if ! grep -q "^\\\$settings\['trusted_host_patterns'\] =" sites/default/settings.php;
141 then
142   echo "\$settings['trusted_host_patterns'] = [" >> sites/default/settings.php
143   for host in "${TRUSTED_HOSTS[@]}"
144   do
145     echo "  '^${host}\$'," >> sites/default/settings.php
146   done
147   echo "];" >> sites/default/settings.php
148 fi
149
150 if [ "$DEVEL_MODE" = "true" ];
151 then
152   # NOTE: don't run composer under web/ but in the project dir
153   composer --working-dir=../ require drupal/devel
154   $DRUSH --yes en devel
155
156   chmod 755 sites/default
157   cp sites/example.settings.local.php sites/default/settings.local.php
158   chmod 444 sites/default/settings.local.php
159   chmod 555 sites/default
160
161   if ! grep -q "^include \$app_root . '/' . \$site_path . '/settings.local.php';" sites/default/settings.php;
162   then
163     echo "include \$app_root . '/' . \$site_path . '/settings.local.php';" >> sites/default/settings.php
164   fi
165 fi
166
167 chmod 444 sites/default/settings.php
168
169 # If using a git checkout of Drupal core, set up a diff alias.
170 #
171 # This is useful because the Automated Test infrastructure of drupal.org does
172 # not expect patches to be created from a split core directory.
173 if [ -d core/.git ];
174 then
175   git -C core/ config --local alias.core-diff "diff --src-prefix=a/core/ --dst-prefix=b/core/"
176   echo "Added a 'git core-diff' to the drupal/core repository clone."
177   echo "This command helps creating core patches ready for upstream."
178 fi
179
180 popd