slackware-current/source/ap/slackpkg/files/slackpkg
Patrick J Volkerding 7de9181e0d Sun Sep 18 19:02:14 UTC 2022
ap/slackpkg-15.0.10-noarch-2.txz:  Rebuilt.
  fix: egrep and fgrep commands have been deprecated since 2007
  fix: grep warning: stray \ before /
  Thanks to shamilbi.
ap/vim-9.0.0500-x86_64-1.txz:  Upgraded.
  Fixed heap-based buffer overflow.
  Thanks to marav for the heads-up.
  For more information, see:
    https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-3234
  (* Security fix *)
x/ibus-m17n-1.4.17-x86_64-1.txz:  Upgraded.
xap/vim-gvim-9.0.0500-x86_64-1.txz:  Upgraded.
2022-09-19 07:00:16 +02:00

614 lines
14 KiB
Bash

#!/bin/bash
#
# SlackPkg - An Automated packaging tool for Slackware Linux
# Copyright (C) 2003-2011 Roberto F. Batista, Evaldo Gardenali
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# Project Page: https://slackpkg.org/
# Roberto F. Batista (aka PiterPunk) piterpunk@slackware.com
# Evaldo Gardenali (aka UdontKnow) evaldogardenali@fasternet.com.br
#
# Ensure that we're not at the epoch. slackpkg breaks with GPG checks when
# the date is so far in the past:
if [ $( date +%s ) -le 1437841588 ]; then
cat <<"EOF"
Error: Your system date is wrong. slackpkg requires that the date be correct
so that the package signatures can be verified.
The date may be incorrect because you have a system such as a Raspberry Pi that
does does not have an RTC (Real Time Clock), or that the correct date was unable
to be read from the RTC due to a driver bug, or a missing driver.
You may wish to set up NTP on your system:
http://docs.slackware.com/howtos:network_services:ntp
EOF
exit 1
fi
#========================================================================
#
# LOAD CONFIGURATIONS
#
#
# CONF = configuration directory
# SOURCE = A mirror of Slackware. Source can be set by editing $CONF/mirrors
#
VERSION=@VERSION@
PATH=/bin:/usr/bin:/sbin:/usr/sbin
SLACKWARE_VERSION=$(cat /etc/slackware-version | cut -f2 -d\ )
[ -z "$ROOT" ] && CONF=${CONF:-/etc/slackpkg}
[ -n "$ROOT" ] && CONF=${CONF:-"${ROOT}/etc/slackpkg"}
SOURCE=$(sed -n '
# Remove leading and trailing blanks
s/^[[:blank:]]*//
s/[[:blank:]]*$//
# Only one token is allowed per line
/[[:blank:]]/d
# A single solidus should end the URI
s,[/]*$,/,
# Print the lines beginning with one of the URI schemes we look for
\@^file://@p
\@^cdrom://@p
\@^local://@p
\@^https\{0,1\}://@p
\@^ftps\{0,1\}://@p' $CONF/mirrors)
PATH='' builtin source $CONF/slackpkg.conf
WORKDIR=${ROOT}/${WORKDIR}
ERROR=""
# Set temporary directory
#
mkdir -p ${ROOT}/tmp
TMPDIR=$(mktemp -p ${ROOT}/tmp -d slackpkg.XXXXXX 2>/dev/null)
if [ $? -ne 0 ]; then
TMPDIR="${ROOT}/tmp/slackpkg.${RANDOM}"
mkdir -p -m 700 $TMPDIR || TMPDIR="FAILED"
fi
#
# Load the slackpkg functions
#
. /usr/libexec/slackpkg/core-functions.sh
#========================================================================
#
# COMMAND LINE PARSING
#
if [ $# -eq 0 ]; then
usage
fi
while [ -n "$1" ] ; do
case $1 in
-delall=on)
DELALL=on
shift
;;
-delall=off)
DELALL=off
shift
;;
-checkmd5=on)
CHECKMD5=on
shift
;;
-checkmd5=off)
CHECKMD5=off
shift
;;
-checkgpg=on)
CHECKGPG=on
shift
;;
-checkgpg=off)
CHECKGPG=off
shift
;;
-checksize=on)
CHECKSIZE=on
shift
;;
-checksize=off)
CHECKSIZE=off
shift
;;
-postinst=on)
POSTINST=on
shift
;;
-postinst=off)
POSTINST=off
shift
;;
-onoff=on)
ONOFF=on
shift
;;
-onoff=off)
ONOFF=off
shift
;;
-download_all=on)
DOWNLOAD_ALL=on
shift
;;
-download_all=off)
DOWNLOAD_ALL=off
shift
;;
-dialog=on)
DIALOG=on
shift
;;
-dialog=off)
DIALOG=off
shift
;;
-dialog_maxargs=*)
DIALOG_MAXARGS=$(echo $1 | cut -f2 -d=)
shift
;;
-batch=on)
BATCH=on
shift
;;
-batch=off)
BATCH=off
shift
;;
-only_new_dotnew=on)
ONLY_NEW_DOTNEW=on
shift
;;
-only_new_dotnew=off)
ONLY_NEW_DOTNEW=off
shift
;;
-orig_backups=on)
ORIG_BACKUPS=on
shift
;;
-orig_backups=off)
ORIG_BACKUPS=off
shift
;;
-use_includes=on)
USE_INCLUDES=on
shift
;;
-use_includes=off)
USE_INCLUDES=off
shift
;;
-spinning=on)
SPINNING=on
shift
;;
-spinning=off)
SPINNING=off
shift
;;
-default_answer=y|-default_answer=yes)
DEFAULT_ANSWER=y
shift
;;
-default_answer=n|-default_answer=no)
DEFAULT_ANSWER=n
shift
;;
-mirror=*)
SOURCE=$(echo $1 | cut -f2 -d=)
shift
;;
install|reinstall|upgrade|remove|download)
CMD=$1
shift
if [ -n "$1" ]; then
if echo $1 | grep -Eq "^\.{0,2}/" ; then
if [ -e $1 ]; then
INPUTLIST=$(cat $1 | tr "\n" " ")
else
echo -e "The file $1 doesn't exist.\n"
cleanup
fi
else
#
# Sanitize the argument. We have some problems with dots
# and plus (.+)
#
#INPUTLIST="$(echo $@ | sed -e 's/\+/\\\+/g' -e 's/\./\\\./g')"
INPUTLIST="$@"
fi
elif [ "$CMD" != "blacklist" ]; then
usage
fi
shift $#
;;
blacklist)
CMD=$1
shift $#
;;
update)
CMD=$1
shift
if [ "$1" = "gpg" ]; then
UPARG="$1"
shift
fi
;;
install-new|upgrade-all|clean-system|new-config|check-updates|show-changelog|help)
CMD=$1
shift
if [ -n "$1" ]; then
echo -e "\n$CMD: Ignoring extra arguments: $@" >&2 >&1
shift $#
fi
;;
generate-template|install-template|remove-template|search|file-search|info)
CMD=$1
shift
if [ -n "$1" ]; then
ARG=$1
shift
else
usage
fi
if [ -n "$1" ]; then
echo -e "\n$CMD: Ignoring extra arguments: $@" >&2 >&1
shift $#
fi
;;
*)
echo -e "\n$1: Unknown option.\n"
usage
;;
esac
done
#========================================================================
#
# SYSTEM SETUP
#
system_setup
#========================================================================
#
# SYNTAX CHECKING
#
system_checkup
#========================================================================
#
# READ EXTRA FUNCTIONS
#
# If you want a new function or need a rewrite of an existing
# feature, you can put your new function in a shell script under
# /usr/libexec/slackpkg/functions.d/
#
# Remember - the new function scripts need to be executable
#
for i in /usr/libexec/slackpkg/functions.d/*.sh; do
if [ -x $i ]; then
. $i
fi
done
#========================================================================
#
# MAIN PROGRAM
#
#
# A *BIG* case with all slackpkg commands -:)
#
case "$CMD" in
help)
full_usage
;;
check-updates)
# output to stdout if no change, or stderr if changes. Will cause
# cron jobs to notify system admin
if checkchangelog 1>/dev/null 2>/dev/null && [ "$UPDATED" != "1" ] ; then
echo "Slackpkg: No updated packages since last check."
else
echo "Slackpkg: Updated packages are available since last check." >&2
EXIT_CODE=100
fi
;;
show-changelog)
# display changelog and exit
if [ -e ${WORKDIR}/ChangeLog.txt ]; then
$MORECMD ${WORKDIR}/ChangeLog.txt
else
echo "ChangeLog.txt file not found. Aborting"
fi
POSTINST=off
;;
update)
# If you are using "slackpkg update gpg" OR the system
# doesn't have Slackware GPG key, download and install
# the key
#
if [ "$UPARG" = "gpg" ] || [ "$GPGFIRSTTIME" = "0" ]; then
get_gpg_key && import_gpg_key
if [ "$UPARG" = "gpg" ]; then
cleanup
fi
fi
updatefilelists
;;
install)
makelist $INPUTLIST
if [ -n "$LIST" ]; then
showlist "$LIST" $CMD
install_pkg
else
echo -e "No packages match the pattern for install. Try:"
echo -e "\n\t$0 reinstall|upgrade $2\n"
POSTINST=off
EXIT_CODE=20
fi
;;
reinstall)
makelist $INPUTLIST
if [ -n "$LIST" ]; then
showlist "$LIST" $CMD
install_pkg
else
echo -e "No packages match the pattern for reinstall. Try:"
echo -e "\n\t$0 install|upgrade $2\n"
POSTINST=off
EXIT_CODE=20
fi
;;
upgrade)
sanity_check
makelist $INPUTLIST
if [ -n "$LIST" ]; then
showlist "$LIST" $CMD
upgrade_pkg
else
echo -e "No packages match the pattern for upgrade. Try:"
echo -e "\n\t$0 install|reinstall $2\n"
POSTINST=off
EXIT_CODE=20
fi
;;
download)
makelist $INPUTLIST
DELALL="off"
if ! [ "$LIST" = "" ]; then
showlist "$LIST" $CMD
for i in $SHOWLIST; do
getpkg $i true
done
else
echo -e "No packages match the pattern for download."
POSTINST=off
EXIT_CODE=20
fi
;;
remove)
makelist $INPUTLIST
if [ "$LIST" = "" ]; then
echo -e "The file(s) $INPUTLIST can't be removed - package not installed.\n"
EXIT_CODE=20
cleanup
fi
showlist "$LIST" $CMD
remove_pkg
;;
clean-system)
makelist $INPUTLIST
if [ -n "$LIST" ]; then
showlist "$LIST" remove
remove_pkg
else
echo -e "No packages match the pattern for clean-system\n"
POSTINST=off
EXIT_CODE=20
fi
;;
upgrade-all)
sanity_check
makelist $INPUTLIST
if ! [ -n "${LIST}" ]; then
echo -e "No packages match the pattern for upgrade. Try:"
echo -e "\n\t$0 install|reinstall $2\n"
POSTINST=off
EXIT_CODE=20
else
showlist "$LIST" upgrade
if [ "$DOWNLOAD_ALL" = "on" ]; then
OLDDEL="$DELALL"
DELALL="off"
for i in $SHOWLIST; do
getpkg $i true
done
DELALL="$OLDDEL"
fi
FOUND=""
FOUND=$(echo $SHOWLIST | tr -s ' ' "\n" | grep "slackpkg-[0-9]")
if [ "$FOUND" != "" ]; then
getpkg $FOUND upgradepkg Upgrading
echo -e "slackpkg was upgraded - you will need start the upgrade process again...\n"
EXIT_CODE=50
cleanup
exit ${EXIT_CODE}
fi
for i in pkgtools aaa_glibc-solibs glibc-solibs aaa_libraries aaa_elflibs readline sed; do
FOUND=""
FOUND=$(echo $SHOWLIST | tr -s ' ' "\n" | grep "${i}-[0-9]")
if [ "$FOUND" != "" ]; then
getpkg $FOUND upgradepkg Upgrading
fi
done
upgrade_pkg
fi
;;
install-new)
makelist ${INPUTLIST}
if ! [ -n "${LIST}" ]; then
echo -e "No packages match the pattern for install. Try:"
echo -e "\n\t$0 upgrade|reinstall $2\n"
POSTINST=off
EXIT_CODE=20
else
showlist "$LIST" install
install_pkg
fi
;;
blacklist)
echo -e "Edit /etc/slackpkg/blacklist to add or remove packages."
echo -e ""
echo -e "Packages in blacklist:\n"
grep -v "^#" $CONF/blacklist | $MORECMD
echo -e ""
;;
file-search)
PATTERN=$(echo $ARG | sed -e 's/\+/\\\+/g' -e 's/\./\\\./g' -e 's/ /\|/g')
makelist $PATTERN
if [ "$LIST" = "" ]; then
echo -e "No packages contains \"$PATTERN\" file."
else
echo -e "The list below shows the packages that contains \"$PATTERN\" file.\n"
searchlist "$LIST"
echo -e "\nYou can search specific packages using \"slackpkg search package\".\n"
fi
;;
search)
PATTERN=$(echo $ARG | sed -e 's/\+/\\\+/g' -e 's/\./\\\./g' -e 's/ /\|/g')
makelist $PATTERN
if [ "$LIST" = "" ]; then
echo -e "No package name matches the pattern."
else
echo -e "The list below shows all packages with name matching \"$PATTERN\".\n"
searchlist "$LIST"
echo -e "\nYou can search specific files using \"slackpkg file-search file\".\n"
fi
;;
info)
PATTERN=$(echo $ARG | sed -e 's/\+/\\\+/g' -e 's/\./\\\./g')
NAME=$(cutpkg $PATTERN)
awk -F: "/PACKAGE NAME:.* ${NAME}-[^-]+-(${ARCH}|fw|noarch)-[^-]+/,/^$/ {
found=1
if (\$1 ~ /"$NAME"/) {
print \$PATTERN
} else {
print \$0
}
}
END {
if ( found != 1 ) {
print \"No packages found! Try:\n\n\tslackpkg search $PATTERN\n\nand choose one (and ONLY one package).\n\"
}
}" ${WORKDIR}/PACKAGES.TXT 2>/dev/null
;;
new-config)
POSTINST=on
;;
generate-template)
TEMPLATE=$ARG.template
if [ -e $TEMPLATEDIR/$TEMPLATE ]; then
echo -e "\
\"$TEMPLATE\" already exists!\n\
\nDo you want to overwrite $TEMPLATE (y/N)? \c"
answer
if [ "$ANSWER" = "Y" -o "$ANSWER" = "y" ]; then
rm $TEMPLATEDIR/$TEMPLATE
echo
else
cleanup
fi
fi
generate_template $ARG
;;
install-template)
TEMPLATE=$ARG.template
if [ -e $TEMPLATEDIR/$TEMPLATE ]; then
( cd $TEMPLATEDIR
parse_template $TEMPLATE
)
INPUTLIST=$(cat ${TMPDIR}/${TEMPLATE}.tmp | tr "\n" " ")
else
echo -e "$ARG template not found!"
cleanup
fi
makelist $INPUTLIST
if [ -n "$LIST" ]; then
showlist "$LIST" $CMD
install_pkg
else
echo -e "All packages from $ARG template are already installed"
POSTINST=off
fi
;;
remove-template)
TEMPLATE=$ARG.template
if [ -e $TEMPLATEDIR/$TEMPLATE ]; then
( cd $TEMPLATEDIR
parse_template $TEMPLATE
)
INPUTLIST=$(cat ${TMPDIR}/${TEMPLATE}.tmp | tr "\n" " ")
else
echo -e "$ARG template not found!"
cleanup
fi
makelist $INPUTLIST
if [ "$LIST" = "" ]; then
echo -e "The template $ARG can't be removed - it isn't installed.\n"
cleanup
fi
showlist "$LIST" $CMD
remove_pkg
;;
*)
usage
;;
esac
#
# Executes the post-install. This is the default
# Before runs post-install, check if the slackpkg option is
# remove, search, update, info or clean-system.
# That options don't change configurations files and, if
# someone remove the kernel, i hope he knows what is doing.
#
for i in check-updates remove search file-search update info blacklist \
clean-system download generate-template remove-template; do
if [ "$CMD" = "$i" ]; then
POSTINST=off
fi
done
if [ "$POSTINST" != "off" ]; then
lookkernel
looknew
fi
cleanup