Statistics
| Branch: | Tag: | Revision:

root / snf-image-host / snf-image-update-helper.in @ f0eed401

History | View | Annotate | Download (6.8 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 a1aef659 Nikos Skalkotos
        c) HELPER_CACHE_FILE="$OPTARG"
61 a1aef659 Nikos Skalkotos
            ;;
62 a1aef659 Nikos Skalkotos
        d) HELPER_DIR="$OPTARG"
63 a1aef659 Nikos Skalkotos
            ;;
64 a1aef659 Nikos Skalkotos
        h) usage 0
65 a1aef659 Nikos Skalkotos
            ;;
66 a1aef659 Nikos Skalkotos
        p) HELPER_PKG="$OPTARG"
67 a1aef659 Nikos Skalkotos
            ;;
68 a1aef659 Nikos Skalkotos
        y) NO_PROMPT="yes"
69 a1aef659 Nikos Skalkotos
            ;;
70 a1aef659 Nikos Skalkotos
        ?) log_error "Use \`-h' for help"; exit 1
71 a1aef659 Nikos Skalkotos
            ;;
72 a1aef659 Nikos Skalkotos
    esac
73 a1aef659 Nikos Skalkotos
done
74 a1aef659 Nikos Skalkotos
75 a1aef659 Nikos Skalkotos
echo
76 a1aef659 Nikos Skalkotos
echo "This is the update helper image script for snf-image."
77 a1aef659 Nikos Skalkotos
echo "If you don't know what to do, use \`-h'."
78 a1aef659 Nikos Skalkotos
echo
79 a1aef659 Nikos Skalkotos
80 a1aef659 Nikos Skalkotos
if [ ! -d "$HELPER_DIR" -o ! -w "$HELPER_DIR" ]; then
81 cfd38847 Nikos Skalkotos
    log_error "ERROR:"
82 a1aef659 Nikos Skalkotos
    log_error "Helper directory \`$HELPER_DIR' does not exist or the script" \
83 a1aef659 Nikos Skalkotos
    "has no write permission on it."
84 a1aef659 Nikos Skalkotos
    exit 1
85 a1aef659 Nikos Skalkotos
fi
86 a1aef659 Nikos Skalkotos
87 a1aef659 Nikos Skalkotos
if [ ! -r "$HELPER_PKG" ]; then
88 cfd38847 Nikos Skalkotos
    log_error "ERROR:"
89 a1aef659 Nikos Skalkotos
    log_error "Helper package \`$HELPER_PKG' does not exist or is not " \
90 a1aef659 Nikos Skalkotos
    "readable by the script."
91 52ac594c Nikos Skalkotos
    exit 1
92 52ac594c Nikos Skalkotos
fi
93 bad5ca1f Nikos Skalkotos
94 52ac594c Nikos Skalkotos
cat >&1 <<EOF
95 a1aef659 Nikos Skalkotos
This program will overwrite the following files if present:
96 52ac594c Nikos Skalkotos
  \`$HELPER_DIR/initrd'
97 52ac594c Nikos Skalkotos
  \`$HELPER_DIR/kernel'
98 52ac594c Nikos Skalkotos
  \`$HELPER_DIR/image'
99 52ac594c Nikos Skalkotos
EOF
100 52ac594c Nikos Skalkotos
101 52ac594c Nikos Skalkotos
while [[ 1 ]]; do
102 c36351f5 Nikos Skalkotos
    echo -n "Do you want to continue [y/N]? "
103 a1aef659 Nikos Skalkotos
    if [ "x$NO_PROMPT" = "xyes" ]; then
104 a1aef659 Nikos Skalkotos
        echo "y";
105 a1aef659 Nikos Skalkotos
        break;
106 a1aef659 Nikos Skalkotos
    fi
107 a1aef659 Nikos Skalkotos
108 52ac594c Nikos Skalkotos
    read answer
109 52ac594c Nikos Skalkotos
    [ "$(echo -n "$answer" | tr [A-Z] [a-z])" = "y" ] && break
110 52ac594c Nikos Skalkotos
    if [ -z "$answer" -o "$(echo -n "$answer" | tr [A-Z] [a-z])" = "n" ]; then
111 c36351f5 Nikos Skalkotos
        log_error "Abort."
112 52ac594c Nikos Skalkotos
        exit 1
113 52ac594c Nikos Skalkotos
    fi
114 52ac594c Nikos Skalkotos
done
115 52ac594c Nikos Skalkotos
116 52ac594c Nikos Skalkotos
rm -f "$HELPER_DIR/initrd" "$HELPER_DIR/kernel" "$HELPER_DIR/image"
117 52ac594c Nikos Skalkotos
118 52ac594c Nikos Skalkotos
echo -n "Allocating space for helper disk image..."
119 bad5ca1f Nikos Skalkotos
helper_img=$(mktemp "$HELPER_DIR/image.XXXXXX")
120 d51a95a8 Nikos Skalkotos
121 bad5ca1f Nikos Skalkotos
dd if=/dev/zero of="$helper_img" bs=1k count=400000 &> /dev/null
122 52ac594c Nikos Skalkotos
echo "done"
123 52ac594c Nikos Skalkotos
124 bad5ca1f Nikos Skalkotos
echo "Creating partitions..."
125 55d2fc47 Nikos Skalkotos
blockdev=$("$LOSETUP" -sf $helper_img)
126 55d2fc47 Nikos Skalkotos
add_cleanup "$LOSETUP" -d "$blockdev"
127 d51a95a8 Nikos Skalkotos
128 52ac594c Nikos Skalkotos
sleep 1 # sometimes losetup returns and the device is still busy..
129 52ac594c Nikos Skalkotos
130 bad5ca1f Nikos Skalkotos
format_disk0 "$blockdev" "extdump"  2>&1 | sed -e 's/^/CFDISK: /g'
131 d51a95a8 Nikos Skalkotos
132 bad5ca1f Nikos Skalkotos
root_dev=$(map_disk0 "$blockdev")-1
133 bad5ca1f Nikos Skalkotos
add_cleanup unmap_disk0 "$blockdev"
134 d51a95a8 Nikos Skalkotos
135 63d6058d Nikos Skalkotos
echo Creating and configuring filesystem...
136 bad5ca1f Nikos Skalkotos
mkfs.ext3 "$root_dev" 2>&1 | sed -e 's/^/MKFS.EXT3: /g'
137 aac16418 Nikos Skalkotos
# The helper vm should never do filesystem checks...
138 bad5ca1f Nikos Skalkotos
tune2fs -i 0 -c 0 "$root_dev" 2>&1 | sed -e 's/^/TUNE2FS: /g'
139 d51a95a8 Nikos Skalkotos
140 bad5ca1f Nikos Skalkotos
target=$(mktemp -d)
141 bad5ca1f Nikos Skalkotos
add_cleanup rmdir "$target"
142 d51a95a8 Nikos Skalkotos
143 bad5ca1f Nikos Skalkotos
mount "$root_dev" "$target"
144 bad5ca1f Nikos Skalkotos
add_cleanup umount "$root_dev"
145 d51a95a8 Nikos Skalkotos
146 bad5ca1f Nikos Skalkotos
echo -n "Checking for cached root filesystem file \`$HELPER_CACHE_FILE'..." 
147 bad5ca1f Nikos Skalkotos
if [  -f "$HELPER_CACHE_FILE" ]; then
148 52ac594c Nikos Skalkotos
    echo "found"
149 bad5ca1f Nikos Skalkotos
    tar xf "$HELPER_CACHE_FILE" -C "$target"
150 d51a95a8 Nikos Skalkotos
else
151 52ac594c Nikos Skalkotos
    echo "not found"
152 52ac594c Nikos Skalkotos
    echo "Debootstraping to create a new root filesystem:"
153 5a31f7ef Nikos Skalkotos
154 5a31f7ef Nikos Skalkotos
    # Create a policy-rc.d file to deny init script execution
155 5a31f7ef Nikos Skalkotos
    mkdir -p "$target/usr/sbin"
156 5a31f7ef Nikos Skalkotos
    cat > "$target/usr/sbin/policy-rc.d" <<EOF
157 5a31f7ef Nikos Skalkotos
#!/bin/sh
158 5a31f7ef Nikos Skalkotos
exit 101
159 5a31f7ef Nikos Skalkotos
EOF
160 5a31f7ef Nikos Skalkotos
    chmod +x "$target/usr/sbin/policy-rc.d"
161 5a31f7ef Nikos Skalkotos
162 bad5ca1f Nikos Skalkotos
    debootstrap --arch amd64 --include "$HELPER_EXTRA_PKGS" \
163 a1aef659 Nikos Skalkotos
        --variant=minbase stable "$target" "$HELPER_MIRROR" 2>&1 | \
164 a1aef659 Nikos Skalkotos
        sed -e 's/^/DEBOOTSTRAP: /g'
165 d51a95a8 Nikos Skalkotos
166 5a31f7ef Nikos Skalkotos
    rm "$target/usr/sbin/policy-rc.d"
167 5a31f7ef Nikos Skalkotos
    
168 d51a95a8 Nikos Skalkotos
    # remove the downloaded debs, as they are no longer needed
169 bad5ca1f Nikos Skalkotos
    find "$target/var/cache/apt/archives" -type f -name '*.deb' -print0 | \
170 d51a95a8 Nikos Skalkotos
        xargs -r0 rm -f
171 d51a95a8 Nikos Skalkotos
172 bad5ca1f Nikos Skalkotos
    tmp_cache=$(mktemp "$HELPER_CACHE_FILE.XXXXXX")
173 a1aef659 Nikos Skalkotos
    tar cf "$tmp_cache" --one-file-system -C "$target" . || \
174 a1aef659 Nikos Skalkotos
        { rm "$tmp_cache"; false; }
175 bad5ca1f Nikos Skalkotos
    mv -f "$tmp_cache" "$HELPER_CACHE_FILE"
176 d51a95a8 Nikos Skalkotos
fi
177 d51a95a8 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 :