Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (3.7 kB)

1
#!/bin/bash
2

    
3
set -e
4

    
5
. @osdir@/common.sh
6

    
7
CACHE_FILE="$HELPER_DIR/cache.tar"
8
ARCH=amd64
9
EXTRA_PKGS="linux-image-amd64,e2fsprogs,ntfs-3g,ntfsprogs,xmlstarlet,python"
10

    
11
if [ ! -e "$HELPER_PKG" ]; then
12
    log_error "Helper package \`$HELPER_PKG' not found."
13
    log_error "You need to provide this for the script to work"
14
    exit 1
15
fi
16
cat >&1 <<EOF
17
This program will overwrite the following files:
18
  \`$HELPER_DIR/initrd'
19
  \`$HELPER_DIR/kernel'
20
  \`$HELPER_DIR/image'
21
EOF
22

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

    
33
rm -f "$HELPER_DIR/initrd" "$HELPER_DIR/kernel" "$HELPER_DIR/image"
34

    
35
echo -n "Allocating space for helper disk image..."
36
helper_img=$(mktemp $HELPER_DIR/image.XXXXXXXX)
37

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

    
41
blockdev=$(losetup -sf $helper_img)
42
CLEANUP+=("losetup -d $blockdev")
43

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

    
46
echo -n "Creating partitions..."
47
format_disk0 $blockdev "extdump" 
48
echo "done"
49

    
50
root_dev=$(map_disk0 $blockdev)-1
51
CLEANUP+=("unmap_disk0 $blockdev")
52

    
53
mkfs.ext3 $root_dev
54
# The helper vm should never do filesystem checks...
55
tune2fs -i 0 -c 0 $root_dev
56

    
57
TMPDIR=$(mktemp -d)
58
CLEANUP+=("rmdir $TMPDIR")
59

    
60
mount $root_dev $TMPDIR
61
CLEANUP+=("umount $root_dev")
62

    
63
echo "Checking for cached root filesystem file \`$CACHE_FILE'..." 
64
if [  -f "$CACHE_FILE" ]; then
65
    echo "found"
66
    tar xf "$CACHE_FILE" -C $TMPDIR
67
else
68
    echo "not found"
69
    echo "Debootstraping to create a new root filesystem:"
70
    debootstrap --arch "$ARCH" --include $EXTRA_PKGS --variant=minbase \
71
	    squeeze $TMPDIR
72

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

    
77
    TMP_CACHE=$(mktemp "${CACHE_FILE}.XXXXXX")
78
    tar cf "$TMP_CACHE" -C $TMPDIR .
79
    mv -f "$TMP_CACHE" "$CACHE_FILE"
80
fi
81

    
82
echo -n "Configureing filesystem..."
83
echo helper > $TMPDIR/etc/hostname
84

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

    
94
echo -n "Extracting kernel..."
95
if [ ! -L "$TMPDIR/vmlinuz" -o ! -L "$TMPDIR/vmlinuz" ]; then
96

    
97
	log_error "vmlinuz or initrd.img link in root is missing."
98
	log_error "I don't know how to find a usable kernel/initrd pair."
99
	exit 1
100
fi
101
echo "done"
102

    
103
kernel=$(readlink -en $TMPDIR/vmlinuz)
104
initrd=$(readlink -en $TMPDIR/initrd.img)
105

    
106
echo "Moving $(basename $kernel) and $(basename $initrd) to $HELPER_DIR"
107
mv $kernel $initrd $HELPER_DIR
108

    
109
kernel=$(basename $kernel)
110
initrd=$(basename $initrd)
111

    
112
(cd $HELPER_DIR; ln -fs $kernel kernel; ln -fs $initrd initrd)
113

    
114
rm $TMPDIR/vmlinuz $TMPDIR/initrd.img
115

    
116
echo "Installing snf-image-helper pkg in the new image..."
117
cp $HELPER_PKG $TMPDIR/tmp/
118
pkg_name=$(basename "$HELPER_PKG")  
119
CLEANUP+=("rm $TMPDIR/tmp/$pkg_name")
120
chroot ${TMPDIR} dpkg -i /tmp/$pkg_name
121

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

    
136
/usr/bin/snf-image-helper
137

    
138
exit 0
139
EOF
140

    
141
chmod +x ${TMPDIR}/etc/rc.local
142

    
143
echo "done"
144

    
145
cleanup
146

    
147
mv $helper_img $HELPER_DIR/image
148

    
149
trap - EXIT
150

    
151
exit 0
152

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