summaryrefslogtreecommitdiff
path: root/setup-bootable.in
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2010-05-26 08:29:41 +0000
committerNatanael Copa <ncopa@alpinelinux.org>2010-05-26 08:29:41 +0000
commit99b3532d5ccda2db18ffd00ee48b428dce541838 (patch)
treecb7fe0b64173ed3fcb442d8f36469836ceb3a9c4 /setup-bootable.in
parent21e94966ee972fa55159c12c11ee9c35a84c7381 (diff)
downloadalpine-conf-99b3532d5ccda2db18ffd00ee48b428dce541838.zip
setup-bootable: renamed from setup-bootable-usb
Diffstat (limited to 'setup-bootable.in')
-rw-r--r--setup-bootable.in164
1 files changed, 164 insertions, 0 deletions
diff --git a/setup-bootable.in b/setup-bootable.in
new file mode 100644
index 0000000..b3f6c25
--- /dev/null
+++ b/setup-bootable.in
@@ -0,0 +1,164 @@
+#!/bin/sh
+
+prog=${0##*/}
+
+cleanup() {
+ if [ -n "$uninstalls" ]; then
+ apk del -q syslinux
+ fi
+ if [ -n "$umounts" ]; then
+ umount $umounts
+ fi
+}
+
+die() {
+ echo "$@" >&2
+ cleanup
+ exit 1
+}
+
+# get alpine dev from boot cmdline
+get_alpine_dev() {
+
+}
+
+usage() {
+ cat <<__EOF__
+usage: $prog [-hu] SOURCE [DEST]
+
+Copy the contents of SOURCE to DEST and make DEST bootable.
+
+SOURCE can be a directory or a ISO image. DEST can be a mounted directory
+or a device. If DEST is ommitted it will be autodetected.
+
+Options:
+ -d Delete existing files first. Unsafe.
+ -f Force overwriting of existing syslinux.cfg
+ -h Show this help
+ -s Run syslinux and install mbr.bin to make it bootable
+ -v Verbose mode. Display whats going on.
+
+__EOF__
+ exit 1
+}
+
+while getopts "ih" opt; do
+ case "$opt" in
+ -d) delete_first=1;;
+ -f) force=1;;
+ -h) usage;;
+ -s) syslinux=1;;
+ -v) verbose=1;;
+ esac
+done
+
+
+src=${1:-/media/cdrom}
+dest=${2:-/media/usb}
+
+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"
+ if ! [ -f "$srcdir"/.alpine-release ]; then
+ echo "Warning! No .alpine-release found on image $src"
+ [ -z "$force" ] && die "Aborting."
+ fi
+fi
+
+# find target device
+if [ -d "$dest" ]; then
+ 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"
+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"
+fi
+
+# remove partial upgrades if any.
+rm -rf "$destdir"/.new "$destdir"/.old
+
+# check that we have the space we need
+needed_space=$(cd "$srcdir" && du -s -c boot apks syslinux.cfg .alpine-release | awk '$2 == "total" {print $1}')
+[ -n "$verbose" ] && echo "Needed space: $needed_space kB"
+
+available_space=$(df -k "$destdir" | tail -n 1 | awk '{print $4}')
+[ -n "$verbose" ] && echo "Available space: $available_space kB"
+[ $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"
+ cp -a "$srcdir"/$i "$destdir"/.new/
+done
+
+# make sure files are really there before we replace existing
+sync
+
+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"
+fi
+
+# move current files to .old
+for i in $tomove; do
+ if [ -e "$destdir"/$i ]; then
+ mv "$destdir"/$i "$destdir"/.old/ || die "Failed to move $destdir/$i to $destdir/.old/"
+ fi
+done
+
+# move .new to current
+for i in $tomove; do
+ mv "$destdir"/.new/$i "$destdir"/ || die "Failed to move $destdir/.new/ to $destdir"
+done
+
+# cleanup
+[ -z "$keep_old" ] && rm -rf "$destdir"/.old "$destdir"/.new
+sync
+
+
+# If we only copy then we are done.
+if [ -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
+ apk add -q syslinux || die "Failed to install syslinux"
+ uninstalls="syslinux"
+fi
+
+syslinux $dev
+
+if [ -b /dev/$parent ]; then
+ dd if=/usr/share/syslinux/mbr.bin of=/dev/$parent
+else
+ echo "Warning: Could not find the parent device for $dev"
+fi
+
+cleanup
+echo "Done."