summaryrefslogtreecommitdiffstats
path: root/setup-bootable.in
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2010-05-26 11:53:00 +0000
committerNatanael Copa <ncopa@alpinelinux.org>2010-05-26 13:21:24 +0000
commita0be4363b19162797e307c8da74d99615b069470 (patch)
treea4c54b49d0fb508b27fd41a6ed7028628f8a4d87 /setup-bootable.in
parentb2b998ee2a7a2bfa8ea4d27450f4bf5cf206d439 (diff)
downloadalpine-conf-a0be4363b19162797e307c8da74d99615b069470.tar.bz2
alpine-conf-a0be4363b19162797e307c8da74d99615b069470.tar.xz
setup-bootable: update syslinux.cfg if not usbdisk
+ misc fixes
Diffstat (limited to 'setup-bootable.in')
-rw-r--r--setup-bootable.in90
1 files changed, 67 insertions, 23 deletions
diff --git a/setup-bootable.in b/setup-bootable.in
index 839a01d..7143ee7 100644
--- a/setup-bootable.in
+++ b/setup-bootable.in
@@ -18,6 +18,21 @@ die() {
exit 1
}
+# find device for mountpoint
+find_dev() {
+ local mnt="${1%/}" # strip trailing /
+ awk "\$2 == \"$mnt\" {print \$1}" /proc/mounts
+}
+
+# check if given device is on usb bus
+on_usb_bus() {
+ local dev="$1"
+ [ -e /sys/block/$dev ] || return 1
+ local sysdev=$(readlink -f /sys/block/$dev/device)
+ test "${sysdev##*/usb[0-9]}" != "$sysdev"
+}
+
+
usage() {
cat <<__EOF__
$prog $version
@@ -41,11 +56,11 @@ __EOF__
while getopts "fhusv" opt; do
case "$opt" in
- -f) force=1;;
- -h) usage;;
- -u) upgrade=1;;
- -s) syslinux=1;;
- -v) verbose=1;;
+ f) force=1;;
+ h) usage;;
+ u) upgrade=1;;
+ s) syslinux=1;;
+ v) verbose=1;;
esac
done
@@ -61,30 +76,39 @@ srcmnt=${MNT:-/mnt}
# Find the srcdir, mount loopback if needed
if [ -f "$src"/.alpine-release ]; then
srcdir="$src"
- [ -n "$verbose" ] && echo "Using directory $src as source"
else
mount -o loop -t iso9660 "$src" $srcmnt \
|| die "Failed to mount loopback $src"
- [ -n "$verbose" ] && echo "Using image $src as source"
umounts="$srcmnt"
srcdir="$srcmnt"
[ -f "$srcdir"/.alpine-release ] || die "No .alpine-release found on image $src"
fi
+to_version=$(cat "$srcdir"/.alpine-release)
# find target device
if [ -d "$dest" ]; then
+ dest=${dest%/} # strip trailing /
if ! awk '{print $2}' /proc/mounts | grep -q "^$dest\$"; then
mount "$dest" || die "Failed to mount $dest"
umounts="$umounts $dest"
fi
destdir="$dest"
- [ -n "$vserbose" ] && echo "Using $destdir as target"
+ dest=$(find_dev "$destdir")
elif [ -b "$dest" ]; then
destdir="/media/${dest##*/}"
mkdir -p "$destdir"
mount "$dest" "$destdir" || die "Failed to mount $dest on $destdir"
- [ -n "$vserbose" ] && echo "Using $dest (mounted on $destdir) as target"
+ umounts="$umounts $destdir"
fi
+[ -n "$verbose" ] && echo "Using $dest as target (mounted on $destdir)"
+
+
+# find parent device (i.e sda)
+dev="$dest"
+while [ -L "$dev" ]; do
+ dev=$(readlink -f $dev)
+done
+parent_dev=/dev/$(basename $(dirname /sys/block/*/$(basename $dev)))
# check if this files exist and not in upgrade mode
if [ -z "$upgrade" ] && [ -z "$force" ]; then
@@ -93,6 +117,21 @@ if [ -z "$upgrade" ] && [ -z "$force" ]; then
done
fi
+# check if its same version
+if [ -n "$upgrade" ] && [ -e "$destdir"/.alpine-release ]; then
+ from_version=$(cat "$destdir"/.alpine-release)
+ if [ -z "$force" ] && [ "$from_version" = "$to_version" ]; then
+ die "Source and target seems to have same version ($from_version). Aborting."
+ fi
+fi
+
+# Display what versions we are installing/upgrading
+if [ -n "$from_version" ]; then
+ echo "Upgrading $dest from $from_version to $to_version"
+else
+ echo "Copying $to_version to $dest (mounted on $destdir)"
+fi
+
# remove partial upgrades if any.
rm -rf "$destdir"/.new "$destdir"/.old
@@ -105,23 +144,30 @@ available_space=$(df -k "$destdir" | tail -n 1 | awk '{print $4}')
[ $available_space -lt $needed_space ] && die "Not enough space on $destdir. Aborting."
# copy the files to .new
-echo "Copying new files to $destdir/.new..."
mkdir -p "$destdir"/.new || die "Failed to create $destdir/.new"
for i in boot apks syslinux.cfg .alpine-release; do
- [ -n "$verbose"
+ [ -n "$verbose" ] && echo "Copying $srcdir/$i to $destdir/.new/"
cp -a "$srcdir"/$i "$destdir"/.new/
done
# make sure files are really there before we replace existing
+[ -n "$verbose" ] && echo "Flushing cache..."
sync
-echo "Replacing existing files..."
+[ -n "$verbose" ] && echo "Replacing existing files..."
mkdir -p "$destdir"/.old || die "Failed to create $destdir/.old"
# do we want keep existing syslinux.cfg?
tomove="boot apks .alpine-release"
if [ -n "$force" ] || ! [ -e "$destdir"/syslinux.cfg ]; then
tomove="$tomove syslinux.cfg"
+ # update syslinux.cfg unless device is on usb bus
+ # this is so we can boot from CF's and harddisk
+ if ! on_usb_bus $parent_dev; then
+ [ -n "$verbose" ] && echo "Updating syslinux.cfg to use $dest"
+ sed -i -e "s/usbdisk/${dest##*/}/g" \
+ "$destdir"/.new/syslinux.cfg
+ fi
fi
# move current files to .old
@@ -142,27 +188,25 @@ sync
# If we only copy then we are done.
-if [ -z "$syslinux" ]; then
+if [ -n "$upgrade" ] && [ -z "$syslinux" ]; then
cleanup
- echo "Done."
exit 0
fi
-echo "Making usb bootable..."
-dev=$(awk "\$2 == \"$dest\" {print \$1}" /proc/mounts)
-parent=$(basename $(dirname /sys/block/*/$(basename $dev)))
-if ! apk info -q -e syslinux; then
+echo "Making $dest bootable..."
+
+if ! [ -x "$(which syslinux)" ]; then
apk add -q syslinux || die "Failed to install syslinux"
uninstalls="syslinux"
fi
-syslinux $dev
+syslinux $dest
-if [ -b /dev/$parent ]; then
- dd if=/usr/share/syslinux/mbr.bin of=/dev/$parent
+if [ -b $parent_dev ]; then
+ dd if=/usr/share/syslinux/mbr.bin of=$parent_dev
else
- echo "Warning: Could not find the parent device for $dev"
+ echo "Warning: Could not find the parent device for $dest"
fi
cleanup
-echo "Done."
+sync