97cc88f8b490449d0d852d576b0ad6ba8f1b8692
[working/random.git] / installer / jessie / eg_jessie_installer.sh
1 #!/bin/bash
2 # -----------------------------------------------------------------------
3 # Copyright (C) 2009-2012  Equinox Software Inc.
4 # Bill Erickson <berick@esilibrary.com>
5
6 # This program is free software; you can redistribute it and/or
7 # modify it under the terms of the GNU General Public License
8 # as published by the Free Software Foundation; either version 2
9 # of the License, or (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
17 while getopts ayst option
18 do
19         case "${option}"
20         in
21                 a) AUTOSTART=1;;
22                 y) YES=1;;
23                 s) SAMPLEDATA=--load-all-sample;;
24                 t) LIVETEST=1;;
25         esac
26 done
27
28 function my_init {
29     date
30     init_variables
31     configure_cpan
32     build_essentials
33     setting_up_opensrf_env
34     cloning_git_repos
35     opensrf_prereqs
36     evergreen_prereqs
37     evergreen_db_prereqs
38     setting_ldconfig_and_rsyslog_and_hosts_and_ejabberd
39     build_opensrf
40     test_opensrf_build
41     install_opensrf
42     build_evergreen
43     test_evergreen_build
44     test_and_build_eg_browser_client
45     install_evergreen
46     configure_database
47     configure_apache
48     if [ $AUTOSTART ]; then
49         start_evergreen
50         if [ $LIVETEST ]; then
51             test_evergreen_live
52         fi
53     fi
54 }
55
56 function init_variables {
57     echo _.-~= initializing installer
58     date
59     # -----------------------------------------------------------------------
60     # Handling passed arguments to the script
61     # -----------------------------------------------------------------------
62     export DOJO_VERSION='1.3.3';
63     export PATH=/openils/bin:$PATH
64     export LD_LIBRARY_PATH=/openils/lib:/usr/local/lib:/usr/local/lib/dbd:$LD_LIBRARY_PATH
65     export BASE_DIR=$PWD
66     echo AUTOSTART=${AUTOSTART}
67     echo YES=${YES}
68     echo SAMPLEDATA=${SAMPLEDATA}
69     echo LIVETEST=${LIVETEST}
70     echo DOJO_VERSION=${DOJO_VERSION}
71     echo PATH=${PATH}
72     echo LD_LIBRARY_PATH=${LD_LIBRARY_PATH}
73     echo BASE_DIR=${BASE_DIR}
74     # -----------------------------------------------------------------------
75     # Change to suit...
76     # -----------------------------------------------------------------------
77     # If you change the jabber password, you will need to 
78     # edit opensrf_core.xml and srfsh.xml accordingly
79     export JABBER_PASSWORD='password'
80     export ADMIN_USER='admin';
81     export ADMIN_PASS='demo123';
82     # -----------------------------------------------------------------------
83     # Database variables
84     # -----------------------------------------------------------------------
85     export PGDATABASE=evergreen
86     export PGUSER=evergreen
87     export PGPASSWORD=evergreen
88     export PGHOST=localhost
89     # -----------------------------------------------------------------------
90     # You can override these like so:
91     #       EVERGREEN_BRANCH='master' ./eg_jessie_installer.sh
92     # -----------------------------------------------------------------------
93     OPENSRF_REPO='git://git.evergreen-ils.org/OpenSRF.git'
94     OPENSRF_BRANCH='master'
95     EVERGREEN_REPO='git://git.evergreen-ils.org/Evergreen.git'
96     EVERGREEN_BRANCH='master'
97     echo OPENSRF_REPO=${OPENSRF_REPO}
98     echo OPENSRF_BRANCH=${OPENSRF_BRANCH}
99     echo EVERGREEN_REPO=${EVERGREEN_REPO}
100     echo EVERGREEN_BRANCH=${EVERGREEN_BRANCH}
101     OPENSRF_PREREQ_TARGET=debian-jessie
102     EVERGREEN_PREREQ_TARGET=debian-jessie
103     EVERGREEN_DB_PREREQ_TARGET=postgres-server-debian-jessie
104     echo OPENSRF_PREREQ_TARGET=${OPENSRF_PREREQ_TARGET}
105     echo EVERGREEN_PREREQ_TARGET=${EVERGREEN_PREREQ_TARGET}
106     echo EVERGREEN_DB_PREREQ_TARGET=${EVERGREEN_DB_PREREQ_TARGET}
107
108     export NODEJS_REPO='https://github.com/joyent/node.git'
109     export NODEJS_VERSION='v0.10.35'
110     echo "NODEJS_REPO=$NODEJS_REPO"
111     echo "NODEJS_VERSION=$NODEJS_VERSION"
112
113     echo End of intializing installer =~-._
114 }
115
116
117 function configure_cpan {
118     echo _.-~= configure CPAN
119     date
120     # -----------------------------------------------------------------------
121     # force CPAN to load by installing something that should already be installed
122     if [ $YES ]; then
123         yes | cpan Fcntl
124     else
125         cpan Fcntl
126     fi
127     echo Return Value = $?
128     # CPAN follow pre-reqs?
129     if [ ! "$(echo 'o conf prerequisites_policy' | cpan | grep follow)" ]; then
130     if [ $YES ]; then
131
132         echo "setting cpan prerequisites_policy to follow"
133         echo -e "o conf prerequisites_policy follow\\n o conf commit" | cpan
134
135     else
136
137         echo '
138
139 -----------------------------------------------------------------------
140 The install will go faster if CPAN is configured to automatically install 
141 prerequisites.  You can revert the action later with:
142
143 echo -e "o conf prerequisites_policy ask\n o conf commit" | cpan 
144 '
145         while true; do
146             echo -n 'Automatically install prereqs? [Y/n] ';
147             read X;
148             [ "$X" == 'n' -o "$X" == "N" ] && break;
149             if [ "$X" == 'y' -o "$X" == 'Y' ]; then
150                 echo -e "o conf prerequisites_policy follow\\n o conf commit" | cpan
151                 break;
152             fi;
153         done;
154     fi;
155     fi;
156     echo End of configure CPAN =~-._
157 }
158
159 function build_essentials {
160     echo _.-~= Installing some build essentials
161     date
162     # Install some essential tools
163     apt-get update \
164     && apt-get -yq dist-upgrade \
165     && apt-get -yq install build-essential automake git psmisc ntp rsyslog lsb-release unzip;
166     echo Return Value = $?
167
168     if [ $LIVETEST ]; then
169         cpan TAP::Parser::SourceHandler::pgTAP
170         echo Return Value = $?
171     fi;
172     echo End of Installing some build essentials  =~-._
173 }
174
175 function setting_up_opensrf_env {
176     echo _.-~= creating opensrf user and environment
177     date
178     # Create opensrf user and set up environment
179     if [ ! "$(grep ^opensrf: /etc/passwd)" ]; then
180         useradd -m -s /bin/bash opensrf
181         echo Return Value = $?
182         echo 'export PATH=/openils/bin:$PATH' >> /home/opensrf/.bashrc
183         echo 'export LD_LIBRARY_PATH=/openils/lib:/usr/local/lib:/usr/local/lib/dbd:$LD_LIBRARY_PATH' >> /home/opensrf/.bashrc
184     fi;
185     echo end of creating opensrf user and environment =~-._
186 }
187
188 function cloning_git_repos {
189     echo _.-~= cloning git repositories
190     date
191     OSRF_COMMAND="
192     cd /home/opensrf;
193     git clone --depth 1 --branch $OPENSRF_BRANCH $OPENSRF_REPO OpenSRF;
194     git clone --depth 1 --branch $EVERGREEN_BRANCH $EVERGREEN_REPO Evergreen;
195     "
196     rm -rf /home/opensrf/Evergreen /home/opensrf/OpenSRF
197     su - opensrf sh -c "$OSRF_COMMAND";
198     echo Return Value = $?
199
200     # Show tips
201     cd /home/opensrf/OpenSRF/
202     echo 'Tip of OpenSRF:' `git log --format=oneline | head -1`
203     cd /home/opensrf/Evergreen/
204     echo 'Tip of Evergreen:' `git log --format=oneline | head -1`
205
206     echo End of cloning git repositories =~-._
207 }
208
209 function opensrf_prereqs {
210     echo _.-~= Installing OpenSRF pre-requisites
211     date
212     # Install pre-reqs
213     mkdir -p /usr/src/evergreen; 
214     cd /usr/src/evergreen;
215     if [ $YES ]; then
216         yes | make -f /home/opensrf/OpenSRF/src/extras/Makefile.install ${OPENSRF_PREREQ_TARGET}
217     else
218         make -f /home/opensrf/OpenSRF/src/extras/Makefile.install ${OPENSRF_PREREQ_TARGET}
219     fi;
220     echo Return Value = $?
221     echo End of Installing OpenSRF pre-requisites =~-._
222 }
223
224 function evergreen_prereqs {
225     echo _.-~= Installing Evergreen pre-requisites
226     date
227     if [ $YES ]; then
228         yes | make -f /home/opensrf/Evergreen/Open-ILS/src/extras/Makefile.install ${EVERGREEN_PREREQ_TARGET}
229     else
230         make -f /home/opensrf/Evergreen/Open-ILS/src/extras/Makefile.install ${EVERGREEN_PREREQ_TARGET}
231     fi;
232     echo Return Value = $?
233     echo End of Installing Evergreen pre-requisites =~-._
234 }
235
236 function evergreen_db_prereqs {
237     echo _.-~= Installing Evergreen database pre-requisites
238     date
239     if [ $YES ]; then
240         yes | make -f /home/opensrf/Evergreen/Open-ILS/src/extras/Makefile.install ${EVERGREEN_DB_PREREQ_TARGET}
241     else
242         make -f /home/opensrf/Evergreen/Open-ILS/src/extras/Makefile.install ${EVERGREEN_DB_PREREQ_TARGET}
243     fi;
244     echo Return Value = $?
245     echo End of Installing Evergreen database pre-requisites =~-._
246 }
247
248 function setting_ldconfig_and_rsyslog_and_hosts_and_ejabberd {
249     echo _.-~= setting ld.so.conf and rsyslog and /etc/hosts and ejabberd
250     date
251     cp $BASE_DIR/evergreen.ld.conf /etc/ld.so.conf.d/
252     ldconfig;
253     echo Return Value = $?
254     # Configure rsyslog and restart
255     cp /home/opensrf/Evergreen/Open-ILS/examples/evergreen-rsyslog.conf /etc/rsyslog.d/evergreen.conf
256     /etc/init.d/rsyslog restart
257     echo Return Value = $?
258     if [ ! "$(grep 'public.localhost' /etc/hosts)" ]; then
259
260         if [ $YES ]; then
261             echo 'Adding public.localhost and private.localhost to /etc/hosts'
262             echo '127.0.1.2    public.localhost     public' >> /etc/hosts
263             echo '127.0.1.3    private.localhost    private' >> /etc/hosts
264         else
265
266         cat <<EOF
267
268     * Add these lines to /etc/hosts.
269
270     127.0.1.2   public.localhost    public
271     127.0.1.3   private.localhost   private
272
273 EOF
274         fi;
275
276     else
277         echo "INFO: /etc/hosts already has public.localhost line";
278     fi
279     echo Return Value = $?
280     # Patch Ejabberd and register users
281     if [ ! "$(grep 'public.localhost' /etc/ejabberd/ejabberd.yml)" ]; then
282         cd /etc/ejabberd/
283         /etc/init.d/ejabberd stop;
284         killall beam epmd; # just in case
285         cp ejabberd.yml /root/ejabberd.yml.orig
286         patch -p0 < $BASE_DIR/ejabberd.EG.patch
287         chown ejabberd:ejabberd ejabberd.yml
288         echo starting ejabberd after patching
289         date
290         /etc/init.d/ejabberd start
291         echo Return Value = $?
292         sleep 10;
293         ejabberdctl register router  private.localhost $JABBER_PASSWORD
294         echo Return Value = $?
295         ejabberdctl register opensrf private.localhost $JABBER_PASSWORD
296         echo Return Value = $?
297         ejabberdctl register router  public.localhost  $JABBER_PASSWORD
298         echo Return Value = $?
299         ejabberdctl register opensrf public.localhost  $JABBER_PASSWORD
300         echo Return Value = $?
301     fi;
302     echo End of setting ld.so.conf and rsyslog and /etc/hosts and ejabberd =~-._
303 }
304
305 function build_opensrf {
306     # Build and install OpenSRF
307     echo _.-~= Building OpenSRF
308     date
309     OSRF_COMMAND='
310     cd /home/opensrf/OpenSRF;
311     autoreconf -i;
312     ./configure --prefix=/openils --sysconfdir=/openils/conf;
313     make;'
314     su - opensrf sh -c "$OSRF_COMMAND"
315     echo Return Value = $?
316     echo End of Building OpenSRF =~-._
317 }
318
319 function test_opensrf_build {
320     echo _.-~= Running OpenSRF build tests
321     date
322     cd /home/opensrf/OpenSRF;
323     make check
324     echo Return Value = $?
325     echo End of OpenSRF build tests =~-._
326 }
327
328 function install_opensrf {
329     echo _.-~= Installing OpenSRF
330     date
331     make install
332     echo Return Value = $?
333     echo End of Installing OpenSRF =~-._
334 }
335
336 function build_evergreen {
337     echo _.-~= Building Evergreen
338     date
339     OSRF_COMMAND='
340     export PATH=/openils/bin:$PATH
341     cd /home/opensrf/Evergreen;
342     autoreconf -i;
343     ./configure --prefix=/openils --sysconfdir=/openils/conf;
344     make;
345     '
346     su - opensrf sh -c "$OSRF_COMMAND"
347     echo Return Value = $?
348     echo End of Building Evergreen =~-._
349 }
350
351 function test_evergreen_build {
352     echo _.-~= Running Evergreen build tests
353     date
354     cd /home/opensrf/Evergreen
355     make check
356     echo Return Value = $?
357     echo End of Evergreen build tests =~-._
358 }
359
360
361 # The evergreen browser client prereq installation and 
362 # build process is not baked into Evergreen proper (yet).  
363 # Run it as a standalone operation for now.
364 function test_and_build_eg_browser_client {
365     echo _.-~= Running Evergreen browser client build/test
366     cd /tmp
367     git clone $NODEJS_REPO
368     cd node
369     git checkout -b $NODEJS_VERSION $NODEJS_VERSION
370     ./configure && make -j2 && make install
371     echo Return Value = $?
372     npm update
373     echo Return Value = $?
374     npm install -g grunt-cli    # install grunt
375     echo Return Value = $?
376     npm install -g bower        # install bower
377     echo Return Value = $?
378     cd /home/opensrf/Evergreen/Open-ILS/web/js/ui/default/staff
379     npm install                 # fetch build depencies
380     echo Return Value = $?
381
382     # fetch JS/CSS/etc prereqs
383     if [ $YES ]; then
384         # yes == allow sending package stats
385         yes | bower --allow-root install  
386     else
387         bower --allow-root install
388     fi
389     echo Return Value = $?
390
391     grunt build                 # concatentate, minify, copy into place
392     echo Return Value = $?
393     grunt test                  # run JS unit tests
394     echo Return Value = $?
395     echo End of Evergreen browser client build/test =~-._
396 }
397
398 function install_evergreen {
399     echo _.-~= Installing Evergreen
400     date
401     cd /home/opensrf/Evergreen
402     make install
403     echo Return Value = $?
404
405     cp /openils/conf/opensrf.xml.example      /openils/conf/opensrf.xml
406     cp /openils/conf/opensrf_core.xml.example /openils/conf/opensrf_core.xml
407
408     # fetch and install Dojo
409     cd /tmp;
410     wget -N "http://download.dojotoolkit.org/release-$DOJO_VERSION/dojo-release-$DOJO_VERSION.tar.gz" \
411     || wget -N "http://evergreen-ils.org/~phasefx/download.dojotoolkit.org/dojo-release-$DOJO_VERSION.tar.gz"
412     tar -zxf dojo-release-$DOJO_VERSION.tar.gz;
413     cp -r dojo-release-$DOJO_VERSION/* /openils/var/web/js/dojo/;
414
415     # give it all to opensrf
416     chown -R opensrf:opensrf /openils
417
418     # copy srfsh config into place
419     cp /openils/conf/srfsh.xml.example /home/opensrf/.srfsh.xml;
420     chown opensrf:opensrf /home/opensrf/.srfsh.xml;
421     echo End of Installing Evergreen =~-._
422 }
423
424 function configure_database {
425     echo _.-~= configure database
426     date
427     if [ $YES ]; then
428         echo "Using password $PGPASSWORD for the $PGUSER database user."
429         echo -e "$PGPASSWORD\n$PGPASSWORD\n" | su - postgres sh -c "createuser -P -s $PGUSER;"
430     else
431         echo -e "\n\nPlease enter a password for the $PGUSER database user.\n  If you do not want to edit configs, use \"$PGPASSWORD\"\n"
432         su - postgres sh -c "createuser -P -s $PGUSER;"
433     fi;
434
435     # Apply the DB schema
436     cd /home/opensrf/Evergreen
437     perl Open-ILS/src/support-scripts/eg_db_config \
438         --create-database       \
439         --create-schema         \
440         --create-offline        \
441         --update-config $SAMPLEDATA \
442         --service all           \
443         --user $PGUSER          \
444         --password $PGPASSWORD  \
445         --hostname $PGHOST      \
446         --database $PGDATABASE  \
447         --admin-user $ADMIN_USER \
448         --admin-pass $ADMIN_PASS;
449     echo Return Value = $?
450
451     if [ $LIVETEST ]; then
452         PG_TAP_VER="0.97.0"
453         wget -N http://api.pgxn.org/dist/pgtap/$PG_TAP_VER/pgtap-$PG_TAP_VER.zip \
454         && unzip pgtap-$PG_TAP_VER.zip \
455         && cd pgtap-$PG_TAP_VER \
456         && make \
457         && make installcheck \
458         && make install
459         echo 'CREATE EXTENSION pgtap;' | su - postgres -c "psql evergreen"
460     fi;
461     echo configure database =~-._
462 }
463
464 function configure_apache {
465     echo _.-~= configure apache
466     date
467     /etc/init.d/apache2 stop
468     # Copy apache configs into place and create SSL cert
469     cd /home/opensrf/Evergreen/
470     cp Open-ILS/examples/apache_24/eg_24.conf       /etc/apache2/sites-available/eg.conf
471     cp Open-ILS/examples/apache_24/eg_vhost_24.conf /etc/apache2/eg_vhost.conf
472     cp Open-ILS/examples/apache/eg_startup    /etc/apache2/
473
474     mkdir -p /etc/apache2/ssl;
475     if [ ! -f /etc/apache2/ssl/server.key ] ; then
476         echo -e "\n\nConfiguring a new temporary SSL certificate....\n";
477         if [ $YES ]; then
478            yes "" | openssl req -new -x509 -days 365 -nodes -out /etc/apache2/ssl/server.crt -keyout /etc/apache2/ssl/server.key
479         else
480            openssl req -new -x509 -days 365 -nodes -out /etc/apache2/ssl/server.crt -keyout /etc/apache2/ssl/server.key
481         fi;
482     else
483         echo -e "\nkeeping existing ssl/server.key file\n";
484     fi
485
486     a2enmod ssl  
487     echo Return Value = $?
488     a2enmod rewrite
489     echo Return Value = $?
490     a2enmod expires 
491     echo Return Value = $?
492     a2dissite 000-default
493     echo Return Value = $?
494     a2ensite eg.conf
495     echo Return Value = $?
496
497     echo Modifying APACHE_RUN_USER/APACHE_RUN_GROUP in /etc/apache2/envvars
498     sed -i 's/www-data/opensrf/g' /etc/apache2/envvars
499
500     echo Making sure /var/lock/apache2 is owned by opensrf
501     chown opensrf:opensrf /var/lock/apache2
502
503     echo Modifying KeepAliveTimeout in /etc/apache2/apache2.conf
504     sed -i 's/KeepAliveTimeout .*/KeepAliveTimeout 1/' /etc/apache2/apache2.conf
505
506     echo End of configure apache =~-._
507 }
508
509 function start_evergreen {
510     echo _.-~= Starting Evergreen
511     date
512     if [ $LIVETEST ]; then
513         rm /openils/var/log/*.log
514     fi
515
516     OSRF_COMMAND='
517     export LD_LIBRARY_PATH=/openils/lib:/usr/local/lib:/usr/local/lib/dbd:$LD_LIBRARY_PATH \
518     && export PATH=/openils/bin:$PATH \
519     && OSRF_HOSTNAME="dns_hack" /openils/bin/osrf_control --localhost --restart-all  && sleep 3 \
520     && /openils/bin/autogen.sh /openils/conf/opensrf_core.xml \
521     && echo Finis;
522     '
523     echo Starting services...
524     su - opensrf sh -c "$OSRF_COMMAND";
525     echo Return Value = $?
526
527     echo Restarting Apache
528     /etc/init.d/apache2 restart
529     echo Return Value = $?
530
531     echo End of Starting Evergreen =~-._
532 }
533
534 function test_evergreen_live {
535     # TODO: Eventually move these tests into a Make target within Evergreen
536     cd /home/opensrf/Evergreen
537     echo _.-~= Running pgTAP tests
538     date
539     su - postgres -c 'cd /home/opensrf/Evergreen ; pg_prove -vr -d evergreen Open-ILS/src/sql/Pg/t/ ; echo Return Value = $?'
540     echo End of pgTAP tests =~-._
541     echo _.-~= Running pgTAP live tests
542     date
543     su - postgres -c 'cd /home/opensrf/Evergreen ; pg_prove -vr -d evergreen Open-ILS/src/sql/Pg/live_t/ ; echo Return Value = $?'
544     echo End of pgTAP live tests =~-._
545     echo _.-~= Running settings-tester.pl
546     date
547     su - opensrf sh -c 'export PATH=/openils/bin:$PATH ; cd /home/opensrf/Evergreen/Open-ILS/src/support-scripts/ ; ./settings-tester.pl ; echo Return Value = $?'
548     echo End of settings-tester.pl output =~-._
549     echo _.-~= Running perl live tests
550     date
551     su - opensrf sh -c 'export PATH=/openils/bin:$PATH ; cd /home/opensrf/Evergreen/Open-ILS/src/perlmods/ ; make livecheck; echo Return Value = $?'
552     echo End of perl live tests =~-._
553     echo _.-~= Gathering log summary
554     date
555     echo ''
556     echo 'wc -l *.log:'
557     su - opensrf sh -c 'cd /openils/var/log/ ; wc -l *.log'
558     echo ''
559     echo 'du -sh *.log:'
560     su - opensrf sh -c 'cd /openils/var/log/ ; du -sh *.log'
561     echo ''
562     echo 'perl -ne ''if (/^\[.*?\] (.*?) \[/) { print "$1\n"; }'' osrfsys.log | sort | uniq -c | sort -k2:'
563     (cd /openils/var/log/ ; perl -ne 'if (/^\[.*?\] (.*?) \[/) { print "$1\n"; }' osrfsys.log | sort | uniq -c | sort -k2)
564     echo ''
565     echo End of log summary =~-._
566     cd /openils/var/log/
567     for x in *.log; do
568         echo _.-~= Log Output: $x
569         date
570         cat $x
571         echo End of $x =~-._
572     done
573     echo _.-~= Gathering system information
574     echo ''
575     date
576     echo ''
577     uname -a
578     echo 'select version();' | su - postgres -c 'psql -At'
579     echo ''
580     echo '/proc/meminfo:'
581     cat /proc/meminfo
582     echo ''
583     echo '/proc/cpuinfo:'
584     cat /proc/cpuinfo
585     echo ''
586     echo 'dpkg --list:'
587     dpkg --list
588     echo ''
589     echo 'cpan -l:'
590     cpan -l 2> /dev/null | sort
591     echo End of system information =~-._
592     date
593 }
594
595 my_init
596
597