#!/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