summaryrefslogtreecommitdiff
path: root/setup-bootable.in
diff options
context:
space:
mode:
authorTimo Teräs <timo.teras@iki.fi>2017-10-18 17:37:56 +0300
committerTimo Teräs <timo.teras@iki.fi>2017-10-19 12:50:14 +0300
commit42fcb51f0c6dea632e9b2c71f8a833635442d63d (patch)
tree02b83e26603d626f0b67cc16645e311a5c4e6963 /setup-bootable.in
parent6c118f76b4578398925f94fc9387ca21f5c78e78 (diff)
downloadalpine-conf-42fcb51f0c6dea632e9b2c71f8a833635442d63d.zip
setup-bootable: use uniso for local .iso files too
- uniso now properly checks freespace early - it runs fdatasync, is interruptible, and few seconds faster - no loop back mounting required
Diffstat (limited to 'setup-bootable.in')
-rw-r--r--setup-bootable.in106
1 files changed, 42 insertions, 64 deletions
diff --git a/setup-bootable.in b/setup-bootable.in
index ab6b0d7..d18b756 100644
--- a/setup-bootable.in
+++ b/setup-bootable.in
@@ -6,6 +6,13 @@ files_to_move="boot efi apks syslinux.cfg .alpine-release"
read_only_mounts=
umounts=
uninstalls=
+destdir=
+
+cleanup_tmpdata() {
+ if [ -d "$destdir" -a -d "$destdir/.new" ]; then
+ rm -rf "$destdir"/.new
+ fi
+}
cleanup_mounts() {
local i=
@@ -30,6 +37,7 @@ cleanup_installs() {
}
cleanup() {
+ cleanup_tmpdata
cleanup_mounts
cleanup_installs
}
@@ -57,18 +65,6 @@ on_usb_bus() {
test "${sysdev##*/usb[0-9]}" != "$sysdev"
}
-# mount source as loopback and set srcdir
-mount_srcdir() {
- local srcmnt=${MNT:-/mnt}
- mount -o loop,ro -t iso9660 "$src" $srcmnt \
- || die "Failed to mount loopback $src"
- umounts="$srcmnt"
- srcdir="$srcmnt"
- if ! [ -f "$srcdir"/.alpine-release ]; then
- die "No .alpine-release found on image $src"
- fi
-}
-
vecho() {
[ -z "$verbose" ] && return 0
echo "$@"
@@ -174,6 +170,21 @@ check_syslinux() {
done
}
+version_check() {
+ local new_dir="$1" old_dir="$2"
+ # check if its same version
+ local to_version=$(cat "$new_dir"/.alpine-release)
+ if [ -n "$upgrade" ] && [ -e "$old_dir"/.alpine-release ]; then
+ local from_version=$(cat "$old_dir"/.alpine-release)
+ if [ -z "$force" ] && [ -n "$to_version" ] && [ "$from_version" = "$to_version" ]; then
+ die "Source and target seems to have same version ($from_version). Aborting."
+ fi
+ echo "Upgrading $dest from $from_version to $to_version"
+ else
+ echo "Installing $dest to $to_version"
+ fi
+}
+
usage() {
cat <<-__EOF__
$prog $version
@@ -226,21 +237,6 @@ fi
[ -z "$src" ] && usage
-srcdir=
-# Find the srcdir or srcurl. mount loopback if needed
-if [ -f "$src"/.alpine-release ]; then
- srcdir="$(echo $src | sed -r 's,/$,,')"
-else
- case "$src" in
- http://*|ftp://*) srcurl="$src";;
- *) mount_srcdir;;
- esac
-fi
-
-if [ -n "$srcdir" ]; then
- to_version=$(cat "$srcdir"/.alpine-release)
-fi
-
# find target device
if [ -d "$dest" ]; then
dest=${dest%/} # strip trailing /
@@ -287,52 +283,34 @@ 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" ] && [ -n "$to_version" ] && [ "$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.
+# remove partial upgrades if any
rm -rf "$destdir"/.new "$destdir"/.old
mkdir -p "$destdir"/.new || die "Failed to create $destdir/.new"
-# check that we have the space we need
-# we calculate on MB since shell arthimetic gets problems with big disks
-# and bytes.
-free_blocks=$(stat -f -c "%f" "$destdir")
-block_size=$(stat -f -c "%s" "$destdir")
-blocks_per_mb=$(( 1024 * 1024 / $block_size))
-available_space=$(( $free_blocks / $blocks_per_mb ))
-vecho "Available space: $available_space MiB"
-
-if [ -n "$srcdir" ]; then
- needed_space=$(cd "$srcdir" && du -m -s -c $files_to_move 2>/dev/null | awk '$2 == "total" {print $1}')
- vecho "Needed space: $needed_space MiB"
- [ $available_space -lt $needed_space ] \
- && die "Not enough space on $destdir. Aborting."
-
- # copy the files to .new
+# copy data from source to .new
+if [ -f "$src"/.alpine-release ]; then
+ srcdir="$(echo $src | sed -r 's,/$,,')"
+ version_check "$srcdir" "$destdir"
for i in $files_to_move; do
if [ -e "$srcdir"/$i ]; then
vecho "Copying $srcdir/$i to $destdir/.new/"
cp -dR "$srcdir"/$i "$destdir"/.new/
fi
done
-elif [ -n "$srcurl" ]; then
- cd "$destdir"/.new
- ${WGET:-wget} -O - "$srcurl" | uniso \
- || die "Failed to download or extract $srcurl"
- echo ""
+else
+ vecho "Extracting $src to $destdir/.new/"
+ case "$src" in
+ http://*|ftp://*)
+ ${WGET:-wget} -O - "$src" | (cd "$destdir"/.new; exec ${UNISO:-uniso}) \
+ || die "Failed to download or extract $src"
+ echo ""
+ ;;
+ *)
+ (cd "$destdir"/.new; exec ${UNISO:-uniso}) < "$src" \
+ || die "Failed to download or extract $src"
+ ;;
+ esac
+ version_check "$destdir/.new" "$destdir"
fi
# find where new syslinux.cfg is