aboutsummaryrefslogtreecommitdiff
path: root/sbofindsrc
diff options
context:
space:
mode:
Diffstat (limited to 'sbofindsrc')
-rwxr-xr-xsbofindsrc225
1 files changed, 225 insertions, 0 deletions
diff --git a/sbofindsrc b/sbofindsrc
new file mode 100755
index 0000000..9117faa
--- /dev/null
+++ b/sbofindsrc
@@ -0,0 +1,225 @@
+#!/bin/sh
+
+# 20150827 bkw: attempt to find missing source tarballs
+
+SELF=$( basename $0 )
+
+# to add a repo, list its name here, and write a <name>_download()
+# function, which should return success if a file was downloaded
+# and failure otherwise.
+repos="wayback naptime tld ponce sfdirect gentoo netbsd freebsd debian"
+
+usage() {
+ cat <<EOF
+$SELF - attempt to find slackbuilds.org sources
+
+Usage: $SELF [-t] [path]
+
+path is either an .info file or a directory containing an .info file.
+If no path given, current directory is assumed.
+
+Files are searched for in the following repositories:
+
+$repos
+
+If a source file is found, it's downloaded to the current directory.
+The md5sum is checked, and the file is discarded if it doesn't match.
+
+Exit status is success (0) if a file was found, otherwise nonzero.
+
+-t is test mode, does an HTTP HEAD request instead of downloading,
+and doesn't stop after finding a match.
+EOF
+ exit "$1"
+}
+
+die() {
+ echo "$SELF:" "$@" 1>&2
+ exit 1
+}
+
+read_info_file() {
+ case "$1" in
+ "") dir=. ;;
+ "*.info") file="$1" ;;
+ *) dir="$1" ;;
+ esac
+
+ if [ "$dir" != "" ]; then
+ file="$dir"/*.info
+ fi
+
+ if [ ! -f $file ]; then
+ die "Can't find .info file matching $file"
+ fi
+
+ source $file
+
+ # snarfed straight from template.SlackBuild:
+ if [ -z "$ARCH" ]; then
+ case "$( uname -m )" in
+ i?86) ARCH=i486 ;;
+ arm*) ARCH=arm ;;
+ *) ARCH=$( uname -m ) ;;
+ esac
+ fi
+
+ # TODO: handle DOWNLOAD_x86_64 and MD5SUM_x86_64
+ # if [ "$ARCH" = "x86_64" ]; then
+ # fi
+}
+
+do_wget() {
+ url="$1"
+ shift
+ echo wget $wgetopts $@ $url
+ wget $wgetopts $@ $url
+}
+
+# ponce's server returns 200 OK status for its 404 page, hence the ugly:
+ponce_download() {
+ do_wget "http://ponce.cc/slackware/sources/repo/$dlfile" 2>&1 | tee tmp.$$
+ ret=$?
+ grep -q '^Length.*text/html' tmp.$$ && ret=1
+ rm -f tmp.$$
+ return $ret
+}
+
+# the user agent is set because sf does something different if it thinks
+# you're using a browser, and some of us like to set the user agent to
+# firefox in .wgetrc because it fixes downloading from most other sites
+# that check it.
+sfdirect_download() {
+ do_wget "http://downloads.sourceforge.net/project/slackbuildsdirectlinks/$PRGNAM/$dlfile" --user-agent wget
+}
+
+gentoo_download() {
+ do_wget "http://ftp.osuosl.org/pub/gentoo/distfiles/$dlfile"
+}
+
+freebsd_download() {
+ do_wget "http://distcache.FreeBSD.org/ports-distfiles/$dlfile"
+}
+
+netbsd_download() {
+ do_wget "http://ftp.netbsd.org/pub/pkgsrc/distfiles/$dlfile"
+}
+
+# debian's tricky because they rename the files: all lowercase, an
+# underscore between name and version, and .orig added before the
+# filename extension. Also they're fanned out into subdirs, see
+# http://http.debian.net/debian/pool/main/
+debian_download() {
+ case "$dlfile" in
+ *.tar.*) ext="$( echo $dlfile | sed 's,.*\.\(tar\..*\)$,\1,' )" ;;
+ *) ext="$( echo $dlfile | sed 's,.*\.\([^.]*\)$,\1,' )" ;;
+ esac
+
+ prog="$( echo $dlfile | tr A-Z a-z | sed 's,_,-,g' | sed "s,\.$ext\$,," )"
+ ver="$( echo $prog | rev | cut -d- -f1 | rev )"
+ prog="$( echo $prog | rev | cut -d- -f2- | rev )"
+
+ case "$prog" in
+ lib*) subdir="$( echo $prog | head -c4 )" ;;
+ *) subdir="$( echo $prog | head -c1 )" ;;
+ esac
+
+ #echo "prog='$prog' ver='$ver' ext='$ext' subdir='$subdir'"
+ debfile=${prog}_$ver.orig.$ext
+ do_wget "http://http.debian.net/debian/pool/main/$subdir/$prog/$debfile"
+ ret=$?
+ mv "$debfile" "$dlfile" 2>/dev/null
+ return $ret
+}
+
+naptime_download() {
+ do_wget "http://urchlay.naptime.net/~urchlay/src/$dlfile"
+}
+
+tld_download() {
+ dir="$( echo $dlmd5 | cut -b1 )/$( echo $dlmd5 | cut -b2 )/$dlmd5"
+ do_wget "http://df.tld-linux.org/distfiles/by-md5/$dir/" -r -l1 -nH -np -nd -Rdesc -Rindex.html\*
+}
+
+# https://archive.org/help/wayback_api.php
+# json_pp included in slackware's perl package
+wayback_download() {
+ url=$(
+ wget -O- "http://archive.org/wayback/available?url=$srcurl" | \
+ json_pp -f json -t dumper | \
+ perl -e 'undef $/; $_=<>; eval $_; print $VAR1->{archived_snapshots}->{closest}->{url};'
+ )
+
+ if [ "$url" = "" ]; then
+ return 1
+ fi
+
+ do_wget "$url"
+}
+
+check_file() {
+ if [ ! -f "$dlfile" ]; then
+ echo "Nothing downloaded"
+ return 1
+ fi
+
+ gotmd5="$( md5sum $dlfile | cut -d' ' -f1 )"
+
+ if [ "$gotmd5" != "$dlmd5" ]; then
+ echo "md5sum doesn't match, should be $dlmd5, got $gotmd5"
+ rm -f "$dlfile"
+ return 1
+ fi
+
+ return 0
+}
+
+# main()
+if [ "$1" = "--help" ]; then
+ usage 0
+fi
+
+if [ "$1" = "-t" ]; then
+ wgetopts="--spider --tries 1" # might want -S here too
+ testmode=1
+ shift
+else
+ wgetopts="--content-disposition"
+fi
+
+if [ "$#" -gt 1 ]; then
+ usage 1
+fi
+
+read_info_file "$1"
+
+for srcurl in $DOWNLOAD; do
+ dlfile="$( basename "$srcurl" )"
+ set $MD5SUM
+ dlmd5=$1
+ shift
+
+ for repo in $repos; do
+ echo
+ echo "Trying $repo:"
+
+ eval ${repo}_download
+
+ got="$?"
+
+ if [ "$testmode" = "1" ]; then
+ [ "$got" = "0" ] && found=1
+ else
+ check_file && break
+ fi
+ done
+done
+
+if [ "$found" = "1" ]; then
+ echo
+ echo "=== Found $dlfile"
+ exit 0
+fi
+
+echo "--- FAILED to find $dlfile"
+exit 1