mirror of
git://slackware.nl/current.git
synced 2025-01-29 08:36:40 +01:00
d31c50870d
Thu Jun 30 20:26:57 UTC 2016 Slackware 14.2 x86_64 stable is released! The long development cycle (the Linux community has lately been living in "interesting times", as they say) is finally behind us, and we're proud to announce the release of Slackware 14.2. The new release brings many updates and modern tools, has switched from udev to eudev (no systemd), and adds well over a hundred new packages to the system. Thanks to the team, the upstream developers, the dedicated Slackware community, and everyone else who pitched in to help make this release a reality. The ISOs are off to be replicated, a 6 CD-ROM 32-bit set and a dual-sided 32-bit/64-bit x86/x86_64 DVD. Please consider supporting the Slackware project by picking up a copy from store.slackware.com. We're taking pre-orders now, and offer a discount if you sign up for a subscription. Have fun! :-)
554 lines
19 KiB
Bash
554 lines
19 KiB
Bash
#!/bin/sh
|
|
# Copyright 1994, 1998, 2000 Patrick Volkerding, Concord, CA, USA
|
|
# Copyright 2001, 2003 Slackware Linux, Inc., Concord, CA, USA
|
|
# Copyright 2007, 2009, 2011 Patrick Volkerding, Sebeka, MN, USA
|
|
# All rights reserved.
|
|
#
|
|
# Redistribution and use of this script, with or without modification, is
|
|
# permitted provided that the following conditions are met:
|
|
#
|
|
# 1. Redistributions of this script must retain the above copyright
|
|
# notice, this list of conditions and the following disclaimer.
|
|
#
|
|
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
|
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
|
# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
|
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
#
|
|
# Sun Sep 6 21:58:36 BST 2009
|
|
# Replaced usage of "cat" with STDIN redirection or file name parameters
|
|
# to speed up execution on ARM.
|
|
# Replaced pkgbase & package_name code with 'sed' script by Jim Hawkins.
|
|
#
|
|
# Sat Apr 25 21:18:53 UTC 2009
|
|
# Converted to use new pkgbase() function to remove pathname and
|
|
# valid package extensions.
|
|
#
|
|
# Sat Apr 4 22:58:06 CDT 2009
|
|
# Support additional compression formats if the supporting utilities exist:
|
|
# .tbz - bzip2
|
|
# .tlz - lzma
|
|
# .txz - xz (also LZMA)
|
|
# And of course, .tgz (gzip) is not going anywhere. :-) <volkerdi>
|
|
# Add command switches to determine the uncompressed package size even if
|
|
# that will slow things down, and to add the package's md5sum to the
|
|
# metadata stored in /var/log/packages/.
|
|
#
|
|
# Fri Dec 21 17:21:35 CST 2007
|
|
# Added a patch from Johnny Morano to work around package removal issues
|
|
# caused by packages that do not comply with FHS combined with a grep
|
|
# regex error in installpkg. Any package with a single-letter top-
|
|
# level directory could not be removed.
|
|
#
|
|
# Shortened some of the top-line dialog output to avoid overflowing the
|
|
# textbox (needed as some of the packages, especially in X, have very
|
|
# long base package names now). <pjv>
|
|
#
|
|
# Sun Nov 26 12:38:25 CST 1995
|
|
# Added patch from Glenn Moloney <glenn@physics.unimelb.edu.au> to allow
|
|
# packages to be installed to directories other than /.
|
|
#
|
|
# Wed Mar 18 15:15:51 CST 1998
|
|
# Changed $TMP directory to /var/log/setup/tmp, and chmod'ed it 700 to close
|
|
# some security holes.
|
|
|
|
# A stronger formula is needed to regularize output that will be parsed.
|
|
unset LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY \
|
|
LC_MESSAGES LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT \
|
|
LC_IDENTIFICATION LC_ALL
|
|
LANG=C
|
|
export LANG
|
|
|
|
# Return a package name that has been stripped of the dirname portion
|
|
# and any of the valid extensions (only):
|
|
pkgbase() {
|
|
# basename + strip extensions .tbz, .tgz, .tlz and .txz
|
|
echo "$1" | sed 's?.*/??;s/\.t[bglx]z$//'
|
|
}
|
|
|
|
# If installpkg encounters a problem, it will return a non-zero error code.
|
|
# If it finds more than one problem (i.e. with a list of packages) you'll only
|
|
# hear about the most recent one. :)
|
|
# 1 = tar returned error code
|
|
# 2 = corrupt compression envelope
|
|
# 3 = does not end in .tgz
|
|
# 4 = no such file
|
|
# 5 = external compression utility missing
|
|
# 99 = user abort from menu mode
|
|
EXITSTATUS=0
|
|
|
|
# Do not store md5sums by default:
|
|
MD5SUM=0
|
|
|
|
# So that we know what to expect...
|
|
umask 022
|
|
TAR=tar-1.13
|
|
$TAR --help 1> /dev/null 2> /dev/null
|
|
if [ ! $? = 0 ]; then
|
|
TAR=tar
|
|
fi
|
|
if [ ! "$(LC_MESSAGES=C $TAR --version)" = "tar (GNU tar) 1.13
|
|
|
|
Copyright (C) 1988, 92,93,94,95,96,97,98, 1999 Free Software Foundation, Inc.
|
|
This is free software; see the source for copying conditions. There is NO
|
|
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
Written by John Gilmore and Jay Fenlason." ]; then
|
|
echo "WARNING: pkgtools are unstable with tar > 1.13."
|
|
echo " You should provide a \"tar-1.13\" in your \$PATH."
|
|
sleep 5
|
|
fi
|
|
|
|
usage() {
|
|
cat << EOF
|
|
Usage: installpkg [options] <package_filename>
|
|
|
|
Installpkg is used to install a .t{gz,bz,lz,xz} package like this:
|
|
installpkg slackware-package-1.0.0-i486-1.tgz (or .tbz, .tlz, .txz)
|
|
|
|
options: --warn (warn if files will be overwritten, but do not install)
|
|
--root /mnt (install someplace else, like /mnt)
|
|
--infobox (use dialog to draw an info box)
|
|
--terse (display a one-line short description for install)
|
|
--menu (confirm package installation with a menu, unless
|
|
the priority is [required] or ADD)
|
|
--ask (used with menu mode: always ask if a package should be
|
|
installed regardless of what the package's priority is)
|
|
--priority ADD|REC|OPT|SKP (provide a priority for the entire
|
|
package list to use instead of the priority in the
|
|
tagfile)
|
|
--tagfile /somedir/tagfile (specify a different file to use
|
|
for package priorities. The default is "tagfile" in
|
|
the package's directory)
|
|
--md5sum (record the package's md5sum in the metadata file)
|
|
|
|
EOF
|
|
}
|
|
|
|
# Eliminate whitespace function:
|
|
crunch() {
|
|
while read FOO ; do
|
|
echo $FOO
|
|
done
|
|
}
|
|
|
|
# Strip version, architecture and build from the end of the name
|
|
package_name() {
|
|
pkgbase $1 | sed 's?-[^-]*-[^-]*-[^-]*$??'
|
|
}
|
|
|
|
# Parse options:
|
|
MODE=install # standard text-mode
|
|
while [ 0 ]; do
|
|
if [ "$1" = "-warn" -o "$1" = "--warn" ]; then
|
|
MODE=warn
|
|
shift 1
|
|
elif [ "$1" = "-md5sum" -o "$1" = "--md5sum" ]; then
|
|
MD5SUM=1
|
|
shift 1
|
|
elif [ "$1" = "-infobox" -o "$1" = "--infobox" ]; then
|
|
MODE=infobox
|
|
shift 1
|
|
elif [ "$1" = "-terse" -o "$1" = "--terse" ]; then
|
|
MODE=terse
|
|
shift 1
|
|
elif [ "$1" = "-menu" -o "$1" = "--menu" ]; then
|
|
MODE=menu
|
|
shift 1
|
|
elif [ "$1" = "-ask" -o "$1" = "--ask" ]; then
|
|
ALWAYSASK="yes"
|
|
shift 1
|
|
elif [ "$1" = "-tagfile" -o "$1" = "--tagfile" ]; then
|
|
if [ -r "$2" ]; then
|
|
USERTAGFILE="$2"
|
|
elif [ -r "$(pwd)/$2" ]; then
|
|
USERTAGFILE="$(pwd)/$2"
|
|
else
|
|
usage
|
|
exit
|
|
fi
|
|
shift 2
|
|
elif [ "$1" = "-priority" -o "$1" = "--priority" ]; then
|
|
if [ "$2" = "" ]; then
|
|
usage
|
|
exit
|
|
fi
|
|
USERPRIORITY="$2"
|
|
shift 2
|
|
elif [ "$1" = "-root" -o "$1" = "--root" ]; then
|
|
if [ "$2" = "" ]; then
|
|
usage
|
|
exit
|
|
fi
|
|
ROOT="$2"
|
|
shift 2
|
|
else
|
|
break
|
|
fi
|
|
done
|
|
|
|
# Set the prefix for the package database directories (packages, scripts).
|
|
ADM_DIR="$ROOT/var/log"
|
|
# If the directories don't exist, "initialize" the package database:
|
|
for PKGDBDIR in packages removed_packages removed_scripts scripts setup ; do
|
|
if [ ! -d $ADM_DIR/$PKGDBDIR ]; then
|
|
rm -rf $ADM_DIR/$PKGDBDIR # make sure it's not a symlink or something stupid
|
|
mkdir -p $ADM_DIR/$PKGDBDIR
|
|
chmod 755 $ADM_DIR/$PKGDBDIR
|
|
fi
|
|
done
|
|
|
|
# Make sure there's a proper temp directory:
|
|
TMP=$ADM_DIR/setup/tmp
|
|
# If the $TMP directory doesn't exist, create it:
|
|
if [ ! -d $TMP ]; then
|
|
rm -rf $TMP # make sure it's not a symlink or something stupid
|
|
mkdir -p $TMP
|
|
chmod 700 $TMP # no need to leave it open
|
|
fi
|
|
|
|
# usage(), exit if called with no arguments:
|
|
if [ $# = 0 ]; then
|
|
usage;
|
|
exit
|
|
fi
|
|
|
|
# If -warn mode was requested, produce the output and then exit:
|
|
if [ "$MODE" = "warn" ]; then
|
|
while [ -f "$1" ]; do
|
|
mkdir -p $TMP/scan$$
|
|
# Determine extension:
|
|
packageext="$( echo $1 | rev | cut -f 1 -d . | rev)"
|
|
# Determine compressor utility:
|
|
case $packageext in
|
|
'tgz' )
|
|
packagecompression=gzip
|
|
;;
|
|
'tbz' )
|
|
packagecompression=bzip2
|
|
;;
|
|
'tlz' )
|
|
packagecompression=lzma
|
|
;;
|
|
'txz' )
|
|
packagecompression=xz
|
|
;;
|
|
esac
|
|
( cd $TMP/scan$$ ; $packagecompression -dc | $TAR xf - install ) < $1 2> /dev/null
|
|
if [ -r $TMP/scan$$/install/doinst.sh ]; then
|
|
if grep ' rm -rf ' $TMP/scan$$/install/doinst.sh 1>/dev/null 2>/dev/null ; then
|
|
grep ' rm -rf ' $TMP/scan$$/install/doinst.sh > $TMP/scan$$/install/delete
|
|
for f in `cat $TMP/scan$$/install/delete | cut -f 3,7 -d ' ' | tr ' ' '/'`; do
|
|
f="/$f"
|
|
if [ -f "$f" -o -L "$f" ]; then
|
|
echo "$f"
|
|
fi
|
|
done
|
|
fi
|
|
if [ -d $TMP/scan$$ ]; then
|
|
( cd $TMP/scan$$ ; rm -rf install ) 2> /dev/null
|
|
( cd $TMP ; rmdir scan$$ ) 2> /dev/null
|
|
fi
|
|
fi
|
|
for f in `( $packagecompression -dc | $TAR tf - ) < $1 | grep -v 'drwx'`; do
|
|
f="/$f"
|
|
if [ -f "$f" -o -L "$f" ]; then
|
|
echo "$f"
|
|
fi
|
|
done
|
|
shift 1
|
|
done
|
|
exit
|
|
fi
|
|
|
|
# Main loop:
|
|
for package in $* ; do
|
|
|
|
# Simple package integrity check:
|
|
if [ ! -f $package ]; then
|
|
EXITSTATUS=4
|
|
if [ "$MODE" = "install" ]; then
|
|
echo "Cannot install $package: file not found"
|
|
fi
|
|
continue;
|
|
fi
|
|
|
|
# "shortname" isn't really THAT short...
|
|
# it's just the full name without ".t{gz,bz,lz,xz}"
|
|
shortname="$(pkgbase $package)"
|
|
packagedir="$(dirname $package)"
|
|
# This is the base package name, used for grepping tagfiles and descriptions:
|
|
packagebase="$(package_name $shortname)"
|
|
|
|
# Reject package if it does not end in '.t{gz,bz,lz,xz}':
|
|
if [ "$shortname" = "$(basename $package)" ]; then
|
|
EXITSTATUS=3
|
|
if [ "$MODE" = "install" ]; then
|
|
echo "Cannot install $package: file does not end in .tgz, .tbz, .tlz, or .txz"
|
|
fi
|
|
continue;
|
|
fi
|
|
|
|
# Determine extension:
|
|
packageext="$(echo $package | rev | cut -f 1 -d . | rev)"
|
|
|
|
# Determine compressor utility:
|
|
case $packageext in
|
|
'tgz' )
|
|
packagecompression=gzip
|
|
;;
|
|
'tbz' )
|
|
packagecompression=bzip2
|
|
;;
|
|
'tlz' )
|
|
packagecompression=lzma
|
|
;;
|
|
'txz' )
|
|
packagecompression=xz
|
|
;;
|
|
esac
|
|
|
|
# Test presence of external compression utility:
|
|
if ! $packagecompression --help 1> /dev/null 2> /dev/null ; then
|
|
EXITSTATUS=5
|
|
if [ "$MODE" = "install" ]; then
|
|
echo "Cannot install $package: external compression utility $packagecompression missing"
|
|
fi
|
|
continue;
|
|
fi
|
|
|
|
# Determine package's priority:
|
|
unset PRIORITY
|
|
if [ "$USERTAGFILE" = "" ]; then
|
|
TAGFILE="$packagedir/tagfile"
|
|
else
|
|
TAGFILE="$USERTAGFILE"
|
|
fi
|
|
if [ ! -r "$TAGFILE" ]; then
|
|
TAGFILE=/dev/null
|
|
fi
|
|
if grep "^$packagebase:" "$TAGFILE" | grep ADD > /dev/null 2> /dev/null ; then
|
|
PRIORITY="ADD"
|
|
elif grep "^$packagebase:" "$TAGFILE" | grep REC > /dev/null 2> /dev/null ; then
|
|
PRIORITY="REC"
|
|
elif grep "^$packagebase:" "$TAGFILE" | grep OPT > /dev/null 2> /dev/null ; then
|
|
PRIORITY="OPT"
|
|
elif grep "^$packagebase:" "$TAGFILE" | grep SKP > /dev/null 2> /dev/null ; then
|
|
PRIORITY="SKP"
|
|
fi
|
|
if [ "$PRIORITY" = "ADD" ]; then
|
|
PMSG="[ADD]"
|
|
elif [ "$PRIORITY" = "REC" ]; then
|
|
PMSG="[REC]"
|
|
elif [ "$PRIORITY" = "OPT" ]; then
|
|
PMSG="[OPT]"
|
|
elif [ "$PRIORITY" = "SKP" ]; then
|
|
PMSG="[SKP]"
|
|
else
|
|
PMSG=""
|
|
fi
|
|
|
|
# If a tagfile wants this package to be skipped, do that now before
|
|
# wasting any more CPU on it:
|
|
if [ "$PRIORITY" = "SKP" -a ! "$ALWAYSASK" = "yes" ]; then
|
|
continue # next package
|
|
fi
|
|
|
|
# Figure out some package information, like the compressed and uncompressed
|
|
# sizes, and where to find the package description:
|
|
COMPRESSED="$(/bin/du -sh "$(readlink -f $package)" | cut -f 1)"
|
|
DESCRIPTION=""
|
|
# First check for .txt file next to the package, since this is faster:
|
|
if grep "^$packagebase:" "$packagedir/$shortname.txt" 1> /dev/null 2> /dev/null ; then
|
|
DESCRIPTION="$packagedir/$shortname.txt"
|
|
elif grep "^$shortname:" "$packagedir/$shortname.txt" 1> /dev/null 2> /dev/null ; then
|
|
DESCRIPTION="$packagedir/$shortname.txt"
|
|
fi
|
|
|
|
# Test tarball integrity and get uncompressed package size:
|
|
if [ "$MODE" = "install" ]; then
|
|
echo "Verifying package $(basename $package)."
|
|
fi
|
|
cat $package | $packagecompression -dc | dd 2> $TMP/tmpsize$$ | $TAR tf - 1> $TMP/tmplist$$ 2> /dev/null
|
|
TARERROR=$?
|
|
if [ ! "$TARERROR" = "0" ]; then
|
|
EXITSTATUS=1 # tar file corrupt
|
|
if [ "$MODE" = "install" ]; then
|
|
echo "Unable to install $package: tar archive is corrupt (tar returned error code $TARERROR)"
|
|
fi
|
|
rm -f $TMP/tmplist$$ $TMP/tmpsize$$
|
|
continue
|
|
fi
|
|
UNCOMPRESSED="$(cat $TMP/tmpsize$$ | tail -n 1 | cut -f 1 -d ' ' | numfmt --to=iec)"
|
|
rm -f $TMP/tmpsize$$
|
|
|
|
# If we still don't have a package description, look inside the package.
|
|
# This requires a costly untar.
|
|
if [ "$DESCRIPTION" = "" ]; then
|
|
mkdir -p $TMP/scan$$
|
|
( cd $TMP/scan$$ ; $packagecompression -dc | $TAR xf - install ) < $package 2> /dev/null
|
|
if grep "^$packagebase:" "$TMP/scan$$/install/slack-desc" 1> /dev/null 2> /dev/null ; then
|
|
DESCRIPTION="$TMP/scan$$/install/slack-desc"
|
|
elif grep "^$shortname:" "$TMP/scan$$/install/slack-desc" 1> /dev/null 2> /dev/null ; then
|
|
DESCRIPTION="$TMP/scan$$/install/slack-desc"
|
|
fi
|
|
fi
|
|
|
|
if [ "$DESCRIPTION" = "" ]; then
|
|
#echo "WARNING NO SLACK-DESC"
|
|
DESCRIPTION="/dev/null"
|
|
fi
|
|
|
|
# Gather package infomation into a temporary file:
|
|
grep "^$packagebase:" $DESCRIPTION | cut -f 2- -d : | cut -b2- 1> $TMP/tmpmsg$$ 2> /dev/null
|
|
if [ "$shortname" != "$packagebase" ]; then
|
|
grep "^$shortname:" $DESCRIPTION | cut -f 2- -d : | cut -b2- 1>> $TMP/tmpmsg$$ 2> /dev/null
|
|
fi
|
|
# Adjust the length here. This allows a slack-desc to be any size up to 13 lines instead of fixed at 11.
|
|
LENGTH=$(wc -l < $TMP/tmpmsg$$ )
|
|
while [ $LENGTH -lt 12 ]; do
|
|
echo >> $TMP/tmpmsg$$
|
|
LENGTH=$(expr $LENGTH + 1)
|
|
done
|
|
echo "Size: Compressed: ${COMPRESSED}, uncompressed: ${UNCOMPRESSED}." >> $TMP/tmpmsg$$
|
|
# For recent versions of dialog it is necessary to add \n to the end of each line
|
|
# or it will remove repeating spaces and mess up our careful formatting:
|
|
cat << EOF > $TMP/controlns$$
|
|
\n
|
|
\n
|
|
\n
|
|
\n
|
|
\n
|
|
\n
|
|
\n
|
|
\n
|
|
\n
|
|
\n
|
|
\n
|
|
\n
|
|
\n
|
|
EOF
|
|
paste -d "" $TMP/tmpmsg$$ $TMP/controlns$$ > $TMP/pasted$$
|
|
rm -f $TMP/controlns$$
|
|
mv $TMP/pasted$$ $TMP/tmpmsg$$
|
|
# Emit information to the console:
|
|
if [ "$MODE" = "install" ]; then
|
|
if [ "$PMSG" = "" ]; then
|
|
echo "Installing package $(basename $package):"
|
|
else
|
|
echo "Installing package $(basename $package) $PMSG:"
|
|
fi
|
|
echo "PACKAGE DESCRIPTION:"
|
|
grep "^$packagebase:" $DESCRIPTION | uniq | sed "s/^$packagebase:/#/g"
|
|
if [ "$shortname" != "$packagebase" ]; then
|
|
grep "^$shortname:" $DESCRIPTION | uniq | sed "s/^$shortname:/#/g"
|
|
fi
|
|
elif [ "$MODE" = "terse" ]; then # emit a single description line
|
|
printf "%-72s %-6s\n" "$(echo $shortname: $(echo $(cat $DESCRIPTION | grep "^$packagebase:" | sed "s/^$packagebase: //g" | head -n 1 | tr -d '()' | sed "s/^$packagebase //g" ) $(echo " ......................................................................")) | cut -b1-72)" "[${UNCOMPRESSED}]" | cut -b1-80
|
|
elif [ "$MODE" = "infobox" ]; then # install infobox package
|
|
dialog --title "Installing package $shortname $PMSG" --infobox "$(cat $TMP/tmpmsg$$)" 0 0
|
|
elif [ "$MODE" = "menu" -a "$PRIORITY" = "ADD" -a ! "$ALWAYSASK" = "yes" ]; then # ADD overrides menu mode unless -ask was used
|
|
dialog --title "Installing package $shortname $PMSG" --infobox "$(cat $TMP/tmpmsg$$)" 0 0
|
|
elif [ "$MODE" = "menu" -a "$USERPRIORITY" = "ADD" ]; then # install no matter what $PRIORITY
|
|
dialog --title "Installing package $shortname $PMSG" --infobox "$(cat $TMP/tmpmsg$$)" 0 0
|
|
else # we must need a full menu:
|
|
dialog --title "Package Name: $shortname $PMSG" --menu "$(cat $TMP/tmpmsg$$)" 0 0 3 \
|
|
"Yes" "Install package $shortname" \
|
|
"No" "Do not install package $shortname" \
|
|
"Quit" "Abort software installation completely" 2> $TMP/reply$$
|
|
if [ ! $? = 0 ]; then
|
|
echo "No" > $TMP/reply$$
|
|
fi
|
|
REPLY="$(cat $TMP/reply$$)"
|
|
rm -f $TMP/reply$$ $TMP/tmpmsg$$
|
|
if [ "$REPLY" = "Quit" ]; then
|
|
exit 99 # EXIT STATUS 99 = ABORT!
|
|
elif [ "$REPLY" = "No" ]; then
|
|
continue # skip the package
|
|
fi
|
|
fi
|
|
|
|
# Make sure there are no symbolic links sitting in the way of
|
|
# incoming package files:
|
|
grep -v "/$" $TMP/tmplist$$ | while read file ; do
|
|
if [ -L "$ROOT/$file" ]; then
|
|
rm -f "$ROOT/$file"
|
|
fi
|
|
done
|
|
rm -f $TMP/tmplist$$
|
|
|
|
# Write the package file database entry and install the package:
|
|
echo "PACKAGE NAME: $shortname" > $ADM_DIR/packages/$shortname
|
|
echo "COMPRESSED PACKAGE SIZE: $COMPRESSED" >> $ADM_DIR/packages/$shortname
|
|
echo "UNCOMPRESSED PACKAGE SIZE: $UNCOMPRESSED" >> $ADM_DIR/packages/$shortname
|
|
echo "PACKAGE LOCATION: $package" >> $ADM_DIR/packages/$shortname
|
|
# Record the md5sum if that's a selected option:
|
|
if [ $MD5SUM = 1 ]; then
|
|
echo "PACKAGE MD5SUM: $(md5sum $package | cut -f 1 -d ' ')" >> $ADM_DIR/packages/$shortname
|
|
fi
|
|
echo "PACKAGE DESCRIPTION:" >> $ADM_DIR/packages/$shortname
|
|
grep "^$packagebase:" $DESCRIPTION >> $ADM_DIR/packages/$shortname 2> /dev/null
|
|
if [ "$shortname" != "$packagebase" ]; then
|
|
grep "^$shortname:" $DESCRIPTION >> $ADM_DIR/packages/$shortname 2> /dev/null
|
|
fi
|
|
echo "FILE LIST:" >> $ADM_DIR/packages/$shortname
|
|
( cd $ROOT/ ; $packagecompression -dc | $TAR -xlUpvf - | sort ) < $package >> $TMP/$shortname 2> /dev/null
|
|
if [ "$( grep '^\./' $TMP/$shortname | wc -l | tr -d ' ')" = "1" ]; then
|
|
# Good. We have a package that meets the Slackware spec.
|
|
cat $TMP/$shortname >> $ADM_DIR/packages/$shortname
|
|
else
|
|
# Some dumb bunny built a package with something other than makepkg. Bad!
|
|
# Oh well. Bound to happen. Par for the course. Fix it and move on...
|
|
echo "WARNING: Package has not been created with 'makepkg'"
|
|
echo './' >> $ADM_DIR/packages/$shortname
|
|
cat $TMP/$shortname >> $ADM_DIR/packages/$shortname
|
|
fi
|
|
rm -f $TMP/$shortname
|
|
|
|
# It's a good idea to make sure those newly installed libraries
|
|
# are properly activated for use:
|
|
if [ -x /sbin/ldconfig ]; then
|
|
/sbin/ldconfig
|
|
fi
|
|
|
|
if [ -f $ROOT/install/doinst.sh ]; then
|
|
if [ "$MODE" = "install" ]; then
|
|
echo "Executing install script for $(basename $package)."
|
|
fi
|
|
# If bash is available, use sed to convert the install script to use pushd/popd
|
|
# rather than spawning subshells which is slow on ARM. This will also speed up
|
|
# install script processing on any platform.
|
|
if [ -x /bin/bash ]; then
|
|
( cd $ROOT/ ; sed -e's?^( cd \([^;]*\);\(.*\) )$?pushd \1 \&\> /dev/null ; \2 ; popd \&\> /dev/null?g ' install/doinst.sh | /bin/bash ; )
|
|
else
|
|
( cd $ROOT/ ; sh install/doinst.sh ; )
|
|
fi
|
|
fi
|
|
# Clean up the mess...
|
|
if [ -d $ROOT/install ]; then
|
|
if [ -r $ROOT/install/doinst.sh ]; then
|
|
cp $ROOT/install/doinst.sh $ADM_DIR/scripts/$shortname
|
|
chmod 755 $ADM_DIR/scripts/$shortname
|
|
fi
|
|
# /install/doinst.sh and /install/slack-* are reserved locations for the package system.
|
|
( cd $ROOT/install ; rm -f doinst.sh slack-* 1> /dev/null 2>&1 )
|
|
rmdir $ROOT/install 1> /dev/null 2>&1
|
|
fi
|
|
# If we used a scan directory, get rid of it:
|
|
if [ -d "$TMP/scan$$" ]; then
|
|
rm -rf "$TMP/scan$$"
|
|
fi
|
|
rm -f $TMP/tmpmsg$$ $TMP/reply$$
|
|
if [ "$MODE" = "install" ]; then
|
|
echo "Package $(basename $package) installed."
|
|
echo
|
|
fi
|
|
done
|
|
|
|
exit $EXITSTATUS
|