review dependencies globally : fewer are attached to myplc directly, and more are...
[bootmanager.git] / build.sh
1 #!/bin/bash
2 #
3 # Builds bootmanager.sh[.sgn], which is the PlanetLab Boot Manager script.
4 #
5 # The bootmanager.sh script contains in it a uuencoded tarball of the
6 # Boot Manager, customized for this PLC installation.
7 #
8 # Aaron Klingaman <alk@absarokasoft.com>
9 # Mark Huang <mlhuang@cs.princeton.edu>
10 # Marc E. Fiuczynski <mef@cs.princeton.edu>
11 # Copyright (C) 2004-2007 The Trustees of Princeton University
12 #
13 # $Id: build.sh,v 1.5 2006/04/03 19:40:55 mlhuang Exp $
14 #
15
16 # Source PLC configuration
17 if [ -f /etc/planetlab/plc_config ] ; then
18     . /etc/planetlab/plc_config
19 else
20     PLC_BOOT_HOST=boot.planet-lab.org
21     PLC_API_HOST=www.planet-lab.org
22     PLC_API_PATH=PLCAPI
23 fi
24
25 # Do not tolerate errors
26 set -e
27
28 NODEGROUP=$1
29
30 BOOTSTRAPDIR="/boot"
31 if [ -n "$NODEGROUP" ] ; then
32         BOOTSTRAPDIR="/boot/$NODEGROUP"
33 fi
34
35
36 # Change to our source directory
37 srcdir=$(cd $(dirname $0) && pwd -P)
38
39 # Translate configuration file
40 sed -i -e "s|SUPPORT_FILE_DIR=.*|SUPPORT_FILE_DIR=$BOOTSTRAPDIR|" $srcdir/source/configuration
41
42 # Source bootmanager configuration
43 . $srcdir/source/configuration
44
45 # Write boot script. plc_www/boot/index.php writes this script out
46 # after a nonce check.
47
48 DEST_SCRIPT=bootmanager.sh
49 if [ -n "$NODEGROUP" ] ; then
50         DEST_SCRIPT="${NODEGROUP}_bootmanager.sh"
51         # Remove the old version or any sym links prior to re-writing
52         rm -f ${DEST_SCRIPT}
53         rm -f ${DEST_SCRIPT}.sgn
54 fi
55
56 cat > $DEST_SCRIPT <<EOF
57 #!/bin/bash
58 #
59 # PlanetLab Boot Manager $VERSION
60 #
61 # DO NOT EDIT. Generated by $USER@$HOSTNAME at
62 # $(date) 
63 #
64
65 # Do not tolerate errors
66 set -e
67
68 UUDECODE=/usr/bin/uudecode
69
70 # once we get the beta cds out of use, this can be removed
71 if [ ! -x \$UUDECODE ]; then
72   UUDECODE=/tmp/uudecode
73   curl -s http://$PLC_BOOT_HOST/boot/uudecode.gz | gzip -d -c > \$UUDECODE
74   chmod +x \$UUDECODE
75 fi
76
77 EOF
78
79 echo '($UUDECODE | /bin/tar -C /tmp -xj) << _EOF_' >> $DEST_SCRIPT
80
81 # XXX Currently, the value of PLC_API_PORT is set to 80 by default, so
82 # that the portions of the web site that still use oldapi can continue
83 # to work. However, the Boot Manager supports HTTPS access, which we
84 # want to remain the default, so hard code 443 here.
85 sed -i -e "s@^BOOT_API_SERVER.*@BOOT_API_SERVER=https://$PLC_API_HOST:443/$PLC_API_PATH/@" \
86     $srcdir/source/configuration
87
88 # Replace the default debug SSH key
89 if [ -f "$PLC_DEBUG_SSH_KEY_PUB" ] ; then
90     install -D -m 644 "$PLC_DEBUG_SSH_KEY_PUB" $srcdir/source/debug_files/debug_root_ssh_key
91 fi
92
93 # Add python code from the following packages
94 # make sure they are in the 'Requires' header of the specfile
95 required_rpms="pypcilib pyplnet monitor-runlevelagent"
96 extra_libs=`mktemp -d "/tmp/.bootmanager.XXXXXX"`
97 mkdir $extra_libs/source
98 cp -p $(rpm -ql $required_rpms | grep -v '\.py[co]$') $extra_libs/source
99
100 # Embed the uuencoded tarball in the script
101 tar -cj -C $srcdir source/ -C $extra_libs source/ | uuencode -m - >> $DEST_SCRIPT
102
103 # Remove temp directory
104 rm -fr $extra_libs
105
106 echo '_EOF_' >> $DEST_SCRIPT
107 echo 'cd /tmp/source' >> $DEST_SCRIPT
108 echo 'chmod +x BootManager.py && ./BootManager.py' >> $DEST_SCRIPT
109
110 # Sign the whole script, if the keyring is on this machine.
111 if [ -f "$PLC_ROOT_GPG_KEY" -a -f "$PLC_ROOT_GPG_KEY_PUB" ] ; then
112     gpg --homedir=/root \
113         --no-default-keyring \
114         --keyring "$PLC_ROOT_GPG_KEY_PUB" \
115         --secret-keyring "$PLC_ROOT_GPG_KEY" \
116         --yes --sign --output $DEST_SCRIPT.sgn \
117         $DEST_SCRIPT
118 else
119     echo "Warning: Remember to sign $PWD/$DEST_SCRIPT!" >&2
120 fi