Copy mir-setup to 1.1 branch
[mir.git] / scripts / mir-setup / mir-setup
1 #!/bin/bash
2 # $Id: mir-setup,v 1.2.2.1 2006/11/11 12:52:05 zak Exp $
3
4 # Script to install a new Mir site
5
6 # Initial version -zak 2005-01-23
7 # Moved to traven -zak 2005-04-05
8 # Added to CVS    -zak 2005-06-13
9
10 set -e
11
12 CONFDIR="/etc/mir-setup"
13 SHAREDIR="/usr/local/share/mir-setup"
14 PROG="`basename $0`"
15
16 die()
17 {
18   echo >&2 "$@";
19   exit 1;
20 }
21
22 optdie()
23 {
24   echo >&2 "$@";
25   echo >&2 "Try $PROG --help";
26   exit 1;
27 }
28
29 manage()
30 {
31   (
32     source "$CONFDIR/tomcat-manager.conf"
33     
34     if [ -z "$TOMCAT_MANAGER_URL" ]; then die "No TOMCAT_MANAGER_URL specified"; fi
35     
36     echo "$TOMCAT_MANAGER_URL/html/$1?path=/$2" | wget -q -O /dev/null -i -
37   ) 
38 }
39
40 usage() {
41     echo >&2 "Usage: $PROG options"
42     echo >&2
43     echo >&2 "  Exactly one of the following is required:"
44     echo >&2 "    -f|--config <file>        mir-setup site config file"
45     echo >&2 "       --start  <site>        start the given site's webapp"
46     echo >&2 "       --stop   <site>        stop the given site's webapp"
47     echo >&2 "       --reload <site>        reload the given site's webapp"
48     echo >&2
49     echo >&2 "  Debugging options:"
50     echo >&2 "    -d|--debug                Debugging output, including 'set -x' shell trace"
51     echo >&2 "    -p|--checkpoint <start>   Run from specified checkpoint after failed run"
52 }
53
54 while [ $# != 0 ]; do
55     case "$1" in
56         -f|--config) shift; CONFIGFILE="$1" ;;
57         --start|--stop|--reload) ACTION="$1"; shift; SITE="$1" ;;
58         -d|--debug)  set -x; DEBUG=1 ;;
59         -p|--checkpoint) shift; START_CHECKPOINT="$1" ;;
60         -h|-?|--help) usage; exit 0 ;;
61         -*) optdie "$PROG: unknown option $1" ;;
62         *) optdie "$PROG: unexpected argument '$1'" ;;
63     esac
64     shift
65 done
66
67 case "$ACTION" in
68     --start|--stop|--reload)
69         if [ -n "$CONFIGFILE" ]; then optdie "$PROG: config file specified with $ACTION"; fi
70         echo -n "$ACTION"ing "$SITE..."
71         manage "`echo "$ACTION" | sed -e 's/^--//'`" "$SITE"
72         echo " done."
73         exit 0
74         ;;
75 esac
76         
77 if [ -z "$CONFIGFILE" ]; then optdie "$PROG: no site config file; use -f"; fi
78
79 source "$CONFIGFILE"
80
81 if [ -z "$SITE" ]; then optdie "$PROG: no site name"; fi
82 if [ -z "$FQDN" ]; then optdie "$PROG: no site fqdn"; fi
83 if [ -z "$USER" ]; then optdie "$PROG: no user"; fi
84
85 OWNER="$USER:$GROUP"
86 TOMCATOWNER="$USER:$TOMCATGROUP"
87
88 if [ -n "$GROUP" ]; then
89     umask 002
90     PRIVMODE=660
91 else
92     umask 022
93     PRIVMODE=600
94 fi
95
96 if [ -n "$MIRVERSION" ]; then MIRVERSIONOPT="-r$MIRVERSION"; fi
97 if [ -n "$SITEVERSION" ]; then SITEVERSIONOPT="-r$SITEVERSION"; fi
98
99 if [ -n "$SHAREDB" ]; then
100   if [ -n "$DBNAME" ]; then optdie "$PROG: SHAREDB and DBNAME set"; fi
101   if [ -n "$DBUSER" ]; then optdie "$PROG: SHAREDB and DBUSER set"; fi
102   if [ -n "$DBPASS" ]; then optdie "$PROG: SHAREDB and DBPASS set"; fi
103   
104   DBNAME="`perl -ne 'if (/\s*Database\.Name\s*=\s*(\S+)/) { print "$1\n" }' /mir/uk/setup_uk/etc/config.properties`"
105   DBUSER="`perl -ne 'if (/\s*Database\.Username\s*=\s*(\S+)/) { print "$1\n" }' /mir/uk/setup_uk/etc/config.properties`"
106   DBPASS="`perl -ne 'if (/\s*Database\.Password\s*=\s*(\S+)/) { print "$1\n" }' /mir/uk/setup_uk/etc/config.properties`"
107 else
108   if [ -z "$DBNAME" ]; then DBNAME="$SITE"; fi
109   if [ -z "$DBUSER" ]; then DBUSER="$SITE"; fi
110   if [ -z "$DBPASS" ]; then DBPASS="`pwgen -s 8 1`"; fi
111 fi
112
113 if [ -z "$CONFIGPROPERTIES" ]; then CONFIGPROPERTIES="$CONFDIR/config.properties"; fi
114 if [ ! -e "$CONFIGPROPERTIES" ]; then
115   optdie "$CONFIGPROPERTIES does not exist"
116 fi
117
118 CUR_CHECKPOINT=0
119 checkpoint()
120 {
121   CUR_CHECKPOINT=$(($CUR_CHECKPOINT + 1))
122   if [ -n "$START_CHECKPOINT" ]; then
123     if [ "$CUR_CHECKPOINT" -lt "$START_CHECKPOINT" ]; then
124       echo "Skipping checkpoint $CUR_CHECKPOINT: $@"
125       unset RUNNING
126     else
127       echo "Running from checkpoint $CUR_CHECKPOINT: $@"
128       RUNNING=1
129     fi
130   else
131     echo "Checkpoint $CUR_CHECKPOINT: $@"
132     RUNNING=1
133   fi
134 }
135
136 checkpoint "Prepare install directory: $INSTALLDIR"
137 if [ -n "$RUNNING" ]; then
138   mkdir -p "$INSTALLDIR"
139   chown "$OWNER" "$INSTALLDIR"
140   chmod g+s "$INSTALLDIR"
141 fi
142
143 checkpoint "Check out Mir [$MIRVERSION] from $MIRCVSROOT"
144 if [ -n "$RUNNING" ]; then
145   cd "$INSTALLDIR"
146   sudo -u "$USER" cvs -z3 -d"$MIRCVSROOT" checkout $MIRVERSIONOPT mir
147   chown -R "$OWNER" mir
148 fi
149 checkpoint "Check out site templates [$SITEVERSION] from $SITECVSROOT"
150 if [ -n "$RUNNING" ]; then
151   cd "$INSTALLDIR"
152   sudo -u "$USER" cvs -z3 -d"$SITECVSROOT" checkout $SITEVERSIONOPT "$SITEOVERLAYDIR"
153   chown -R "$OWNER" "$SITEOVERLAYDIR"
154 fi
155
156 checkpoint "Prepare production directory: $PRODUCTIONDIR"
157 if [ -n "$RUNNING" ]; then
158   mkdir -p "$PRODUCTIONDIR"
159   chown "$TOMCATOWNER" "$PRODUCTIONDIR"
160   chmod g+s "$PRODUCTIONDIR"
161   cd "$PRODUCTIONDIR"
162   PRODUCTIONSUBDIRS="abstract comments content de en img inc style"
163   mkdir -p $PRODUCTIONSUBDIRS
164   chown "$TOMCATOWNER" $PRODUCTIONSUBDIRS
165   ln -snf en/index.html
166 fi
167
168 munge_config_file()
169 {
170   (
171     export SITE
172     export FQDN
173     export MIRRORFQDN
174     export SECUREFQDN
175     export ALIASES
176     export USER
177     export DBNAME
178     export DBUSER
179     export DBPASS
180     export PRODUCTIONDIR
181
182     perl -w "$SHAREDIR/munge_config_file.pl" <"$1" >"$2"
183     chown "$OWNER" "$2"
184   )
185 }
186
187 checkpoint "Install robots.txt file"
188 if [ -n "$RUNNING" ]; then
189   munge_config_file "$CONFDIR/robots.txt" "$PRODUCTIONDIR/robots.txt"
190 fi
191
192 checkpoint "Install site-specific Apache configuration file (non-SSL)"
193 if [ -n "$RUNNING" ]; then
194   mkdir -p "$APACHECONFDIR"
195   munge_config_file "$CONFDIR/site-httpd.conf" "$APACHECONFDIR/$SITE.conf"
196 fi
197
198 checkpoint "Install site-specific Apache configuration file (SSL on dedicated IP)"
199 if [ -n "$RUNNING" ]; then
200   mkdir -p "$APACHECONFDIR/ssl-dedicated"
201   munge_config_file "$CONFDIR/site-ssl-dedicated-httpd.conf" "$APACHECONFDIR/ssl-dedicated/$SITE.conf"
202 fi
203
204 checkpoint "Install site-specific Apache configuration file (SSL fragment for webapp via canonical host)"
205 if [ -n "$RUNNING" ]; then
206   mkdir -p "$APACHECONFDIR/ssl-fragments"
207   munge_config_file "$CONFDIR/site-ssl-httpd-fragment.conf" "$APACHECONFDIR/ssl-fragments/$SITE.conf"
208 fi
209
210 checkpoint "Restart Apache with new configuration"
211 if [ -n "$RUNNING" ]; then
212   "$APACHECTL" configtest
213   "$APACHECTL" graceful
214 fi
215
216 checkpoint "Overlay /etc from site template"
217 if [ -n "$RUNNING" ]; then
218   cd "$INSTALLDIR/mir"
219   mv etc etc.orig
220   ln -snf "../$SITEOVERLAYDIR/etc"
221 fi
222
223 if [ -n "$SHAREDB" ]; then
224   checkpoint "Sharing existing database (not creating)"
225   checkpoint "Sharing existing database (not importing/installing)"
226   checkpoint "Sharing existing database (not setting permissions)"
227 else
228   checkpoint "Create database"
229   if [ -n "$RUNNING" ]; then
230     sudo -u postgres createdb --encoding=unicode "$DBNAME"
231     sudo -u postgres psql "$DBNAME" <<EOF
232 CREATE USER $DBUSER WITH PASSWORD '$DBPASS' NOCREATEDB NOCREATEUSER;
233 UPDATE pg_database SET datdba=(SELECT usesysid FROM pg_user WHERE usename='$DBUSER') WHERE datname='$DBNAME';
234 EOF
235   fi
236   
237   if [ -n "$DBDUMP" ]; then
238     checkpoint "Import database dump"
239     if [ -n "$RUNNING" ]; then
240       zcat "$DBDUMP" | sudo -u postgres pg_restore -d "$DBNAME" -O -x
241     fi
242   else
243     checkpoint "Install default database"
244     if [ -n "$RUNNING" ]; then
245       for i in "$INSTALLDIR"/mir/dbscripts/{create_pg,help*,populate*}.sql; do
246         sudo -u postgres psql -f $i "$DBNAME"
247       done
248     fi
249   fi
250
251   checkpoint "Set database permissions"
252   if [ -n "$RUNNING" ]; then
253     # Clumsy -- produces errors which we should ignore
254     echo >&2 "Don't worry about errors from some of the GRANTs here"
255     sudo -u postgres psql -qto "|psql \"$DBNAME\"" "$DBNAME" <<EOF
256 SELECT 'GRANT ALL ON '||relname||' TO $DBUSER;'
257 FROM pg_class
258 WHERE relname not like 'pg%'
259 ORDER by relname;
260 EOF
261   fi
262 fi
263
264 checkpoint "Install config.properties"
265 if [ -n "$RUNNING" ]; then
266   touch "$INSTALLDIR/mir/etc/config.properties"
267   chmod "$PRIVMODE" "$INSTALLDIR/mir/etc/config.properties"
268   munge_config_file "$CONFIGPROPERTIES" "$INSTALLDIR/mir/etc/config.properties"
269 fi
270
271 checkpoint "Running ant to build Mir"
272 if [ -n "$RUNNING" ]; then
273   cd "$INSTALLDIR/mir"
274   sudo -u "$USER" ant
275 fi
276
277 checkpoint "Fixing file permissions"
278 if [ -n "$RUNNING" ]; then
279   cd "$INSTALLDIR/mir"
280   sed -e "s/^GROUP=.*\$/GROUP=$TOMCATGROUP/" perms.sh-dist >perms.sh
281   chmod +x perms.sh
282   ./perms.sh
283 fi
284
285 checkpoint "Linking into Tomcat Web apps directory"
286 if [ -n "$RUNNING" ]; then
287   cd "$WEBAPPSDIR"
288   ln -snf "$INSTALLDIR/mir/bin/mir" "$SITE"
289 fi
290
291 checkpoint "All done!"