070796e5fdd7044bfea7cd7f18b7e17c982c5d54
[arvados-dev.git] / jenkins / arvados-sso-server-extras / arvados-sso-server.postinst
1 #!/bin/bash
2
3 set -e
4
5 INSTALL_PATH=/var/www/arvados-sso
6 RELEASE_PATH=$INSTALL_PATH/current
7 SHARED_PATH=$INSTALL_PATH/shared
8 CONFIG_PATH=/etc/arvados/sso
9 PACKAGE_NAME=arvados-sso-server
10
11 DATABASE_READY=1
12 APPLICATION_READY=1
13
14 setup_ruby_environment() {
15   if [ -s "$HOME/.rvm/scripts/rvm" ] ; then
16     using_rvm="true"
17   elif [ -s "/usr/local/rvm/scripts/rvm" ] ; then
18     using_rvm="true"
19   else
20     using_rvm="false"
21   fi
22
23   if [ "$using_rvm" = "true" ]; then
24     COMMAND_PREFIX="/usr/local/rvm/bin/rvm-exec default"
25   else
26     COMMAND_PREFIX=
27   fi
28 }
29
30 configure_version() {
31   WEB_SERVICE=${WEB_SERVICE:-$(service --status-all 2>/dev/null \
32       | grep -Eo '\bnginx|httpd[^[:space:]]*' || true)}
33   if [ -z "$WEB_SERVICE" ]; then
34     cat >&2 <<EOF
35
36 Warning: web service (Nginx or Apache) not found.
37
38 To override, set the WEB_SERVICE environment variable to the name of the service
39 hosting the Rails server. Alternativey, install nginx.
40
41 For Debian-based systems, then reconfigure this package with dpkg-reconfigure.
42
43 For RPM-based systems, then reinstall this package.
44
45 EOF
46   elif [ "$WEB_SERVICE" != "$(echo "$WEB_SERVICE" | head -n 1)" ]; then
47     WEB_SERVICE=$(echo "$WEB_SERVICE" | head -n 1)
48     cat >&2 <<EOF
49 Warning: multiple web services found. Choosing the first one ($WEB_SERVICE).
50
51 To override, set the WEB_SERVICE environment variable to the name of the service
52 hosting the Rails server.
53
54 For Debian-based systems, then reconfigure this package with dpkg-reconfigure.
55
56 For RPM-based systems, then reinstall this package.
57
58 EOF
59   fi
60
61   if [ -e /etc/redhat-release ]; then
62       if [ "$WEB_SERVICE" = "nginx" ]; then
63         WWW_OWNER=nginx:nginx
64       else
65         WWW_OWNER=apache:apache
66       fi
67   else
68       # Assume we're on a Debian-based system for now.
69       # Both Apache and Nginx run as www-data by default.
70       WWW_OWNER=www-data:www-data
71   fi
72
73   echo
74   echo "Assumption: $WEB_SERVICE is configured to serve your SSO server URL from"
75   echo "            $RELEASE_PATH"
76   echo "Assumption: configuration files are in $CONFIG_PATH"
77   echo "Assumption: $WEB_SERVICE and passenger run as $WWW_OWNER"
78   echo
79
80   echo -n "Symlinking files from $CONFIG_PATH ..."
81
82   if [ ! -f $CONFIG_PATH/database.yml ]; then
83     mkdir -p $CONFIG_PATH
84     cp $RELEASE_PATH/config/database.yml.example $CONFIG_PATH/database.yml
85     DATABASE_READY=0
86   fi
87
88   if [ ! -h $RELEASE_PATH/config/database.yml ]; then
89     ln -s $CONFIG_PATH/database.yml $RELEASE_PATH/config/database.yml
90   fi
91
92   if [ ! -f $CONFIG_PATH/production.rb ]; then
93     mkdir -p $CONFIG_PATH
94     cp $RELEASE_PATH/config/environments/production.rb.example $CONFIG_PATH/production.rb
95   fi
96
97   if [ ! -h $RELEASE_PATH/config/environments/production.rb ]; then
98     ln -s $CONFIG_PATH/production.rb $RELEASE_PATH/config/environments/production.rb
99   fi
100
101   if [ ! -f $CONFIG_PATH/application.yml ]; then
102     mkdir -p $CONFIG_PATH
103     cp $RELEASE_PATH/config/application.yml.example $CONFIG_PATH/application.yml
104     APPLICATION_READY=0
105   fi
106
107   if [ ! -h $RELEASE_PATH/config/application.yml ]; then
108     ln -s $CONFIG_PATH/application.yml $RELEASE_PATH/config/application.yml
109   fi
110
111   echo "... done."
112
113   # Before we do anything else, make sure some directories and files are in place
114   if [ ! -e $SHARED_PATH/log ]; then mkdir -p $SHARED_PATH/log; fi
115   if [ ! -e $RELEASE_PATH/tmp ]; then mkdir -p $RELEASE_PATH/tmp; fi
116   if [ ! -e $RELEASE_PATH/log ]; then ln -s $SHARED_PATH/log $RELEASE_PATH/log; fi
117   if [ ! -e $SHARED_PATH/log/production.log ]; then touch $SHARED_PATH/log/production.log; fi
118
119   cd "$RELEASE_PATH"
120   export RAILS_ENV=production
121
122   echo "Making sure bundle is installed ..."
123   set +e
124   which bundle > /dev/null
125   if [[ "$?" != "0" ]]; then
126     $COMMAND_PREFIX gem install bundle
127   fi
128   set -e
129   echo "... done."
130
131   echo -n "Running bundle install ..."
132   $COMMAND_PREFIX bundle install --path $SHARED_PATH/vendor_bundle --quiet || exit $?
133   echo "... done."
134
135   echo -n "Ensuring directory and file permissions ..."
136   # Ensure correct ownership of a few files
137   chown "$WWW_OWNER" $RELEASE_PATH/config/environment.rb
138   chown "$WWW_OWNER" $RELEASE_PATH/config.ru
139   chown "$WWW_OWNER" $RELEASE_PATH/config/database.yml
140   chown "$WWW_OWNER" $RELEASE_PATH/Gemfile.lock
141   chown -R "$WWW_OWNER" $RELEASE_PATH/tmp
142   chown -R "$WWW_OWNER" $SHARED_PATH/log
143   chown "$WWW_OWNER" $RELEASE_PATH/db/schema.rb
144   chmod 644 $SHARED_PATH/log/*
145   echo "... done."
146
147   set +e
148   DB_MIGRATE_STATUS=`$COMMAND_PREFIX bundle exec rake db:migrate:status 2>&1`
149   DB_MIGRATE_STATUS_CODE=$?
150   set -e
151
152   if echo $DB_MIGRATE_STATUS | grep 'Schema migrations table does not exist yet.' >/dev/null; then
153     # The database exists, but the migrations table doesn't.
154     echo -n "Setting up database ..."
155     $COMMAND_PREFIX bundle exec rake db:schema:load db:seed || exit $?
156     echo "... done."
157   elif echo $DB_MIGRATE_STATUS | grep '^database: ' >/dev/null; then
158     echo -n "Running db:migrate ..."
159     $COMMAND_PREFIX bundle exec rake db:migrate || exit $?
160     echo "... done."
161   elif echo $DB_MIGRATE_STATUS | grep 'database .* does not exist' >/dev/null; then
162     echo -n "Running db:setup ..."
163     set +e
164     $COMMAND_PREFIX bundle exec rake db:setup 2>/dev/null
165     if [ "$?" = "0" ]; then
166       echo "... done."
167     else
168       echo "... failed."
169       echo "Warning: unable to set up database." >&2
170       DATABASE_READY=0
171     fi
172     set -e
173   else
174     echo "Warning: Database is not ready to set up. Skipping database setup." >&2
175     DATABASE_READY=0
176   fi
177
178   echo -n "Precompiling assets ..."
179   # precompile assets; thankfully this does not take long
180   if [ "$APPLICATION_READY" = "1" ]; then
181     set +e
182     $COMMAND_PREFIX bundle exec rake assets:precompile -q -s 2>/dev/null
183     if [ "$?" = "0" ]; then
184       echo "... done."
185     else
186       echo "... failed."
187       APPLICATION_READY=0
188     fi
189     set -e
190   else
191     echo "... skipped."
192   fi
193   chown -R "$WWW_OWNER" $RELEASE_PATH/tmp
194
195   if [ ! -z "$WEB_SERVICE" ]; then
196     echo -n "Restarting $WEB_SERVICE ..."
197     service "$WEB_SERVICE" restart >/dev/null || exit $?
198     echo "... done."
199   fi
200 }
201
202 if [ "$1" = configure ]; then
203   # This is a debian-based system
204   setup_ruby_environment
205   configure_version
206 elif [ "$1" = "0" ] || [ "$1" = "1" ] || [ "$1" = "2" ]; then
207   # This is an rpm-based system
208   setup_ruby_environment
209   configure_version
210 fi
211
212 if [ "$DATABASE_READY" = "0" ]; then
213   cat <<EOF
214
215 PLEASE NOTE:
216
217 The $PACKAGE_NAME package was not configured completely because
218 $CONFIG_PATH/database.yml needs some tweaking. Please refer to the
219 documentation at http://doc.arvados.org/install/install-sso.html#configure for
220 more details.
221
222 When database.yml has been modified, reconfigure or reinstall this package.
223 EOF
224 fi
225
226 if [ "$APPLICATION_READY" = "0" ]; then
227   cat <<EOF
228
229 PLEASE NOTE:
230
231 The $PACKAGE_NAME package was not configured completely because
232 $CONFIG_PATH/application.yml needs some tweaking. Please refer to the
233 documentation at http://doc.arvados.org/install/install-sso.html#configure for
234 more details.
235
236 When application.yml has been modified, reconfigure or reinstall this package.
237 EOF
238 fi
239
240 echo