#!/bin/bash # sbodl, download slackbuilds.org source files # 20230513 bkw: move to the sbo-maintainer-tools repo, clean up for release. # 20191222 bkw: handle broken symlinks in current dir. # change default cache dir. # 20170306 bkw: add caching VERSION=0.8.0 SELF=$( basename $0 ) DEFCACHEDIR=~/sbodl-cache CACHEDIR=${SBODL_CACHEDIR:-$DEFCACHEDIR} ARCHIVE=https://slackware.uk/sbosrcarch RED="\033[1;31m" GREEN="\033[1;32m" COLOR_OFF="\033[0m" usage() { cat < Execute $SELF in the directory that contains the .info and .SlackBuild files. If the files are not found in the current directory, they'll be looked for in the cache directory, and symlinked to the current dir if found there. If they're not in the cache, they'll be downloaded with wget. Each file's md5sum is checked against the .info file in the current directory. Options: -h, --help: Show this help message. -f: Ignore locally cached files, always download. -a: Download from sbosrcarch (Source Archive). Any other options you pass to it will be passed to wget. By default, --content-disposition is used. If you want to disable it, use the --no-content-disposition wget option. The default cache directory is $DEFCACHEDIR, but you can override this by setting SBODL_CACHEDIR in the environment. If you need to download files for a different architecture (e.g. 32-bit files when running on a 64-bit OS), you can override ARCH in the environment: "ARCH=i686 sbodl" would download the 32-bit source file(s). EOF exit 0 } die() { echo "$SELF: $*" 2>&1 exit 1 } [ -d "$CACHEDIR/" ] || mkdir -p $CACHEDIR || die "Can't create $CACHEDIR" # check for our one argument case "$1" in -h|-help|-\?|--help) usage ;; -f) FORCEDL="yes" ; shift ;; -a) USEARCHIVE="yes" ; shift ;; esac source ./$( basename $( pwd ) ).info \ || die "No .info file, are you sure this is a SBo directory? Try '$SELF --help'" # This stanza copied from the SBo template for 14.1: if [ -z "$ARCH" ]; then case "$( uname -m )" in i?86) ARCH=i586 ;; arm*) ARCH=arm ;; *) ARCH=$( uname -m ) ;; esac fi if [ "$ARCH" = "x86_64" ]; then DL=${DOWNLOAD_x86_64:-$DOWNLOAD} SUM=${MD5SUM_x86_64:-$MD5SUM} else DL=$DOWNLOAD SUM=${MD5SUM} fi if [ -z "$DL" ]; then die "Bad .info file (no DOWNLOAD= or DOWNLOAD_x86_64=)." fi # save passed-in command line args for use with wget WGETARGS="$@" set $SUM for dl in $DL; do if [ "$USEARCHIVE" = "yes" ]; then file="$( echo "$dl" | sed 's,.*/,,' )" a=$( echo $1 | cut -b1 ) b=$( echo $1 | cut -b2 ) dl="$ARCHIVE/by-md5/$a/$b/$1/$file" fi EXTRAWGETARGS="--content-disposition " case "$dl" in *sourceforge.net/*|*.sf.net/*) EXTRAWGETARGS="--user-agent wget" ;; *) ;; esac FILE=$( echo "$dl" | sed 's,.*/,,' ) # ignore (rm) broken symlinks [ -L "$FILE" ] && ! [ -e "$FILE" ] && FORCEDL=yes [ "$FORCEDL" = "yes" ] && rm -f "$FILE" if [ -f "$FILE" -a ! -L "$FILE" ]; then # file exists and is a regular file, cache it mv -b "$FILE" "$CACHEDIR" ln -s "$CACHEDIR/$FILE" "$FILE" elif [ -e "$FILE" ]; then # don't do anything : elif [ "$FORCEDL" != "yes" ] && [ -e "$CACHEDIR/$FILE" ]; then ln -s "$CACHEDIR/$FILE" "$FILE" else wget $EXTRAWGETARGS $WGETARGS "$dl" || die "Download failed, try '$SELF -a'." if [ -e "$FILE" ]; then mv -b "$FILE" "$CACHEDIR" ln -s "$CACHEDIR/$FILE" "$FILE" fi fi if [ -e "$FILE" ]; then GOTSUM="$( md5sum "$FILE" | cut -d' ' -f1 )" if [ "$1" != "$GOTSUM" ]; then echo -e "${RED}WARN: md5sum doesn't match${COLOR_OFF}\\n expected: $1\\n got: $GOTSUM" else echo -e "${GREEN}md5sum matches OK${COLOR_OFF}: $1" fi else echo -e "${RED}WARN${COLOR_OFF}: can't find downloaded file $FILE, try '$SELF -a'?" fi shift done