Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (4.3 kB)

1
#!/bin/bash
2

    
3
set -e
4
set -o pipefail
5

    
6
. @osdir@/common.sh
7

    
8
if [ ! -e "$HELPER_PKG" ]; then
9
    log_error "Helper package \`$HELPER_PKG' not found."
10
    log_error "You need to provide this for the script to work."
11
    exit 1
12
fi
13

    
14
cat >&1 <<EOF
15
This program will overwrite the following files:
16
  \`$HELPER_DIR/initrd'
17
  \`$HELPER_DIR/kernel'
18
  \`$HELPER_DIR/image'
19
EOF
20

    
21
while [[ 1 ]]; do
22
    echo -n "Do you want to continue [y/N]? "
23
    read answer
24
    [ "$(echo -n "$answer" | tr [A-Z] [a-z])" = "y" ] && break
25
    if [ -z "$answer" -o "$(echo -n "$answer" | tr [A-Z] [a-z])" = "n" ]; then
26
        log_error "Abort."
27
        exit 1
28
    fi
29
done
30

    
31
rm -f "$HELPER_DIR/initrd" "$HELPER_DIR/kernel" "$HELPER_DIR/image"
32

    
33
echo -n "Allocating space for helper disk image..."
34
helper_img=$(mktemp "$HELPER_DIR/image.XXXXXX")
35

    
36
dd if=/dev/zero of="$helper_img" bs=1k count=400000 &> /dev/null
37
echo "done"
38

    
39
echo "Creating partitions..."
40
blockdev=$("$LOSETUP" -sf $helper_img)
41
add_cleanup "$LOSETUP" -d "$blockdev"
42

    
43
sleep 1 # sometimes losetup returns and the device is still busy..
44

    
45
format_disk0 "$blockdev" "extdump"  2>&1 | sed -e 's/^/CFDISK: /g'
46

    
47
root_dev=$(map_disk0 "$blockdev")-1
48
add_cleanup unmap_disk0 "$blockdev"
49

    
50
echo Creating and configuring filesystem...
51
mkfs.ext3 "$root_dev" 2>&1 | sed -e 's/^/MKFS.EXT3: /g'
52
# The helper vm should never do filesystem checks...
53
tune2fs -i 0 -c 0 "$root_dev" 2>&1 | sed -e 's/^/TUNE2FS: /g'
54

    
55
target=$(mktemp -d)
56
add_cleanup rmdir "$target"
57

    
58
mount "$root_dev" "$target"
59
add_cleanup umount "$root_dev"
60

    
61
echo -n "Checking for cached root filesystem file \`$HELPER_CACHE_FILE'..." 
62
if [  -f "$HELPER_CACHE_FILE" ]; then
63
    echo "found"
64
    tar xf "$HELPER_CACHE_FILE" -C "$target"
65
else
66
    echo "not found"
67
    echo "Debootstraping to create a new root filesystem:"
68
    debootstrap --arch amd64 --include "$HELPER_EXTRA_PKGS" \
69
        --variant=minbase stable "$target" 2>&1 | sed -e 's/^/DEBOOTSTRAP: /g'
70

    
71
    # remove the downloaded debs, as they are no longer needed
72
    find "$target/var/cache/apt/archives" -type f -name '*.deb' -print0 | \
73
        xargs -r0 rm -f
74

    
75
    tmp_cache=$(mktemp "$HELPER_CACHE_FILE.XXXXXX")
76
    tar cf "$tmp_cache" -C "$target" . || { rm "$tmp_cache"; false; }
77
    mv -f "$tmp_cache" "$HELPER_CACHE_FILE"
78
fi
79

    
80
echo -n "Configuring the helper image..."
81
echo snf-image-helper > "$target/etc/hostname"
82

    
83
cat > "$target/etc/fstab" <<EOF
84
# /etc/fstab: static file system information.
85
#
86
# <file system>   <mount point>   <type>  <options>       <dump>  <pass>
87
/dev/sda1         /               ext3    defaults        0       1
88
proc              /proc           proc    defaults        0       0
89
EOF
90
echo "done"
91

    
92
echo -n "Extracting kernel..."
93
if [ ! -L "$target/vmlinuz" -o ! -L "$target/vmlinuz" ]; then
94
    echo -e "\033[1;31mfailed\033[0m"
95
    log_error "vmlinuz or initrd.img link in root is missing."
96
    log_error "I don't know how to find a usable kernel/initrd pair."
97
    exit 1
98
fi
99
echo "done"
100

    
101
kernel=$(readlink -en "$target/vmlinuz")
102
initrd=$(readlink -en "$target/initrd.img")
103

    
104
echo "Moving $(basename "$kernel") and $(basename "$initrd") to \`$HELPER_DIR'"
105
mv "$kernel" "$initrd" "$HELPER_DIR"
106

    
107
kernel=$(basename "$kernel")
108
initrd=$(basename "$initrd")
109

    
110
(cd "$HELPER_DIR"; ln -fs "$kernel" kernel; ln -fs "$initrd" initrd)
111

    
112
rm "$target/vmlinuz" "$target/initrd.img"
113

    
114
echo "Installing snf-image-helper pkg in the new image..."
115
cp "$HELPER_PKG" "$target/tmp/"
116
pkg_name=$(basename "$HELPER_PKG")
117
add_cleanup rm "$target/tmp/$pkg_name"
118
chroot "$target" dpkg -i "/tmp/$pkg_name" 2>&1 | sed -e 's/^/DPKG: /g'
119

    
120
cat > "$target/etc/rc.local" <<EOF
121
#!/bin/sh -e
122
#
123
# rc.local
124
#
125
# This script is executed at the end of each multiuser runlevel.
126
# Make sure that the script will "exit 0" on success or any other
127
# value on error.
128
#
129
# In order to enable or disable this script just change the execution
130
# bits.
131
#
132
# By default this script does nothing.
133

    
134
if ! grep -q snf_image_activate_helper /proc/cmdline; then
135
    echo "WARNING: NOT calling snf-image-helper, add snf_image_activate_helper"
136
    echo "to the kernel command line if you want to do so."
137
else
138
    /usr/bin/snf-image-helper --force
139
fi
140

    
141
exit 0
142
EOF
143

    
144
chmod +x "$target/etc/rc.local"
145

    
146
echo "done"
147

    
148
cleanup
149

    
150
mv "$helper_img" "$HELPER_DIR/image"
151

    
152
trap - EXIT
153

    
154
echo "Files in \`$HELPER_DIR' were updated successfully"
155
exit 0
156

    
157
# vim: set sta sts=4 shiftwidth=4 sw=4 et ai :