Statistics
| Branch: | Tag: | Revision:

root / snf-image-host / snf-image-update-helper.in @ 448a829f

History | View | Annotate | Download (6.5 kB)

1 d51a95a8 Nikos Skalkotos
#!/bin/bash
2 d51a95a8 Nikos Skalkotos
3 3709b5f4 Nikos Skalkotos
# Copyright (C) 2011 GRNET S.A. 
4 3709b5f4 Nikos Skalkotos
#
5 3709b5f4 Nikos Skalkotos
# This program is free software; you can redistribute it and/or modify
6 3709b5f4 Nikos Skalkotos
# it under the terms of the GNU General Public License as published by
7 3709b5f4 Nikos Skalkotos
# the Free Software Foundation; either version 2 of the License, or
8 3709b5f4 Nikos Skalkotos
# (at your option) any later version.
9 3709b5f4 Nikos Skalkotos
#
10 3709b5f4 Nikos Skalkotos
# This program is distributed in the hope that it will be useful, but
11 3709b5f4 Nikos Skalkotos
# WITHOUT ANY WARRANTY; without even the implied warranty of
12 3709b5f4 Nikos Skalkotos
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 3709b5f4 Nikos Skalkotos
# General Public License for more details.
14 3709b5f4 Nikos Skalkotos
#
15 3709b5f4 Nikos Skalkotos
# You should have received a copy of the GNU General Public License
16 3709b5f4 Nikos Skalkotos
# along with this program; if not, write to the Free Software
17 3709b5f4 Nikos Skalkotos
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18 3709b5f4 Nikos Skalkotos
# 02110-1301, USA.
19 3709b5f4 Nikos Skalkotos
20 d51a95a8 Nikos Skalkotos
set -e
21 bad5ca1f Nikos Skalkotos
set -o pipefail
22 d51a95a8 Nikos Skalkotos
23 d51a95a8 Nikos Skalkotos
. @osdir@/common.sh
24 d51a95a8 Nikos Skalkotos
25 a1aef659 Nikos Skalkotos
usage() {
26 a1aef659 Nikos Skalkotos
    local rc="$1"
27 a1aef659 Nikos Skalkotos
28 a1aef659 Nikos Skalkotos
    cat <<EOF
29 a1aef659 Nikos Skalkotos
30 a1aef659 Nikos Skalkotos
Usage: $0 [options]
31 a1aef659 Nikos Skalkotos
32 a1aef659 Nikos Skalkotos
This script runs a debootstrap and creates a small Debian image populated with
33 a1aef659 Nikos Skalkotos
the snf-image-helper package. This needs to be done before the first use of
34 a1aef659 Nikos Skalkotos
ganeti's \`snf-image' guest OS type.
35 a1aef659 Nikos Skalkotos
36 a1aef659 Nikos Skalkotos
OPTIONS:
37 cfd38847 Nikos Skalkotos
    -c CACHE_FILE
38 cfd38847 Nikos Skalkotos
        Use this cache file, instead of the default
39 cfd38847 Nikos Skalkotos
        [default: $HELPER_CACHE_FILE]
40 cfd38847 Nikos Skalkotos
41 cfd38847 Nikos Skalkotos
    -d DIRECTORY
42 cfd38847 Nikos Skalkotos
        Use this directory to host the created files, instead of the default
43 cfd38847 Nikos Skalkotos
        [default: $HELPER_DIR]
44 cfd38847 Nikos Skalkotos
45 cfd38847 Nikos Skalkotos
    -h  Print this message
46 cfd38847 Nikos Skalkotos
47 cfd38847 Nikos Skalkotos
    -p PACKAGE
48 cfd38847 Nikos Skalkotos
        Install this deb package in the helper image, instead of the default
49 cfd38847 Nikos Skalkotos
        [default: $HELPER_PKG]
50 cfd38847 Nikos Skalkotos
51 cfd38847 Nikos Skalkotos
    -y  Assume Yes to all queries and do not prompt
52 a1aef659 Nikos Skalkotos
53 a1aef659 Nikos Skalkotos
EOF
54 a1aef659 Nikos Skalkotos
55 a1aef659 Nikos Skalkotos
    exit "$rc"
56 a1aef659 Nikos Skalkotos
}
57 a1aef659 Nikos Skalkotos
58 cfd38847 Nikos Skalkotos
while getopts "c:d:hp:y" opt; do
59 a1aef659 Nikos Skalkotos
    case $opt in
60 448a829f Nikos Skalkotos
        c) CACHE_FILE="$OPTARG"
61 448a829f Nikos Skalkotos
        OVERWRITTEN_CACHE_FILE="yes"
62 a1aef659 Nikos Skalkotos
            ;;
63 a1aef659 Nikos Skalkotos
        d) HELPER_DIR="$OPTARG"
64 a1aef659 Nikos Skalkotos
            ;;
65 a1aef659 Nikos Skalkotos
        h) usage 0
66 a1aef659 Nikos Skalkotos
            ;;
67 a1aef659 Nikos Skalkotos
        p) HELPER_PKG="$OPTARG"
68 a1aef659 Nikos Skalkotos
            ;;
69 a1aef659 Nikos Skalkotos
        y) NO_PROMPT="yes"
70 a1aef659 Nikos Skalkotos
            ;;
71 a1aef659 Nikos Skalkotos
        ?) log_error "Use \`-h' for help"; exit 1
72 a1aef659 Nikos Skalkotos
            ;;
73 a1aef659 Nikos Skalkotos
    esac
74 a1aef659 Nikos Skalkotos
done
75 a1aef659 Nikos Skalkotos
76 448a829f Nikos Skalkotos
if [ x"$OVERWRITTEN_CACHE_FILE" != "xyes" ] ; then
77 448a829f Nikos Skalkotos
    CACHE_FILE="$HELPER_CACHE_FILE"
78 448a829f Nikos Skalkotos
fi
79 448a829f Nikos Skalkotos
80 a1aef659 Nikos Skalkotos
echo
81 a1aef659 Nikos Skalkotos
echo "This is the update helper image script for snf-image."
82 a1aef659 Nikos Skalkotos
echo "If you don't know what to do, use \`-h'."
83 a1aef659 Nikos Skalkotos
echo
84 a1aef659 Nikos Skalkotos
85 a1aef659 Nikos Skalkotos
if [ ! -d "$HELPER_DIR" -o ! -w "$HELPER_DIR" ]; then
86 cfd38847 Nikos Skalkotos
    log_error "ERROR:"
87 a1aef659 Nikos Skalkotos
    log_error "Helper directory \`$HELPER_DIR' does not exist or the script" \
88 a1aef659 Nikos Skalkotos
    "has no write permission on it."
89 a1aef659 Nikos Skalkotos
    exit 1
90 a1aef659 Nikos Skalkotos
fi
91 a1aef659 Nikos Skalkotos
92 a1aef659 Nikos Skalkotos
if [ ! -r "$HELPER_PKG" ]; then
93 cfd38847 Nikos Skalkotos
    log_error "ERROR:"
94 a1aef659 Nikos Skalkotos
    log_error "Helper package \`$HELPER_PKG' does not exist or is not " \
95 a1aef659 Nikos Skalkotos
    "readable by the script."
96 52ac594c Nikos Skalkotos
    exit 1
97 52ac594c Nikos Skalkotos
fi
98 bad5ca1f Nikos Skalkotos
99 52ac594c Nikos Skalkotos
cat >&1 <<EOF
100 a1aef659 Nikos Skalkotos
This program will overwrite the following files if present:
101 52ac594c Nikos Skalkotos
  \`$HELPER_DIR/initrd'
102 52ac594c Nikos Skalkotos
  \`$HELPER_DIR/kernel'
103 52ac594c Nikos Skalkotos
  \`$HELPER_DIR/image'
104 52ac594c Nikos Skalkotos
EOF
105 52ac594c Nikos Skalkotos
106 52ac594c Nikos Skalkotos
while [[ 1 ]]; do
107 c36351f5 Nikos Skalkotos
    echo -n "Do you want to continue [y/N]? "
108 a1aef659 Nikos Skalkotos
    if [ "x$NO_PROMPT" = "xyes" ]; then
109 a1aef659 Nikos Skalkotos
        echo "y";
110 a1aef659 Nikos Skalkotos
        break;
111 a1aef659 Nikos Skalkotos
    fi
112 a1aef659 Nikos Skalkotos
113 52ac594c Nikos Skalkotos
    read answer
114 52ac594c Nikos Skalkotos
    [ "$(echo -n "$answer" | tr [A-Z] [a-z])" = "y" ] && break
115 52ac594c Nikos Skalkotos
    if [ -z "$answer" -o "$(echo -n "$answer" | tr [A-Z] [a-z])" = "n" ]; then
116 c36351f5 Nikos Skalkotos
        log_error "Abort."
117 52ac594c Nikos Skalkotos
        exit 1
118 52ac594c Nikos Skalkotos
    fi
119 52ac594c Nikos Skalkotos
done
120 52ac594c Nikos Skalkotos
121 52ac594c Nikos Skalkotos
rm -f "$HELPER_DIR/initrd" "$HELPER_DIR/kernel" "$HELPER_DIR/image"
122 52ac594c Nikos Skalkotos
123 52ac594c Nikos Skalkotos
echo -n "Allocating space for helper disk image..."
124 bad5ca1f Nikos Skalkotos
helper_img=$(mktemp "$HELPER_DIR/image.XXXXXX")
125 d51a95a8 Nikos Skalkotos
126 bad5ca1f Nikos Skalkotos
dd if=/dev/zero of="$helper_img" bs=1k count=400000 &> /dev/null
127 52ac594c Nikos Skalkotos
echo "done"
128 52ac594c Nikos Skalkotos
129 bad5ca1f Nikos Skalkotos
echo "Creating partitions..."
130 55d2fc47 Nikos Skalkotos
blockdev=$("$LOSETUP" -sf $helper_img)
131 55d2fc47 Nikos Skalkotos
add_cleanup "$LOSETUP" -d "$blockdev"
132 d51a95a8 Nikos Skalkotos
133 52ac594c Nikos Skalkotos
sleep 1 # sometimes losetup returns and the device is still busy..
134 52ac594c Nikos Skalkotos
135 bad5ca1f Nikos Skalkotos
format_disk0 "$blockdev" "extdump"  2>&1 | sed -e 's/^/CFDISK: /g'
136 d51a95a8 Nikos Skalkotos
137 bad5ca1f Nikos Skalkotos
root_dev=$(map_disk0 "$blockdev")-1
138 bad5ca1f Nikos Skalkotos
add_cleanup unmap_disk0 "$blockdev"
139 d51a95a8 Nikos Skalkotos
140 63d6058d Nikos Skalkotos
echo Creating and configuring filesystem...
141 bad5ca1f Nikos Skalkotos
mkfs.ext3 "$root_dev" 2>&1 | sed -e 's/^/MKFS.EXT3: /g'
142 aac16418 Nikos Skalkotos
# The helper vm should never do filesystem checks...
143 bad5ca1f Nikos Skalkotos
tune2fs -i 0 -c 0 "$root_dev" 2>&1 | sed -e 's/^/TUNE2FS: /g'
144 d51a95a8 Nikos Skalkotos
145 bad5ca1f Nikos Skalkotos
target=$(mktemp -d)
146 bad5ca1f Nikos Skalkotos
add_cleanup rmdir "$target"
147 d51a95a8 Nikos Skalkotos
148 bad5ca1f Nikos Skalkotos
mount "$root_dev" "$target"
149 bad5ca1f Nikos Skalkotos
add_cleanup umount "$root_dev"
150 d51a95a8 Nikos Skalkotos
151 448a829f Nikos Skalkotos
echo -n "Checking for cached root filesystem file \`$CACHE_FILE'..."
152 448a829f Nikos Skalkotos
if [  -f "$CACHE_FILE" ]; then
153 52ac594c Nikos Skalkotos
    echo "found"
154 5a31f7ef Nikos Skalkotos
155 448a829f Nikos Skalkotos
    while [[ 1 ]]; do
156 448a829f Nikos Skalkotos
        echo -n "Use the cached file [Y/n]? "
157 448a829f Nikos Skalkotos
        if [ "x$NO_PROMPT" = "xyes" ]; then
158 448a829f Nikos Skalkotos
            echo "y";
159 448a829f Nikos Skalkotos
            break;
160 448a829f Nikos Skalkotos
        fi
161 5a31f7ef Nikos Skalkotos
162 448a829f Nikos Skalkotos
        read answer
163 5a31f7ef Nikos Skalkotos
    
164 448a829f Nikos Skalkotos
        if [ -z "$answer" -o "$(tr [A-Z] [a-z] <<< "$answer")" = "y" ]; then
165 448a829f Nikos Skalkotos
            break;
166 448a829f Nikos Skalkotos
        elif [ "$(tr [A-Z] [a-z] <<< "$answer" )" = "n" ]; then
167 448a829f Nikos Skalkotos
            do_debootstrap "$target"
168 448a829f Nikos Skalkotos
            break;
169 448a829f Nikos Skalkotos
        fi
170 448a829f Nikos Skalkotos
    done
171 448a829f Nikos Skalkotos
else
172 448a829f Nikos Skalkotos
    echo "not found"
173 448a829f Nikos Skalkotos
    do_debootstrap "$target"
174 d51a95a8 Nikos Skalkotos
fi
175 d51a95a8 Nikos Skalkotos
176 448a829f Nikos Skalkotos
tar xf "$HELPER_CACHE_FILE" -C "$target"
177 448a829f Nikos Skalkotos
178 63d6058d Nikos Skalkotos
echo -n "Configuring the helper image..."
179 bad5ca1f Nikos Skalkotos
echo snf-image-helper > "$target/etc/hostname"
180 d51a95a8 Nikos Skalkotos
181 bad5ca1f Nikos Skalkotos
cat > "$target/etc/fstab" <<EOF
182 d51a95a8 Nikos Skalkotos
# /etc/fstab: static file system information.
183 d51a95a8 Nikos Skalkotos
#
184 d51a95a8 Nikos Skalkotos
# <file system>   <mount point>   <type>  <options>       <dump>  <pass>
185 d51a95a8 Nikos Skalkotos
/dev/sda1         /               ext3    defaults        0       1
186 d51a95a8 Nikos Skalkotos
proc              /proc           proc    defaults        0       0
187 d51a95a8 Nikos Skalkotos
EOF
188 52ac594c Nikos Skalkotos
echo "done"
189 d51a95a8 Nikos Skalkotos
190 52ac594c Nikos Skalkotos
echo -n "Extracting kernel..."
191 bad5ca1f Nikos Skalkotos
if [ ! -L "$target/vmlinuz" -o ! -L "$target/vmlinuz" ]; then
192 bad5ca1f Nikos Skalkotos
    echo -e "\033[1;31mfailed\033[0m"
193 bad5ca1f Nikos Skalkotos
    log_error "vmlinuz or initrd.img link in root is missing."
194 bad5ca1f Nikos Skalkotos
    log_error "I don't know how to find a usable kernel/initrd pair."
195 bad5ca1f Nikos Skalkotos
    exit 1
196 d51a95a8 Nikos Skalkotos
fi
197 52ac594c Nikos Skalkotos
echo "done"
198 d51a95a8 Nikos Skalkotos
199 bad5ca1f Nikos Skalkotos
kernel=$(readlink -en "$target/vmlinuz")
200 bad5ca1f Nikos Skalkotos
initrd=$(readlink -en "$target/initrd.img")
201 d51a95a8 Nikos Skalkotos
202 bad5ca1f Nikos Skalkotos
echo "Moving $(basename "$kernel") and $(basename "$initrd") to \`$HELPER_DIR'"
203 bad5ca1f Nikos Skalkotos
mv "$kernel" "$initrd" "$HELPER_DIR"
204 d51a95a8 Nikos Skalkotos
205 bad5ca1f Nikos Skalkotos
kernel=$(basename "$kernel")
206 bad5ca1f Nikos Skalkotos
initrd=$(basename "$initrd")
207 d51a95a8 Nikos Skalkotos
208 bad5ca1f Nikos Skalkotos
(cd "$HELPER_DIR"; ln -fs "$kernel" kernel; ln -fs "$initrd" initrd)
209 d51a95a8 Nikos Skalkotos
210 bad5ca1f Nikos Skalkotos
rm "$target/vmlinuz" "$target/initrd.img"
211 d51a95a8 Nikos Skalkotos
212 52ac594c Nikos Skalkotos
echo "Installing snf-image-helper pkg in the new image..."
213 bad5ca1f Nikos Skalkotos
cp "$HELPER_PKG" "$target/tmp/"
214 bad5ca1f Nikos Skalkotos
pkg_name=$(basename "$HELPER_PKG")
215 bad5ca1f Nikos Skalkotos
add_cleanup rm "$target/tmp/$pkg_name"
216 bad5ca1f Nikos Skalkotos
chroot "$target" dpkg -i "/tmp/$pkg_name" 2>&1 | sed -e 's/^/DPKG: /g'
217 3b0420ce Nikos Skalkotos
218 bad5ca1f Nikos Skalkotos
cat > "$target/etc/rc.local" <<EOF
219 3b0420ce Nikos Skalkotos
#!/bin/sh -e
220 3b0420ce Nikos Skalkotos
#
221 3b0420ce Nikos Skalkotos
# rc.local
222 3b0420ce Nikos Skalkotos
#
223 3b0420ce Nikos Skalkotos
# This script is executed at the end of each multiuser runlevel.
224 3b0420ce Nikos Skalkotos
# Make sure that the script will "exit 0" on success or any other
225 3b0420ce Nikos Skalkotos
# value on error.
226 3b0420ce Nikos Skalkotos
#
227 3b0420ce Nikos Skalkotos
# In order to enable or disable this script just change the execution
228 3b0420ce Nikos Skalkotos
# bits.
229 3b0420ce Nikos Skalkotos
#
230 3b0420ce Nikos Skalkotos
# By default this script does nothing.
231 3b0420ce Nikos Skalkotos
232 ff7783b8 Vangelis Koukis
if ! grep -q snf_image_activate_helper /proc/cmdline; then
233 ff7783b8 Vangelis Koukis
    echo "WARNING: NOT calling snf-image-helper, add snf_image_activate_helper"
234 ff7783b8 Vangelis Koukis
    echo "to the kernel command line if you want to do so."
235 ff7783b8 Vangelis Koukis
else
236 ff7783b8 Vangelis Koukis
    /usr/bin/snf-image-helper --force
237 ff7783b8 Vangelis Koukis
fi
238 3b0420ce Nikos Skalkotos
239 3b0420ce Nikos Skalkotos
exit 0
240 3b0420ce Nikos Skalkotos
EOF
241 3b0420ce Nikos Skalkotos
242 bad5ca1f Nikos Skalkotos
chmod +x "$target/etc/rc.local"
243 3b0420ce Nikos Skalkotos
244 52ac594c Nikos Skalkotos
echo "done"
245 52ac594c Nikos Skalkotos
246 d51a95a8 Nikos Skalkotos
cleanup
247 d51a95a8 Nikos Skalkotos
248 bad5ca1f Nikos Skalkotos
mv "$helper_img" "$HELPER_DIR/image"
249 d51a95a8 Nikos Skalkotos
250 d51a95a8 Nikos Skalkotos
trap - EXIT
251 d51a95a8 Nikos Skalkotos
252 63d6058d Nikos Skalkotos
echo "Files in \`$HELPER_DIR' were updated successfully"
253 d51a95a8 Nikos Skalkotos
exit 0
254 d51a95a8 Nikos Skalkotos
255 d51a95a8 Nikos Skalkotos
# vim: set sta sts=4 shiftwidth=4 sw=4 et ai :