| 1 | #!/usr/bin/env bash |
| 2 | set -e |
| 3 | |
| 4 | CALLEDPATH=`dirname $0` |
| 5 | |
| 6 | # Convert to an absolute path if necessary |
| 7 | case "$CALLEDPATH" in |
| 8 | .*) |
| 9 | CALLEDPATH="$PWD/$CALLEDPATH" |
| 10 | ;; |
| 11 | esac |
| 12 | |
| 13 | if [ ! -f "$CALLEDPATH/setup.conf" ]; then |
| 14 | echo |
| 15 | echo "Missing configuration file. Please copy $CALLEDPATH/setup.conf.txt to $CALLEDPATH/setup.conf and edit it." |
| 16 | exit 1 |
| 17 | fi |
| 18 | |
| 19 | source "$CALLEDPATH/setup.conf" |
| 20 | source "$CALLEDPATH/setup.lib.sh" |
| 21 | |
| 22 | if [ "$1" = '-h' ] || [ "$1" = '--help' ]; then |
| 23 | echo |
| 24 | echo "Usage: setup.sh [options] [schema file] [database data file] [database name] [database user] [database password] [database host] [database port] [additional args]" |
| 25 | echo "[options] is a mix of zero or more of following:" |
| 26 | echo " -a (All) Implies -Dgsef (default)" |
| 27 | echo " -D (Download) Download dependencies" |
| 28 | echo " -g (GenCode) Generate DAO files, SQL files, etc" |
| 29 | echo " -s (Schema) Load new schema in DB" |
| 30 | echo " -d (Data-Plain) Load basic dataset in DB" |
| 31 | echo " -e (Data-Examples) Load example dataset in DB" |
| 32 | echo " -f (Flush) Flush caches and settings" |
| 33 | echo |
| 34 | echo "Example: Perform a full setup" |
| 35 | echo " setup.sh -a" |
| 36 | echo |
| 37 | echo "Example: Setup all the code but leave the DB alone" |
| 38 | echo " setup.sh -Dg" |
| 39 | echo |
| 40 | echo "Example: Keep the existing code but reset the DB" |
| 41 | echo " setup.sh -sef" |
| 42 | exit 0 |
| 43 | fi |
| 44 | |
| 45 | ############################################################################### |
| 46 | ## Parse command line options |
| 47 | |
| 48 | FOUND_ACTION= |
| 49 | DO_DOWNLOAD= |
| 50 | DO_GENCODE= |
| 51 | DO_SCHEMA= |
| 52 | DO_DATA= |
| 53 | DO_FLUSH= |
| 54 | DEFAULT_DATA= |
| 55 | |
| 56 | while getopts "aDgsdef" opt; do |
| 57 | case $opt in |
| 58 | a) |
| 59 | DO_DOWNLOAD=1 |
| 60 | DO_GENCODE=1 |
| 61 | DO_SCHEMA=1 |
| 62 | DO_DATA=1 |
| 63 | DEFAULT_DATA=civicrm_generated.mysql |
| 64 | DO_FLUSH=1 |
| 65 | FOUND_ACTION=1 |
| 66 | ;; |
| 67 | D) |
| 68 | DO_DOWNLOAD=1 |
| 69 | FOUND_ACTION=1 |
| 70 | ;; |
| 71 | g) |
| 72 | DO_GENCODE=1 |
| 73 | FOUND_ACTION=1 |
| 74 | ;; |
| 75 | s) |
| 76 | DO_SCHEMA=1 |
| 77 | FOUND_ACTION=1 |
| 78 | ;; |
| 79 | d) |
| 80 | DO_DATA=1 |
| 81 | DEFAULT_DATA=civicrm_data.mysql |
| 82 | FOUND_ACTION=1 |
| 83 | ;; |
| 84 | e) |
| 85 | DO_DATA=1 |
| 86 | DEFAULT_DATA=civicrm_generated.mysql |
| 87 | FOUND_ACTION=1 |
| 88 | ;; |
| 89 | f) |
| 90 | DO_FLUSH=1 |
| 91 | FOUND_ACTION=1 |
| 92 | ;; |
| 93 | \?) |
| 94 | echo "Invalid option: -$OPTARG" >&2 |
| 95 | exit 1 |
| 96 | ;; |
| 97 | :) |
| 98 | echo "Option -$OPTARG requires an argument." >&2 |
| 99 | exit 1 |
| 100 | ;; |
| 101 | esac |
| 102 | done |
| 103 | if [ -z "$FOUND_ACTION" ]; then |
| 104 | DO_DOWNLOAD=1 |
| 105 | DO_GENCODE=1 |
| 106 | DO_SCHEMA=1 |
| 107 | DO_DATA=1 |
| 108 | DO_FLUSH=1 |
| 109 | DEFAULT_DATA=civicrm_generated.mysql |
| 110 | fi |
| 111 | |
| 112 | shift $((OPTIND-1)) |
| 113 | |
| 114 | # fetch command line arguments if available |
| 115 | if [ ! -z "$1" ] ; then SCHEMA="$1"; fi |
| 116 | if [ ! -z "$2" ] ; then DBLOAD="$2"; fi |
| 117 | if [ ! -z "$3" ] ; then DBNAME="$3"; fi |
| 118 | if [ ! -z "$4" ] ; then DBUSER="$4"; fi |
| 119 | if [ ! -z "$5" ] ; then DBPASS="$5"; fi |
| 120 | if [ ! -z "$6" ] ; then DBHOST="$6"; fi |
| 121 | if [ ! -z "$7" ] ; then DBPORT="$7"; fi |
| 122 | |
| 123 | # verify if we have at least DBNAME given |
| 124 | if [ -z $DBNAME ] ; then |
| 125 | echo "No database name defined!" |
| 126 | exit 1 |
| 127 | fi |
| 128 | if [ -z $DBUSER ] ; then |
| 129 | echo "No database username defined!" |
| 130 | exit 1 |
| 131 | fi |
| 132 | if [ -z $DBPASS ] ; then |
| 133 | read -p "Database password:" |
| 134 | DBPASS=$REPLY |
| 135 | fi |
| 136 | |
| 137 | MYSQLCMD=$(mysql_cmd) |
| 138 | ############################################################################### |
| 139 | ## Execute tasks |
| 140 | set -x |
| 141 | |
| 142 | if [ -n "$DO_DOWNLOAD" ]; then |
| 143 | pushd "$CALLEDPATH/.." |
| 144 | if [ "$GENCODE_CMS" != "Drupal8" ]; then |
| 145 | COMPOSER=$(pickcmd composer composer.phar) |
| 146 | $COMPOSER install |
| 147 | fi |
| 148 | |
| 149 | if has_commands karma ; then |
| 150 | ## dev dependencies have been installed globally; don't force developer to redownload |
| 151 | npm install --production |
| 152 | else |
| 153 | npm install |
| 154 | fi |
| 155 | popd |
| 156 | fi |
| 157 | |
| 158 | # run code generator if it's there - which means it's |
| 159 | # checkout, not packaged code |
| 160 | if [ -n "$DO_GENCODE" -a -d "$CALLEDPATH/../xml" ]; then |
| 161 | pushd "$CALLEDPATH/../xml" |
| 162 | if [ -z "$DBPORT" ]; then |
| 163 | PHP_MYSQL_HOSTPORT="$DBHOST" |
| 164 | else |
| 165 | PHP_MYSQL_HOSTPORT="$DBHOST:$DBPORT" |
| 166 | fi |
| 167 | "$PHP5PATH"php -d mysql.default_host="$PHP_MYSQL_HOSTPORT" -d mysql.default_user=$DBUSER -d mysql.default_password=$DBPASS GenCode.php $SCHEMA '' ${GENCODE_CMS} |
| 168 | popd |
| 169 | fi |
| 170 | |
| 171 | if [ -n "$DO_SCHEMA" ]; then |
| 172 | pushd "$CALLEDPATH/../sql" |
| 173 | echo; echo "Dropping civicrm_* tables from database $DBNAME" |
| 174 | echo "SELECT table_name FROM information_schema.TABLES WHERE TABLE_SCHEMA='${DBNAME}' AND TABLE_TYPE = 'VIEW'" \ |
| 175 | | $MYSQLCMD \ |
| 176 | | grep '^\(civicrm_\|log_civicrm_\)' \ |
| 177 | | awk -v NOFOREIGNCHECK='SET FOREIGN_KEY_CHECKS=0;' 'BEGIN {print NOFOREIGNCHECK}{print "drop view " $1 ";"}' \ |
| 178 | | $MYSQLCMD |
| 179 | echo "SELECT table_name FROM information_schema.TABLES WHERE TABLE_SCHEMA='${DBNAME}' AND TABLE_TYPE = 'BASE TABLE'" \ |
| 180 | | $MYSQLCMD \ |
| 181 | | grep '^\(civicrm_\|log_civicrm_\)' \ |
| 182 | | awk -v NOFOREIGNCHECK='SET FOREIGN_KEY_CHECKS=0;' 'BEGIN {print NOFOREIGNCHECK}{print "drop table " $1 ";"}' \ |
| 183 | | $MYSQLCMD |
| 184 | |
| 185 | echo; echo Creating database structure |
| 186 | $MYSQLCMD < civicrm.mysql |
| 187 | popd |
| 188 | fi |
| 189 | |
| 190 | if [ -n "$DO_DATA" ]; then |
| 191 | pushd "$CALLEDPATH/../sql" |
| 192 | # load default data set unless system is configured with override |
| 193 | if [ -z $DBLOAD ]; then |
| 194 | echo; |
| 195 | echo "Populating database with dataset - $DEFAULT_DATA" |
| 196 | $MYSQLCMD < "$DEFAULT_DATA" |
| 197 | else |
| 198 | echo; echo Populating database with required data - civicrm_data.mysql |
| 199 | $MYSQLCMD < civicrm_data.mysql |
| 200 | echo; echo Populating database with $DBLOAD data |
| 201 | $MYSQLCMD < $DBLOAD |
| 202 | fi |
| 203 | |
| 204 | # load additional script if DBADD defined |
| 205 | if [ ! -z $DBADD ]; then |
| 206 | echo; echo Loading $DBADD |
| 207 | $MYSQLCMD < $DBADD |
| 208 | fi |
| 209 | popd |
| 210 | fi |
| 211 | |
| 212 | if [ -n "$DO_FLUSH" ]; then |
| 213 | pushd "$CALLEDPATH/.." |
| 214 | # reset userFrameworkResourceURL which gets set |
| 215 | # when config object is initialized |
| 216 | $MYSQLCMD -e "UPDATE civicrm_setting SET value = NULL WHERE name = 'userFrameworkResourceURL';" |
| 217 | popd |
| 218 | fi |
| 219 | |
| 220 | echo; echo "NOTE: Logout from your CMS to avoid session conflicts." |
| 221 | |