diff options
-rwxr-xr-x | sbodl | 156 |
1 files changed, 156 insertions, 0 deletions
@@ -0,0 +1,156 @@ +#!/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 <<EOF +$SELF v$VERSION - Download the sources for a SlackBuilds.org build. +(c) 2014, 2023 B. Watson (urchlay@slackware.uk) +Licensed under the WTFPL: Do WTF you want with this. + +Usage: $SELF [-f] <wget-options> + +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" + 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" + fi + shift +done |