Statistics
| Branch: | Tag: | Revision:

root / snf-image-host / snf-image-update-helper.in @ 5a31f7ef

History | View | Annotate | Download (4.6 kB)

1 d51a95a8 Nikos Skalkotos
#!/bin/bash
2 d51a95a8 Nikos Skalkotos
3 d51a95a8 Nikos Skalkotos
set -e
4 bad5ca1f Nikos Skalkotos
set -o pipefail
5 d51a95a8 Nikos Skalkotos
6 d51a95a8 Nikos Skalkotos
. @osdir@/common.sh
7 d51a95a8 Nikos Skalkotos
8 52ac594c Nikos Skalkotos
if [ ! -e "$HELPER_PKG" ]; then
9 52ac594c Nikos Skalkotos
    log_error "Helper package \`$HELPER_PKG' not found."
10 ff7783b8 Vangelis Koukis
    log_error "You need to provide this for the script to work."
11 52ac594c Nikos Skalkotos
    exit 1
12 52ac594c Nikos Skalkotos
fi
13 bad5ca1f Nikos Skalkotos
14 52ac594c Nikos Skalkotos
cat >&1 <<EOF
15 52ac594c Nikos Skalkotos
This program will overwrite the following files:
16 52ac594c Nikos Skalkotos
  \`$HELPER_DIR/initrd'
17 52ac594c Nikos Skalkotos
  \`$HELPER_DIR/kernel'
18 52ac594c Nikos Skalkotos
  \`$HELPER_DIR/image'
19 52ac594c Nikos Skalkotos
EOF
20 52ac594c Nikos Skalkotos
21 52ac594c Nikos Skalkotos
while [[ 1 ]]; do
22 c36351f5 Nikos Skalkotos
    echo -n "Do you want to continue [y/N]? "
23 52ac594c Nikos Skalkotos
    read answer
24 52ac594c Nikos Skalkotos
    [ "$(echo -n "$answer" | tr [A-Z] [a-z])" = "y" ] && break
25 52ac594c Nikos Skalkotos
    if [ -z "$answer" -o "$(echo -n "$answer" | tr [A-Z] [a-z])" = "n" ]; then
26 c36351f5 Nikos Skalkotos
        log_error "Abort."
27 52ac594c Nikos Skalkotos
        exit 1
28 52ac594c Nikos Skalkotos
    fi
29 52ac594c Nikos Skalkotos
done
30 52ac594c Nikos Skalkotos
31 52ac594c Nikos Skalkotos
rm -f "$HELPER_DIR/initrd" "$HELPER_DIR/kernel" "$HELPER_DIR/image"
32 52ac594c Nikos Skalkotos
33 52ac594c Nikos Skalkotos
echo -n "Allocating space for helper disk image..."
34 bad5ca1f Nikos Skalkotos
helper_img=$(mktemp "$HELPER_DIR/image.XXXXXX")
35 d51a95a8 Nikos Skalkotos
36 bad5ca1f Nikos Skalkotos
dd if=/dev/zero of="$helper_img" bs=1k count=400000 &> /dev/null
37 52ac594c Nikos Skalkotos
echo "done"
38 52ac594c Nikos Skalkotos
39 bad5ca1f Nikos Skalkotos
echo "Creating partitions..."
40 55d2fc47 Nikos Skalkotos
blockdev=$("$LOSETUP" -sf $helper_img)
41 55d2fc47 Nikos Skalkotos
add_cleanup "$LOSETUP" -d "$blockdev"
42 d51a95a8 Nikos Skalkotos
43 52ac594c Nikos Skalkotos
sleep 1 # sometimes losetup returns and the device is still busy..
44 52ac594c Nikos Skalkotos
45 bad5ca1f Nikos Skalkotos
format_disk0 "$blockdev" "extdump"  2>&1 | sed -e 's/^/CFDISK: /g'
46 d51a95a8 Nikos Skalkotos
47 bad5ca1f Nikos Skalkotos
root_dev=$(map_disk0 "$blockdev")-1
48 bad5ca1f Nikos Skalkotos
add_cleanup unmap_disk0 "$blockdev"
49 d51a95a8 Nikos Skalkotos
50 63d6058d Nikos Skalkotos
echo Creating and configuring filesystem...
51 bad5ca1f Nikos Skalkotos
mkfs.ext3 "$root_dev" 2>&1 | sed -e 's/^/MKFS.EXT3: /g'
52 aac16418 Nikos Skalkotos
# The helper vm should never do filesystem checks...
53 bad5ca1f Nikos Skalkotos
tune2fs -i 0 -c 0 "$root_dev" 2>&1 | sed -e 's/^/TUNE2FS: /g'
54 d51a95a8 Nikos Skalkotos
55 bad5ca1f Nikos Skalkotos
target=$(mktemp -d)
56 bad5ca1f Nikos Skalkotos
add_cleanup rmdir "$target"
57 d51a95a8 Nikos Skalkotos
58 bad5ca1f Nikos Skalkotos
mount "$root_dev" "$target"
59 bad5ca1f Nikos Skalkotos
add_cleanup umount "$root_dev"
60 d51a95a8 Nikos Skalkotos
61 bad5ca1f Nikos Skalkotos
echo -n "Checking for cached root filesystem file \`$HELPER_CACHE_FILE'..." 
62 bad5ca1f Nikos Skalkotos
if [  -f "$HELPER_CACHE_FILE" ]; then
63 52ac594c Nikos Skalkotos
    echo "found"
64 bad5ca1f Nikos Skalkotos
    tar xf "$HELPER_CACHE_FILE" -C "$target"
65 d51a95a8 Nikos Skalkotos
else
66 52ac594c Nikos Skalkotos
    echo "not found"
67 52ac594c Nikos Skalkotos
    echo "Debootstraping to create a new root filesystem:"
68 5a31f7ef Nikos Skalkotos
69 5a31f7ef Nikos Skalkotos
    # Create a policy-rc.d file to deny init script execution
70 5a31f7ef Nikos Skalkotos
    mkdir -p "$target/usr/sbin"
71 5a31f7ef Nikos Skalkotos
    cat > "$target/usr/sbin/policy-rc.d" <<EOF
72 5a31f7ef Nikos Skalkotos
#!/bin/sh
73 5a31f7ef Nikos Skalkotos
exit 101
74 5a31f7ef Nikos Skalkotos
EOF
75 5a31f7ef Nikos Skalkotos
    chmod +x "$target/usr/sbin/policy-rc.d"
76 5a31f7ef Nikos Skalkotos
77 bad5ca1f Nikos Skalkotos
    debootstrap --arch amd64 --include "$HELPER_EXTRA_PKGS" \
78 5a31f7ef Nikos Skalkotos
        --variant=minbase stable "$target" "$HELPER_MIRROR" 2>&1 | sed -e 's/^/DEBOOTSTRAP: /g'
79 d51a95a8 Nikos Skalkotos
80 5a31f7ef Nikos Skalkotos
    rm "$target/usr/sbin/policy-rc.d"
81 5a31f7ef Nikos Skalkotos
    
82 d51a95a8 Nikos Skalkotos
    # remove the downloaded debs, as they are no longer needed
83 bad5ca1f Nikos Skalkotos
    find "$target/var/cache/apt/archives" -type f -name '*.deb' -print0 | \
84 d51a95a8 Nikos Skalkotos
        xargs -r0 rm -f
85 d51a95a8 Nikos Skalkotos
86 bad5ca1f Nikos Skalkotos
    tmp_cache=$(mktemp "$HELPER_CACHE_FILE.XXXXXX")
87 5a31f7ef Nikos Skalkotos
    tar cf "$tmp_cache" --one-file-system -C "$target" . || { rm "$tmp_cache"; false; }
88 bad5ca1f Nikos Skalkotos
    mv -f "$tmp_cache" "$HELPER_CACHE_FILE"
89 d51a95a8 Nikos Skalkotos
fi
90 d51a95a8 Nikos Skalkotos
91 63d6058d Nikos Skalkotos
echo -n "Configuring the helper image..."
92 bad5ca1f Nikos Skalkotos
echo snf-image-helper > "$target/etc/hostname"
93 d51a95a8 Nikos Skalkotos
94 bad5ca1f Nikos Skalkotos
cat > "$target/etc/fstab" <<EOF
95 d51a95a8 Nikos Skalkotos
# /etc/fstab: static file system information.
96 d51a95a8 Nikos Skalkotos
#
97 d51a95a8 Nikos Skalkotos
# <file system>   <mount point>   <type>  <options>       <dump>  <pass>
98 d51a95a8 Nikos Skalkotos
/dev/sda1         /               ext3    defaults        0       1
99 d51a95a8 Nikos Skalkotos
proc              /proc           proc    defaults        0       0
100 d51a95a8 Nikos Skalkotos
EOF
101 52ac594c Nikos Skalkotos
echo "done"
102 d51a95a8 Nikos Skalkotos
103 52ac594c Nikos Skalkotos
echo -n "Extracting kernel..."
104 bad5ca1f Nikos Skalkotos
if [ ! -L "$target/vmlinuz" -o ! -L "$target/vmlinuz" ]; then
105 bad5ca1f Nikos Skalkotos
    echo -e "\033[1;31mfailed\033[0m"
106 bad5ca1f Nikos Skalkotos
    log_error "vmlinuz or initrd.img link in root is missing."
107 bad5ca1f Nikos Skalkotos
    log_error "I don't know how to find a usable kernel/initrd pair."
108 bad5ca1f Nikos Skalkotos
    exit 1
109 d51a95a8 Nikos Skalkotos
fi
110 52ac594c Nikos Skalkotos
echo "done"
111 d51a95a8 Nikos Skalkotos
112 bad5ca1f Nikos Skalkotos
kernel=$(readlink -en "$target/vmlinuz")
113 bad5ca1f Nikos Skalkotos
initrd=$(readlink -en "$target/initrd.img")
114 d51a95a8 Nikos Skalkotos
115 bad5ca1f Nikos Skalkotos
echo "Moving $(basename "$kernel") and $(basename "$initrd") to \`$HELPER_DIR'"
116 bad5ca1f Nikos Skalkotos
mv "$kernel" "$initrd" "$HELPER_DIR"
117 d51a95a8 Nikos Skalkotos
118 bad5ca1f Nikos Skalkotos
kernel=$(basename "$kernel")
119 bad5ca1f Nikos Skalkotos
initrd=$(basename "$initrd")
120 d51a95a8 Nikos Skalkotos
121 bad5ca1f Nikos Skalkotos
(cd "$HELPER_DIR"; ln -fs "$kernel" kernel; ln -fs "$initrd" initrd)
122 d51a95a8 Nikos Skalkotos
123 bad5ca1f Nikos Skalkotos
rm "$target/vmlinuz" "$target/initrd.img"
124 d51a95a8 Nikos Skalkotos
125 52ac594c Nikos Skalkotos
echo "Installing snf-image-helper pkg in the new image..."
126 bad5ca1f Nikos Skalkotos
cp "$HELPER_PKG" "$target/tmp/"
127 bad5ca1f Nikos Skalkotos
pkg_name=$(basename "$HELPER_PKG")
128 bad5ca1f Nikos Skalkotos
add_cleanup rm "$target/tmp/$pkg_name"
129 bad5ca1f Nikos Skalkotos
chroot "$target" dpkg -i "/tmp/$pkg_name" 2>&1 | sed -e 's/^/DPKG: /g'
130 3b0420ce Nikos Skalkotos
131 bad5ca1f Nikos Skalkotos
cat > "$target/etc/rc.local" <<EOF
132 3b0420ce Nikos Skalkotos
#!/bin/sh -e
133 3b0420ce Nikos Skalkotos
#
134 3b0420ce Nikos Skalkotos
# rc.local
135 3b0420ce Nikos Skalkotos
#
136 3b0420ce Nikos Skalkotos
# This script is executed at the end of each multiuser runlevel.
137 3b0420ce Nikos Skalkotos
# Make sure that the script will "exit 0" on success or any other
138 3b0420ce Nikos Skalkotos
# value on error.
139 3b0420ce Nikos Skalkotos
#
140 3b0420ce Nikos Skalkotos
# In order to enable or disable this script just change the execution
141 3b0420ce Nikos Skalkotos
# bits.
142 3b0420ce Nikos Skalkotos
#
143 3b0420ce Nikos Skalkotos
# By default this script does nothing.
144 3b0420ce Nikos Skalkotos
145 ff7783b8 Vangelis Koukis
if ! grep -q snf_image_activate_helper /proc/cmdline; then
146 ff7783b8 Vangelis Koukis
    echo "WARNING: NOT calling snf-image-helper, add snf_image_activate_helper"
147 ff7783b8 Vangelis Koukis
    echo "to the kernel command line if you want to do so."
148 ff7783b8 Vangelis Koukis
else
149 ff7783b8 Vangelis Koukis
    /usr/bin/snf-image-helper --force
150 ff7783b8 Vangelis Koukis
fi
151 3b0420ce Nikos Skalkotos
152 3b0420ce Nikos Skalkotos
exit 0
153 3b0420ce Nikos Skalkotos
EOF
154 3b0420ce Nikos Skalkotos
155 bad5ca1f Nikos Skalkotos
chmod +x "$target/etc/rc.local"
156 3b0420ce Nikos Skalkotos
157 52ac594c Nikos Skalkotos
echo "done"
158 52ac594c Nikos Skalkotos
159 d51a95a8 Nikos Skalkotos
cleanup
160 d51a95a8 Nikos Skalkotos
161 bad5ca1f Nikos Skalkotos
mv "$helper_img" "$HELPER_DIR/image"
162 d51a95a8 Nikos Skalkotos
163 d51a95a8 Nikos Skalkotos
trap - EXIT
164 d51a95a8 Nikos Skalkotos
165 63d6058d Nikos Skalkotos
echo "Files in \`$HELPER_DIR' were updated successfully"
166 d51a95a8 Nikos Skalkotos
exit 0
167 d51a95a8 Nikos Skalkotos
168 d51a95a8 Nikos Skalkotos
# vim: set sta sts=4 shiftwidth=4 sw=4 et ai :