Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (3.6 kB)

1 d51a95a8 Nikos Skalkotos
#!/bin/bash
2 d51a95a8 Nikos Skalkotos
3 d51a95a8 Nikos Skalkotos
set -e
4 d51a95a8 Nikos Skalkotos
5 d51a95a8 Nikos Skalkotos
. @osdir@/common.sh
6 d51a95a8 Nikos Skalkotos
7 d51a95a8 Nikos Skalkotos
CACHE_FILE="$HELPER_DIR/cache.tar"
8 d51a95a8 Nikos Skalkotos
ARCH=amd64
9 52ac594c Nikos Skalkotos
EXTRA_PKGS="linux-image-amd64,e2fsprogs,ntfs-3g,ntfsprogs,xmlstarlet,python"
10 d51a95a8 Nikos Skalkotos
11 52ac594c Nikos Skalkotos
if [ ! -e "$HELPER_PKG" ]; then
12 52ac594c Nikos Skalkotos
    log_error "Helper package \`$HELPER_PKG' not found."
13 52ac594c Nikos Skalkotos
    log_error "You need to provide this for the script to work"
14 52ac594c Nikos Skalkotos
    exit 1
15 52ac594c Nikos Skalkotos
fi
16 52ac594c Nikos Skalkotos
cat >&1 <<EOF
17 52ac594c Nikos Skalkotos
This program will overwrite the following files:
18 52ac594c Nikos Skalkotos
  \`$HELPER_DIR/initrd'
19 52ac594c Nikos Skalkotos
  \`$HELPER_DIR/kernel'
20 52ac594c Nikos Skalkotos
  \`$HELPER_DIR/image'
21 52ac594c Nikos Skalkotos
EOF
22 52ac594c Nikos Skalkotos
23 52ac594c Nikos Skalkotos
while [[ 1 ]]; do
24 52ac594c Nikos Skalkotos
    echo -n "Do you want to continue [y/N]?"
25 52ac594c Nikos Skalkotos
    read answer
26 52ac594c Nikos Skalkotos
    [ "$(echo -n "$answer" | tr [A-Z] [a-z])" = "y" ] && break
27 52ac594c Nikos Skalkotos
    if [ -z "$answer" -o "$(echo -n "$answer" | tr [A-Z] [a-z])" = "n" ]; then
28 52ac594c Nikos Skalkotos
        log_error "Abord."
29 52ac594c Nikos Skalkotos
        exit 1
30 52ac594c Nikos Skalkotos
    fi
31 52ac594c Nikos Skalkotos
done
32 52ac594c Nikos Skalkotos
33 52ac594c Nikos Skalkotos
rm -f "$HELPER_DIR/initrd" "$HELPER_DIR/kernel" "$HELPER_DIR/image"
34 52ac594c Nikos Skalkotos
35 52ac594c Nikos Skalkotos
echo -n "Allocating space for helper disk image..."
36 d51a95a8 Nikos Skalkotos
helper_img=$(mktemp $HELPER_DIR/image.XXXXXXXX)
37 d51a95a8 Nikos Skalkotos
38 52ac594c Nikos Skalkotos
dd if=/dev/zero of=$helper_img bs=1k count=400000 &> /dev/null
39 52ac594c Nikos Skalkotos
echo "done"
40 52ac594c Nikos Skalkotos
41 d51a95a8 Nikos Skalkotos
blockdev=$(losetup -sf $helper_img)
42 d51a95a8 Nikos Skalkotos
CLEANUP+=("losetup -d $blockdev")
43 d51a95a8 Nikos Skalkotos
44 52ac594c Nikos Skalkotos
sleep 1 # sometimes losetup returns and the device is still busy..
45 52ac594c Nikos Skalkotos
46 52ac594c Nikos Skalkotos
echo -n "Creating partitions..."
47 d51a95a8 Nikos Skalkotos
format_disk0 $blockdev "extdump"
48 52ac594c Nikos Skalkotos
echo "done"
49 d51a95a8 Nikos Skalkotos
50 d51a95a8 Nikos Skalkotos
root_dev=$(map_disk0 $blockdev)-1
51 d51a95a8 Nikos Skalkotos
CLEANUP+=("unmap_disk0 $blockdev")
52 d51a95a8 Nikos Skalkotos
53 d51a95a8 Nikos Skalkotos
mkfs.ext3 $root_dev
54 d51a95a8 Nikos Skalkotos
55 d51a95a8 Nikos Skalkotos
TMPDIR=$(mktemp -d)
56 d51a95a8 Nikos Skalkotos
CLEANUP+=("rmdir $TMPDIR")
57 d51a95a8 Nikos Skalkotos
58 d51a95a8 Nikos Skalkotos
mount $root_dev $TMPDIR
59 d51a95a8 Nikos Skalkotos
CLEANUP+=("umount $root_dev")
60 d51a95a8 Nikos Skalkotos
61 52ac594c Nikos Skalkotos
echo "Checking for cached root filesystem file \`$CACHE_FILE'..." 
62 d51a95a8 Nikos Skalkotos
if [  -f "$CACHE_FILE" ]; then
63 52ac594c Nikos Skalkotos
    echo "found"
64 d51a95a8 Nikos Skalkotos
    tar xf "$CACHE_FILE" -C $TMPDIR
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 d51a95a8 Nikos Skalkotos
    debootstrap --arch "$ARCH" --include $EXTRA_PKGS --variant=minbase \
69 d51a95a8 Nikos Skalkotos
	    squeeze $TMPDIR
70 d51a95a8 Nikos Skalkotos
71 d51a95a8 Nikos Skalkotos
    # remove the downloaded debs, as they are no longer needed
72 d51a95a8 Nikos Skalkotos
    find "$TMPDIR/var/cache/apt/archives" -type f -name '*.deb' -print0 | \
73 d51a95a8 Nikos Skalkotos
        xargs -r0 rm -f
74 d51a95a8 Nikos Skalkotos
75 d51a95a8 Nikos Skalkotos
    TMP_CACHE=$(mktemp "${CACHE_FILE}.XXXXXX")
76 d51a95a8 Nikos Skalkotos
    tar cf "$TMP_CACHE" -C $TMPDIR .
77 d51a95a8 Nikos Skalkotos
    mv -f "$TMP_CACHE" "$CACHE_FILE"
78 d51a95a8 Nikos Skalkotos
fi
79 d51a95a8 Nikos Skalkotos
80 52ac594c Nikos Skalkotos
echo -n "Configureing filesystem..."
81 d51a95a8 Nikos Skalkotos
echo helper > $TMPDIR/etc/hostname
82 d51a95a8 Nikos Skalkotos
83 d51a95a8 Nikos Skalkotos
cat > $TMPDIR/etc/fstab <<EOF
84 d51a95a8 Nikos Skalkotos
# /etc/fstab: static file system information.
85 d51a95a8 Nikos Skalkotos
#
86 d51a95a8 Nikos Skalkotos
# <file system>   <mount point>   <type>  <options>       <dump>  <pass>
87 d51a95a8 Nikos Skalkotos
/dev/sda1         /               ext3    defaults        0       1
88 d51a95a8 Nikos Skalkotos
proc              /proc           proc    defaults        0       0
89 d51a95a8 Nikos Skalkotos
EOF
90 52ac594c Nikos Skalkotos
echo "done"
91 d51a95a8 Nikos Skalkotos
92 52ac594c Nikos Skalkotos
echo -n "Extracting kernel..."
93 d51a95a8 Nikos Skalkotos
if [ ! -L "$TMPDIR/vmlinuz" -o ! -L "$TMPDIR/vmlinuz" ]; then
94 d51a95a8 Nikos Skalkotos
95 d51a95a8 Nikos Skalkotos
	log_error "vmlinuz or initrd.img link in root is missing."
96 d51a95a8 Nikos Skalkotos
	log_error "I don't know how to find a usable kernel/initrd pair."
97 d51a95a8 Nikos Skalkotos
	exit 1
98 d51a95a8 Nikos Skalkotos
fi
99 52ac594c Nikos Skalkotos
echo "done"
100 d51a95a8 Nikos Skalkotos
101 d51a95a8 Nikos Skalkotos
kernel=$(readlink -en $TMPDIR/vmlinuz)
102 d51a95a8 Nikos Skalkotos
initrd=$(readlink -en $TMPDIR/initrd.img)
103 d51a95a8 Nikos Skalkotos
104 d51a95a8 Nikos Skalkotos
echo "Moving $(basename $kernel) and $(basename $initrd) to $HELPER_DIR"
105 d51a95a8 Nikos Skalkotos
mv $kernel $initrd $HELPER_DIR
106 d51a95a8 Nikos Skalkotos
107 d51a95a8 Nikos Skalkotos
kernel=$(basename $kernel)
108 d51a95a8 Nikos Skalkotos
initrd=$(basename $initrd)
109 d51a95a8 Nikos Skalkotos
110 d51a95a8 Nikos Skalkotos
(cd $HELPER_DIR; ln -fs $kernel kernel; ln -fs $initrd initrd)
111 d51a95a8 Nikos Skalkotos
112 d51a95a8 Nikos Skalkotos
rm $TMPDIR/vmlinuz $TMPDIR/initrd.img
113 d51a95a8 Nikos Skalkotos
114 52ac594c Nikos Skalkotos
echo "Installing snf-image-helper pkg in the new image..."
115 52ac594c Nikos Skalkotos
cp $HELPER_PKG $TMPDIR/tmp/
116 52ac594c Nikos Skalkotos
pkg_name=$(basename "$HELPER_PKG")  
117 52ac594c Nikos Skalkotos
CLEANUP+=("rm $TMPDIR/tmp/$pkg_name")
118 52ac594c Nikos Skalkotos
chroot ${TMPDIR} dpkg -i /tmp/$pkg_name
119 3b0420ce Nikos Skalkotos
120 3b0420ce Nikos Skalkotos
cat > ${TMPDIR}/etc/rc.local <<EOF
121 3b0420ce Nikos Skalkotos
#!/bin/sh -e
122 3b0420ce Nikos Skalkotos
#
123 3b0420ce Nikos Skalkotos
# rc.local
124 3b0420ce Nikos Skalkotos
#
125 3b0420ce Nikos Skalkotos
# This script is executed at the end of each multiuser runlevel.
126 3b0420ce Nikos Skalkotos
# Make sure that the script will "exit 0" on success or any other
127 3b0420ce Nikos Skalkotos
# value on error.
128 3b0420ce Nikos Skalkotos
#
129 3b0420ce Nikos Skalkotos
# In order to enable or disable this script just change the execution
130 3b0420ce Nikos Skalkotos
# bits.
131 3b0420ce Nikos Skalkotos
#
132 3b0420ce Nikos Skalkotos
# By default this script does nothing.
133 3b0420ce Nikos Skalkotos
134 3b0420ce Nikos Skalkotos
/usr/bin/snf-image-helper
135 3b0420ce Nikos Skalkotos
136 3b0420ce Nikos Skalkotos
exit 0
137 3b0420ce Nikos Skalkotos
EOF
138 3b0420ce Nikos Skalkotos
139 3b0420ce Nikos Skalkotos
chmod +x ${TMPDIR}/etc/rc.local
140 3b0420ce Nikos Skalkotos
141 52ac594c Nikos Skalkotos
echo "done"
142 52ac594c Nikos Skalkotos
143 d51a95a8 Nikos Skalkotos
cleanup
144 d51a95a8 Nikos Skalkotos
145 d51a95a8 Nikos Skalkotos
mv $helper_img $HELPER_DIR/image
146 d51a95a8 Nikos Skalkotos
147 d51a95a8 Nikos Skalkotos
trap - EXIT
148 d51a95a8 Nikos Skalkotos
149 d51a95a8 Nikos Skalkotos
exit 0
150 d51a95a8 Nikos Skalkotos
151 d51a95a8 Nikos Skalkotos
# vim: set sta sts=4 shiftwidth=4 sw=4 et ai :