Statistics
| Branch: | Tag: | Revision:

root / snf-image-host / snf-image-update-helper.in @ 2187080b

History | View | Annotate | Download (5.7 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 bd0a7bd3 Nikos Skalkotos
set -o errtrace
23 d51a95a8 Nikos Skalkotos
24 d51a95a8 Nikos Skalkotos
. @osdir@/common.sh
25 d51a95a8 Nikos Skalkotos
26 a1aef659 Nikos Skalkotos
usage() {
27 a1aef659 Nikos Skalkotos
    local rc="$1"
28 a1aef659 Nikos Skalkotos
29 a1aef659 Nikos Skalkotos
    cat <<EOF
30 a1aef659 Nikos Skalkotos
31 a1aef659 Nikos Skalkotos
Usage: $0 [options]
32 a1aef659 Nikos Skalkotos
33 a1aef659 Nikos Skalkotos
This script runs a debootstrap and creates a small Debian image populated with
34 a1aef659 Nikos Skalkotos
the snf-image-helper package. This needs to be done before the first use of
35 a1aef659 Nikos Skalkotos
ganeti's \`snf-image' guest OS type.
36 a1aef659 Nikos Skalkotos
37 a1aef659 Nikos Skalkotos
OPTIONS:
38 cfd38847 Nikos Skalkotos
    -d DIRECTORY
39 cfd38847 Nikos Skalkotos
        Use this directory to host the created files, instead of the default
40 cfd38847 Nikos Skalkotos
        [default: $HELPER_DIR]
41 cfd38847 Nikos Skalkotos
42 cfd38847 Nikos Skalkotos
    -h  Print this message
43 cfd38847 Nikos Skalkotos
44 cfd38847 Nikos Skalkotos
    -p PACKAGE
45 cfd38847 Nikos Skalkotos
        Install this deb package in the helper image, instead of the default
46 cfd38847 Nikos Skalkotos
        [default: $HELPER_PKG]
47 cfd38847 Nikos Skalkotos
48 53a5929f Nikos Skalkotos
    -r  Don't use any existing cache
49 53a5929f Nikos Skalkotos
50 cfd38847 Nikos Skalkotos
    -y  Assume Yes to all queries and do not prompt
51 a1aef659 Nikos Skalkotos
52 a1aef659 Nikos Skalkotos
EOF
53 a1aef659 Nikos Skalkotos
54 a1aef659 Nikos Skalkotos
    exit "$rc"
55 a1aef659 Nikos Skalkotos
}
56 a1aef659 Nikos Skalkotos
57 53a5929f Nikos Skalkotos
while getopts "d:hp:ry" opt; do
58 a1aef659 Nikos Skalkotos
    case $opt in
59 a1aef659 Nikos Skalkotos
        d) HELPER_DIR="$OPTARG"
60 a1aef659 Nikos Skalkotos
            ;;
61 a1aef659 Nikos Skalkotos
        h) usage 0
62 a1aef659 Nikos Skalkotos
            ;;
63 a1aef659 Nikos Skalkotos
        p) HELPER_PKG="$OPTARG"
64 a1aef659 Nikos Skalkotos
            ;;
65 53a5929f Nikos Skalkotos
        r) NO_CACHE="yes"
66 53a5929f Nikos Skalkotos
            ;;
67 a1aef659 Nikos Skalkotos
        y) NO_PROMPT="yes"
68 a1aef659 Nikos Skalkotos
            ;;
69 a1aef659 Nikos Skalkotos
        ?) log_error "Use \`-h' for help"; exit 1
70 a1aef659 Nikos Skalkotos
            ;;
71 a1aef659 Nikos Skalkotos
    esac
72 a1aef659 Nikos Skalkotos
done
73 a1aef659 Nikos Skalkotos
74 a1aef659 Nikos Skalkotos
echo
75 a1aef659 Nikos Skalkotos
echo "This is the update helper image script for snf-image."
76 a1aef659 Nikos Skalkotos
echo "If you don't know what to do, use \`-h'."
77 a1aef659 Nikos Skalkotos
echo
78 a1aef659 Nikos Skalkotos
79 a1aef659 Nikos Skalkotos
if [ ! -d "$HELPER_DIR" -o ! -w "$HELPER_DIR" ]; then
80 a1aef659 Nikos Skalkotos
    log_error "Helper directory \`$HELPER_DIR' does not exist or the script" \
81 a1aef659 Nikos Skalkotos
    "has no write permission on it."
82 a1aef659 Nikos Skalkotos
    exit 1
83 a1aef659 Nikos Skalkotos
fi
84 a1aef659 Nikos Skalkotos
85 621a9a34 Nikos Skalkotos
if [ ! -e "$MULTISTRAP_CONFIG" ]; then
86 621a9a34 Nikos Skalkotos
    log_error "Multistrap configuration file: \`$MULTISTRAP_CONFIG' does not" \
87 621a9a34 Nikos Skalkotos
    "exist or is not readable by the script."
88 621a9a34 Nikos Skalkotos
    exit 1
89 621a9a34 Nikos Skalkotos
fi
90 621a9a34 Nikos Skalkotos
91 52ac594c Nikos Skalkotos
cat >&1 <<EOF
92 a1aef659 Nikos Skalkotos
This program will overwrite the following files if present:
93 52ac594c Nikos Skalkotos
  \`$HELPER_DIR/initrd'
94 52ac594c Nikos Skalkotos
  \`$HELPER_DIR/kernel'
95 52ac594c Nikos Skalkotos
  \`$HELPER_DIR/image'
96 52ac594c Nikos Skalkotos
EOF
97 52ac594c Nikos Skalkotos
98 52ac594c Nikos Skalkotos
while [[ 1 ]]; do
99 c36351f5 Nikos Skalkotos
    echo -n "Do you want to continue [y/N]? "
100 a1aef659 Nikos Skalkotos
    if [ "x$NO_PROMPT" = "xyes" ]; then
101 a1aef659 Nikos Skalkotos
        echo "y";
102 a1aef659 Nikos Skalkotos
        break;
103 a1aef659 Nikos Skalkotos
    fi
104 a1aef659 Nikos Skalkotos
105 52ac594c Nikos Skalkotos
    read answer
106 52ac594c Nikos Skalkotos
    [ "$(echo -n "$answer" | tr [A-Z] [a-z])" = "y" ] && break
107 52ac594c Nikos Skalkotos
    if [ -z "$answer" -o "$(echo -n "$answer" | tr [A-Z] [a-z])" = "n" ]; then
108 c36351f5 Nikos Skalkotos
        log_error "Abort."
109 52ac594c Nikos Skalkotos
        exit 1
110 52ac594c Nikos Skalkotos
    fi
111 52ac594c Nikos Skalkotos
done
112 52ac594c Nikos Skalkotos
113 52ac594c Nikos Skalkotos
rm -f "$HELPER_DIR/initrd" "$HELPER_DIR/kernel" "$HELPER_DIR/image"
114 52ac594c Nikos Skalkotos
115 52ac594c Nikos Skalkotos
echo -n "Allocating space for helper disk image..."
116 bad5ca1f Nikos Skalkotos
helper_img=$(mktemp "$HELPER_DIR/image.XXXXXX")
117 9a4838f0 Nikos Skalkotos
add_cleanup rm -f "$helper_img"
118 9a4838f0 Nikos Skalkotos
dd if=/dev/zero of="$helper_img" bs=1k count=400000 &> /dev/null
119 52ac594c Nikos Skalkotos
echo "done"
120 52ac594c Nikos Skalkotos
121 bad5ca1f Nikos Skalkotos
echo "Creating partitions..."
122 55d2fc47 Nikos Skalkotos
blockdev=$("$LOSETUP" -sf $helper_img)
123 55d2fc47 Nikos Skalkotos
add_cleanup "$LOSETUP" -d "$blockdev"
124 d51a95a8 Nikos Skalkotos
125 52ac594c Nikos Skalkotos
sleep 1 # sometimes losetup returns and the device is still busy..
126 52ac594c Nikos Skalkotos
127 bad5ca1f Nikos Skalkotos
format_disk0 "$blockdev" "extdump"  2>&1 | sed -e 's/^/CFDISK: /g'
128 d51a95a8 Nikos Skalkotos
129 bad5ca1f Nikos Skalkotos
root_dev=$(map_disk0 "$blockdev")-1
130 bad5ca1f Nikos Skalkotos
add_cleanup unmap_disk0 "$blockdev"
131 d51a95a8 Nikos Skalkotos
132 63d6058d Nikos Skalkotos
echo Creating and configuring filesystem...
133 bad5ca1f Nikos Skalkotos
mkfs.ext3 "$root_dev" 2>&1 | sed -e 's/^/MKFS.EXT3: /g'
134 aac16418 Nikos Skalkotos
# The helper vm should never do filesystem checks...
135 bad5ca1f Nikos Skalkotos
tune2fs -i 0 -c 0 "$root_dev" 2>&1 | sed -e 's/^/TUNE2FS: /g'
136 d51a95a8 Nikos Skalkotos
137 bad5ca1f Nikos Skalkotos
target=$(mktemp -d)
138 bad5ca1f Nikos Skalkotos
add_cleanup rmdir "$target"
139 d51a95a8 Nikos Skalkotos
140 bad5ca1f Nikos Skalkotos
mount "$root_dev" "$target"
141 bad5ca1f Nikos Skalkotos
add_cleanup umount "$root_dev"
142 d51a95a8 Nikos Skalkotos
143 2187080b Nikos Skalkotos
do_multistrap "$target"
144 d259b27c Nikos Skalkotos
145 2187080b Nikos Skalkotos
# Save the package list
146 2187080b Nikos Skalkotos
chroot "$target" dpkg-query -W  > "$HELPER_DIR/packages"
147 448a829f Nikos Skalkotos
148 63d6058d Nikos Skalkotos
echo -n "Configuring the helper image..."
149 bad5ca1f Nikos Skalkotos
echo snf-image-helper > "$target/etc/hostname"
150 d51a95a8 Nikos Skalkotos
151 bad5ca1f Nikos Skalkotos
cat > "$target/etc/fstab" <<EOF
152 d51a95a8 Nikos Skalkotos
# /etc/fstab: static file system information.
153 d51a95a8 Nikos Skalkotos
#
154 d51a95a8 Nikos Skalkotos
# <file system>   <mount point>   <type>  <options>       <dump>  <pass>
155 d51a95a8 Nikos Skalkotos
/dev/sda1         /               ext3    defaults        0       1
156 d51a95a8 Nikos Skalkotos
proc              /proc           proc    defaults        0       0
157 d51a95a8 Nikos Skalkotos
EOF
158 52ac594c Nikos Skalkotos
echo "done"
159 d51a95a8 Nikos Skalkotos
160 52ac594c Nikos Skalkotos
echo -n "Extracting kernel..."
161 bad5ca1f Nikos Skalkotos
if [ ! -L "$target/vmlinuz" -o ! -L "$target/vmlinuz" ]; then
162 bad5ca1f Nikos Skalkotos
    echo -e "\033[1;31mfailed\033[0m"
163 bad5ca1f Nikos Skalkotos
    log_error "vmlinuz or initrd.img link in root is missing."
164 bad5ca1f Nikos Skalkotos
    log_error "I don't know how to find a usable kernel/initrd pair."
165 bad5ca1f Nikos Skalkotos
    exit 1
166 d51a95a8 Nikos Skalkotos
fi
167 52ac594c Nikos Skalkotos
echo "done"
168 d51a95a8 Nikos Skalkotos
169 bf8df441 Nikos Skalkotos
kernel="$target/$(chroot "$target" readlink -en /vmlinuz)"
170 bf8df441 Nikos Skalkotos
initrd="$target/$(chroot "$target" readlink -en /initrd.img)"
171 d51a95a8 Nikos Skalkotos
172 bad5ca1f Nikos Skalkotos
echo "Moving $(basename "$kernel") and $(basename "$initrd") to \`$HELPER_DIR'"
173 ab39c5c5 Nikos Skalkotos
cp "$kernel" "$initrd" "$HELPER_DIR"
174 d51a95a8 Nikos Skalkotos
175 bad5ca1f Nikos Skalkotos
kernel=$(basename "$kernel")
176 bad5ca1f Nikos Skalkotos
initrd=$(basename "$initrd")
177 d51a95a8 Nikos Skalkotos
178 bad5ca1f Nikos Skalkotos
(cd "$HELPER_DIR"; ln -fs "$kernel" kernel; ln -fs "$initrd" initrd)
179 d51a95a8 Nikos Skalkotos
180 bad5ca1f Nikos Skalkotos
rm "$target/vmlinuz" "$target/initrd.img"
181 d51a95a8 Nikos Skalkotos
182 c9f5980b Nikos Skalkotos
183 2187080b Nikos Skalkotos
pkg_installed=$(grep snf-image-helper "$HELPER_DIR/packages" > /dev/null && echo yes)
184 c9f5980b Nikos Skalkotos
185 c9f5980b Nikos Skalkotos
if [ ! -r "$HELPER_PKG" -a -z "$pkg_installed" ]; then
186 c9f5980b Nikos Skalkotos
    log_error "ERROR:"
187 c9f5980b Nikos Skalkotos
    log_error "Helper package \`$HELPER_PKG' does not exist or is not" \
188 c9f5980b Nikos Skalkotos
    "readable by the script."
189 c9f5980b Nikos Skalkotos
    exit 1
190 c9f5980b Nikos Skalkotos
fi
191 c9f5980b Nikos Skalkotos
192 c9f5980b Nikos Skalkotos
if [ -r "$HELPER_PKG" ]; then
193 c9f5980b Nikos Skalkotos
    echo "Installing snf-image-helper pkg in the new image..."
194 c9f5980b Nikos Skalkotos
    cp "$HELPER_PKG" "$target/tmp/"
195 c9f5980b Nikos Skalkotos
    pkg_name=$(basename "$HELPER_PKG")
196 c9f5980b Nikos Skalkotos
    add_cleanup rm "$target/tmp/$pkg_name"
197 c9f5980b Nikos Skalkotos
    chroot "$target" dpkg -i "/tmp/$pkg_name" 2>&1 | sed -e 's/^/DPKG: /g'
198 2187080b Nikos Skalkotos
199 2187080b Nikos Skalkotos
    # Recreate package list
200 2187080b Nikos Skalkotos
    chroot "$target" dpkg-query -W  > "$HELPER_DIR/packages"
201 c9f5980b Nikos Skalkotos
else
202 c9f5980b Nikos Skalkotos
    echo "snf-image-helper pkg was installed from the apt repository."
203 c9f5980b Nikos Skalkotos
fi
204 3b0420ce Nikos Skalkotos
205 bad5ca1f Nikos Skalkotos
mv "$helper_img" "$HELPER_DIR/image"
206 d51a95a8 Nikos Skalkotos
207 63d6058d Nikos Skalkotos
echo "Files in \`$HELPER_DIR' were updated successfully"
208 d51a95a8 Nikos Skalkotos
exit 0
209 d51a95a8 Nikos Skalkotos
210 d51a95a8 Nikos Skalkotos
# vim: set sta sts=4 shiftwidth=4 sw=4 et ai :