mirror of
https://github.com/Telecominfraproject/OpenNetworkLinux.git
synced 2025-11-06 21:28:20 +00:00
- allow some SFX settings to be overridden - refactor checksum validation - support --inplace padding fixups to economize on disk space
292 lines
6.4 KiB
Bash
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!
|
|
#
|
|
##############################
|