Files
Carl D. Roth d2c7fc536a Updates for loader-based and onl-based installs
- allow some SFX settings to be overridden
- refactor checksum validation
- support --inplace padding fixups to economize on disk space
2016-05-11 13:49:50 -07:00

292 lines
6.4 KiB
Bash

#!/bin/sh
set -e
CMD=${0##*/}
UNZIP=${UNZIP-"/usr/bin/unzip"}
UNZIPOPTS=
UNZIPARGS=
UNZIPDIR=
UNZIPQ="-q"
UNZIPV=
UNZIPLOOP=
mode=install
SHAR=$0
shardir=`dirname $SHAR`
shardir=`cd $shardir && pwd`
SHARABS="$shardir"/${SHAR##*/}
SFX_BYTES=0 ## fill in the size (padded) of this SFX header ##################
SFX_BLOCKSIZE=1 ## use a larger block size, 'dd bs=1' is sometimes slow ######
SFX_CHECKSUM= ## compute checksum over this SFX and the payload ##############
SFX_INSTALL=install ## internal script in the payload to run #################
SFX_PERMS= ## internal script to correct file permissions ####################
SFX_PAD= ## pad file (this payload) to skip during unpack ####################
SFX_LAZY= ## set to '1' to defer extraction to SFX_INSTALL ##################
SFX_UNZIP=1 ## set to '' if this unzip cannot parse SFX headers ##############
SFX_LOOP=1 ## set to '' if this unzip cannot read from a loopback/block ######
SFX_PIPE=1 ## set to '' if this unzip cannot read from a pipe ################
SFX_INPLACE= ## set to '1' if this zip file can be modified in place##########
if test "$SFX_PAD"; then
UNZIPARGS=$UNZIPARGS${UNZIPARGS:+" "}"-x $SFX_PAD"
fi
while test $# -gt 0; do
case "$1" in
-x)
# N.B. that busybox unzip has trouble with multiple files
mode=unzip
shift
UNZIPARGS=$UNZIPARGS${UNZIPARGS:+" "}"$1"
shift
UNZIPARGS=$UNZIPARGS${UNZIPARGS:+" "}"$1"
continue
;;
-d)
shift
UNZIPDIR=$1
shift
continue
;;
-v)
UNZIPQ=
UNZIPV="$1"
shift
;;
-q)
UNZIPQ="$1"
UNZIPV=
shift
;;
-*)
mode=unzip
UNZIPOPTS=$UNZIPOPTS${UNZIPOPTS:+" "}"$1"
shift
;;
*)
mode=unzip
UNZIPARGS=$UNZIPARGS${UNZIPARGS:+" "}"$1"
shift
continue
;;
esac
done
if test "$SFX_BLOCKSIZE" -gt 1; then
SFX_BLOCKS=$(($SFX_BYTES / $SFX_BLOCKSIZE))
SFX_TRAILER=$(($SFX_BYTES % $SFX_BLOCKSIZE))
if test $SFX_TRAILER -ne 0; then
echo "$CMD: *** SFX is not block-aligned" 1>&2
exit 1
fi
else
echo "$CMD: *** SFX is blocked, dd may be slow" 1>&2
fi
workdir=`mktemp -t -d sfx-XXXXXX` || exit 1
do_cleanup()
{
if test -b "$UNZIPLOOP"; then
losetup -d "$UNZIPLOOP" || :
fi
cd /
/bin/rm -fr $workdir 2>/dev/null
}
trap "do_cleanup" 0 1
echo "$CMD: computing checksum of original archive"
{
dd if="$SHARABS" bs=$SFX_BLOCKSIZE count=$SFX_BLOCKS 2>/dev/null | sed -e "/^SFX_CHECKSUM=/d";
dd if="$SHARABS" bs=$SFX_BLOCKSIZE skip=$SFX_BLOCKS 2>/dev/null
} | md5sum > "$workdir/ck"
set dummy `cat "$workdir/ck"`
newck=$2
rm -f "$workdir/ck"
if test "$SFX_CHECKSUM" = "$newck"; then
echo "$CMD: checksum is OK"
else
echo "$CMD: *** checksum mismatch" 1>&2
exit 1
fi
_t()
{
local c z
c="$1"; shift
z="$1"; shift
$c | $UNZIP $UNZIPQ $UNZIPV -l "$z" 1>/dev/null 2>&1
return $?
}
# be wary of busybox unzip
# http://lists.busybox.net/pipermail/busybox/2010-August/073131.html
case "$SFX_PAD:$SFX_UNZIP:$SFX_LOOP:$SFX_PIPE" in
:1:*:*)
echo "$CMD: testing for SFX support"
if ! _t ":" "$SHARABS"; then
echo "$CMD: *** SFX failed" 1>&2
SFX_UNZIP=
fi
;;
esac
case "$SFX_PAD:$SFX_UNZIP:$SFX_LOOP:$SFX_PIPE" in
::1:*)
echo "$CMD: testing for loopback support"
UNZIPLOOP=`losetup -f`
losetup -r -o $SFX_BYTES "$UNZIPLOOP" "$SHARABS"
if ! _t ":" "$UNZIPLOOP"; then
echo "$CMD: *** loopback failed" 1>&2
SFX_LOOP=
fi
;;
esac
case "$SFX_PAD:$SFX_UNZIP:$SFX_LOOP:$SFX_PIPE" in
:::1)
echo "$CMD: testing for pipe support"
if ! _t "dd if=$SHARABS bs=$SFX_BLOCKSIZE skip=$SFX_BLOCKS" "-"; then
echo "$CMD: *** pipe failed" 1>&2
SFX_PIPE=
fi
;;
esac
if test "$SFX_PAD"; then
echo "$CMD: extracting pad"
dd if="$SHARABS" of=$workdir/zip.bin bs=512 skip=$(($SFX_BLOCKS-1)) count=1
if test "$SFX_INPLACE"; then
_CAT=":"
_ZIP="$SHARABS"
else
echo "$CMD: copying file before resetting pad"
cp "$SHARABS" $workdir/onie-installer.zip
_CAT=":"
_ZIP="$workdir/onie-installer.zip"
fi
echo "$CMD: resetting pad"
dd if="$workdir/zip.bin" of="$_ZIP" bs=512 count=1 conv=notrunc
elif test "$SFX_UNZIP"; then
echo "$CMD: processing SFX with unzip"
_CAT=":"
_ZIP="$SHARABS"
elif test "$SFX_LOOP"; then
echo "$CMD: processing SFX with losetup"
_CAT=":"
_ZIP="$UNZIPLOOP"
elif test "$SFX_PIPE"; then
echo "$CMD: processing SFX with dd"
_CAT="dd if=$SHARABS bs=$SFX_BLOCKSIZE skip=$SFX_BLOCKS"
_ZIP="-"
else
echo "$CMD: *** copying file to find zip offset"
dd if=$SHARABS of=$workdir/onie-installer.zip bs=$SFX_BLOCKSIZE skip=$SFX_BLOCKS
_CAT=":"
_ZIP="$workdir/onie-installer.zip"
fi
if test "$mode" = "unzip"; then
echo "$CMD: processing with zip"
if test "$UNZIPDIR"; then
cd "$UNZIPDIR"
fi
$_CAT | $UNZIP $UNZIPQ $UNZIPV $UNZIPOPTS "$_ZIP" $UNZIPARGS
sts=$?
test $sts -eq 0 || exit $sts
if test -f "$SFX_PERMS"; then
echo "$CMD: correcting permissions with $SFX_PERMS"
chmod +x "$SFX_PERMS"
./"$SFX_PERMS"
fi
exit $sts
fi
if test "$mode" != "install"; then
echo "$CMD: *** invalid mode: $mode" 1>&2
exit 1
fi
if test "$UNZIPDIR"; then
:
else
UNZIPDIR=$workdir
fi
banner=`unzip 2>&1` || :
case "$banner" in
*"-t"*)
echo "$CMD: testing shar"
$_CAT | $UNZIP $UNZIPQ $UNZIPV $UNZIPOPTS -t "$_ZIP" $UNZIPARGS
sts=$?
test $sts -eq 0 || exit $sts
;;
esac
shardir=`dirname $0`
shardir=`cd $shardir && pwd`
echo "$CMD: extracting shar into $UNZIPDIR"
cd $UNZIPDIR
if test "$SFX_LAZY"; then
$_CAT | $UNZIP $UNZIPQ $UNZIPOPTS "$_ZIP" "$SFX_INSTALL"
else
$_CAT | $UNZIP $UNZIPQ $UNZIPOPTS "$_ZIP" $UNZIPARGS
fi
if test -f "$SFX_PERMS"; then
echo "$CMD: correcting permissions with $SFX_PERMS"
chmod +x "$SFX_PERMS"
./"$SFX_PERMS"
fi
if test -f "$SFX_INSTALL"; then
echo "$CMD: invoking installer $SFX_INSTALL"
tmp_install=`mktemp $UNZIPDIR/install-XXXXXX`
mv "$SFX_INSTALL" $tmp_install
chmod +x "$tmp_install"
export SFX_BLOCKSIZE SFX_BLOCKS SFX_PAD SFX_UNZIP SFX_LOOP SFX_PIPE SFX_LAZY SFX_PERMS
case "$-" in
*x*)
dashx="-x"
;;
esac
if test -e "$_ZIP"; then
eval "$tmp_install" $dashx "$_ZIP"
else
eval "$tmp_install" $dashx "$SHARABS"
fi
exit $?
else
echo "$CMD: *** missing installer: $SFX_INSTALL" 1>&2
exit 1
fi
##############################
#
# END OF SHAR HEADER
#
# BINARY ZIP DATA FOLLOWS
#
# DO NOT EDIT!
#
##############################