import repository from arizona
[raven.git] / webpage / downloads / initscript_stage2
1 #! /bin/sh
2
3 # <Program Name>
4 #   initscript
5 #
6 # <Authors>
7 #    Scott Baker
8 #    Justin Cappos
9 #    Jeffry Johnston
10 #    Jeremy Plichta
11 #
12 # <Purpose>
13 #    Downloads and installs stork on a node.
14
15 echo "Starting Stork initscript: Stage 2"
16
17 # logging: mark when the stage1 initscript started running
18 date > /tmp/stork_initscript_stage2.log
19
20 # save original PWD
21 OLDPWD=$PWD
22
23 # URL and location of install files on the repository
24 REPO_NAME=stork-repository.cs.arizona.edu
25 REPO_INSTALL_URL=http://$REPO_NAME/stork-install/client_rpm_list
26
27 # ////////// common code shared with stopscript_stage2 ///////////
28
29 # this file is set if the stopscript has been run
30 STORK_STOPPED_FILE="/usr/local/stork/var/stork_stopped"
31
32 # mutual exclusion
33 # from: http://www.unixreview.com/documents/s=9040/ur0402g/
34 # note: there is a race condition because test & creation of the lock file is
35 # not atomic
36
37 LOCKFILE="/tmp/stork_initscript_lock"
38 LOCKED=""
39
40 # file to hold the pid of the initscript. Created while the initscript
41 # mutex is held. Used to prevent running of pacman.
42 PIDFILE=/var/run/stork_initscript.pid
43
44 mutex_lock()
45 {
46    if test -r $LOCKFILE
47    then # If a lock file exists, check if the process that created it
48         # is still running.
49       PROCESS=$(cat $LOCKFILE)
50    else
51       PROCESS=" "
52    fi
53    if (ps -p $PROCESS) > /dev/null 2>&1
54    then
55       echo "The Stork initscript is already running"
56       exit 1
57    else
58       # The process is not running, create new lock file containing PID.
59       rm -f $LOCKFILE
60       echo $$ > $LOCKFILE
61       LOCKED="true"
62    fi
63    echo $$ > $PIDFILE
64 }
65
66 mutex_unlock()
67 {
68    rm $PIDFILE
69    # remove the lock file if the mutex was locked
70    if [ -n "$LOCKED" ]
71    then
72       rm -f $LOCKFILE
73       LOCKED=""
74    fi
75 }
76
77
78 # error reporting function
79 error()
80 {
81    echo
82    echo "Please E-mail stork-support@cs.arizona.edu if you believe you have"
83    echo "received this message in error."
84
85    # restore original PWD
86    cd $OLDPWD
87    mutex_unlock
88    exit 1
89 }
90
91 stork_installed()
92 {
93     if (rpm -q stork-client)
94     then
95         return 1
96     else
97         return 0
98     fi
99 }
100
101 # //////////////// end common code ////////////////
102
103 cleanup()
104 {
105    # logging: move the log files out of /tmp
106    mkdir -p /usr/local/stork/var/log/initscript
107    mv --force /tmp/stork_initscript*.log /usr/local/stork/var/log/initscript
108
109    # remove this script, its signature, and publickey from /tmp
110    # XXX This should have been done in the the stage1 initscript, but we'll
111    # defer until we have a valid reason to trouble PLC with new initscripts
112    rm -f /tmp/stork-stage2-initscript.*
113    rm -f /tmp/stork-publickey.*
114 }
115
116 try_restart()
117 {
118    # see if the stopscript was run
119    if [ ! -f $STORK_STOPPED_FILE ]
120    then
121       return
122    fi
123
124    # see if stork is installed
125    if [ ! $(stork_installed) ]
126    then
127       return
128    fi
129
130    echo "Restarting stork"
131
132    /etc/init.d/pacman.init restart
133
134    date > /tmp/stork_initscript_stage2_restart.log
135
136    rm -f $STORK_STOPPED_FILE
137
138    # remove files in /tmp
139    cleanup
140
141    mutex_unlock
142    exit 0
143 }
144
145 # check for root user
146 if [ $UID -ne "0" ]
147 then
148    echo "You must run this program with root permissions..."
149    error
150 fi
151
152 # grab a mutex so only one initscript can run at a time
153 mutex_lock
154
155 # if the stopscript was run, then we can do a quick restart of stork rather
156 # than a full reinstall
157 try_restart
158
159 # clean up in case this script was run before and failed
160 rm -rf /tmp/stork &> /dev/null
161
162 # create /tmp/stork directory
163 mkdir /tmp/stork
164 if [ $? -ne "0" ]
165 then
166    echo
167    echo "Could not create the /tmp/stork directory..."
168    error
169 fi
170
171 # export our root directory to Stork
172 echo "arizona_stork2" > /.exportdir
173 if [ $? -ne "0" ]
174 then
175    echo
176    echo "Could not create the /.exportdir file..."
177    error
178 fi
179
180 # tell stork that we want to be served
181 if [ -f /etc/slicename ]
182 then
183    SLICENAME=`cat /etc/slicename`
184    echo "Your slice name is '$SLICENAME'."
185 else
186    SLICENAME=$USER
187    echo "Unable to determine your slice name. Using '$SLICENAME' instead."
188 fi
189
190 # helper function to download stork packages from the repository. First
191 # downloads a list called 'client_rpm_list', and then downloads the RPM files
192 # contained inside that list.
193 repo_download()
194 {
195    echo "Downloading stork packages from repository..."
196
197    # download the list of stork packages from the repository
198    wget -O /tmp/stork/client_rpm_list "$REPO_INSTALL_URL"
199    if [ ! -f /tmp/stork/client_rpm_list -o $? -ne 0 ]
200    then
201       echo "Failed to download $REPO_INSTALL_URL"
202       error
203    fi
204
205    # now download the packages in the list
206    wget -P /tmp/stork -i /tmp/stork/client_rpm_list
207 }
208
209 # logging: mark when the stage1 initscript initiated download
210 date > /tmp/stork_initscript_stage2_predownload.log
211
212 repo_download
213
214 # logging: mark when the stage1 initscript finished download
215 date > /tmp/stork_initscript_stage2_postdownload.log
216
217 # change PWD to the /tmp/stork directory
218 cd /tmp/stork
219 if [ $? -ne "0" ]
220 then
221    echo
222    echo "Could not access the /tmp/stork directory..."
223    error
224 fi
225
226 # confirm that packages to be installed actually exist
227 if echo *.rpm | grep '*' > /dev/null
228 then
229    echo
230    echo "Error: Stork package download failed..."
231    error
232 fi
233
234 # build a list of packages to remove
235 packages=""
236 for filename in *.rpm
237 do
238   # convert filename to a package name
239   pack=`rpm -qp --qf "%{NAME}\n" $filename`
240   if [ $? -eq "0" ]
241   then
242     # check to make sure the package is installed before adding to remove list
243     rpm -q $pack &> /dev/null
244     if [ $? -eq "0" ]
245     then
246       packages="$packages $pack"
247     fi
248   fi
249 done
250
251 if [ -n "$packages" ]
252 then
253   # remove Stork packages and files
254   echo
255   echo "Removing Stork packages:$packages ..."
256
257   # yum is smart enough to recursively remove dependencies
258   if [ -e /usr/bin/yum ]; then
259       yum remove -y $packages
260   else
261       # rpm isn't as smart as yum and will fail if dependencies require
262       # the packages we're trying to remove
263       rpm -e $packages
264   fi
265 fi
266
267 # check and see if despite our efforts, stork is still installed
268
269 rpm -q stork-client
270 if [ $? -eq "0" ]; then
271   # uh oh! stork is still installed
272   # the rm -rf below would be really bad to execute, because we would delete
273   # the files, and yet be unable to reinstall stork
274   echo "Error! After we tried to remove stork, it's still installed"
275   error
276 fi
277
278 # remove anything left in /usr/local/stork/bin
279 rm -rf /usr/local/stork/bin/* &> /dev/null
280
281 # install Stork packages
282 echo
283 echo "Installing packages..."
284
285 # build a list of packages to install
286 packages=""
287 for filename in *.rpm
288 do
289   packages="$packages $filename"
290 done
291
292 # install the new stork packages
293 rpm -i $packages
294
295 # report package installation errors
296 if [ $? -ne "0" ]
297 then
298   echo "Warning: Possible error installing Stork packages..."
299 fi
300
301 # restore original PWD
302 cd $OLDPWD
303
304 # clean up temporary files
305 rm -rf /tmp/stork &> /dev/null
306
307 # logging: mark when the stage1 initscript started to run stork
308 date > /tmp/stork_initscript_stage2_prerunstork.log
309
310 # run stork to update keyfiles and download package lists
311 echo
312 echo "Attempting to communicate with stork..."
313 if stork
314 then
315    echo
316    echo "Congratulations, you have successfully bound to stork!"
317    echo
318    echo "For help, you may type stork --help"
319    echo
320    #echo "There is also a storkquery command that will provide information"
321    #echo "about packages in the repository."
322    echo
323    echo "For more help, visit the stork project online at"
324    echo "http://www.cs.arizona.edu/stork/.  Please contact"
325    echo "stork-support@cs.arizona.edu for additional assistance."
326 else
327    echo
328    echo "An error occurred during install finalization...  Please contact"
329    echo "stork-support@cs.arizona.edu for assistance."
330    mutex_unlock
331    exit 1
332 fi
333
334 # logging: mark when the stage1 initscript completed
335 date > /tmp/stork_initscript_stage2_complete.log
336
337 echo "user = $USER" > /tmp/stork_initscript_stage2_username.log
338 if [ -f /etc/slicename ]
339 then
340     echo "/etc/slicename follows:" >> /tmp/stork_initscript_stage2_username.log
341     cat /etc/slicename >> /tmp/stork_initscript_stage2_username.log
342 fi
343
344 # cleanup files in /tmp
345 cleanup
346
347 # done
348 mutex_unlock
349 exit 0