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 : |