#!/bin/sh # 20150827 bkw: attempt to find missing source tarballs SELF=$( basename $0 ) # to add a repo, list its name here, and write a _download() # function, which should return success if a file was downloaded # and failure otherwise. # these are used in the order listed. the order is basically random # right now, possibly could rank them according to something or another. repos="macports fedora wayback naptime tld ponce sfdirect gentoo netbsd freebsd debian" usage() { cat <&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 if [ "$ARCH" = "x86_64" ]; then case "$DOWNLOAD_x86_64" in ""|UNSUPPORTED|UNTESTED) ;; *) DOWNLOAD="$DOWNLOAD_x86_64" MD5SUM="$MD5SUM_x86_64" ;; esac 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 } # my own archive. Not well populated yet. 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" } # lot of stuff here. URLs of the form: # http://pkgs.fedoraproject.org/repo/pkgs/zziplib/zziplib-0.13.62.tar.bz2/5fe874946390f939ee8f4abe9624b96c/zziplib-0.13.62.tar.bz2 fedora_download() { pkgname="$( echo $dlfile | rev | cut -d- -f2- | rev )" do_wget "http://pkgs.fedoraproject.org/repo/pkgs/$pkgname/$dlfile/$dlmd5/$dlfile" } # URL form: # http://distfiles.macports.org/arj/arj-3.10.22.tar.gz macports_download() { pkgname="$( echo $dlfile | rev | cut -d- -f2- | rev )" do_wget "http://distfiles.macports.org/$pkgname/$dlfile" } 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 fi if [ "$#" -gt 1 ]; then usage 1 fi echo "-=- $1" read_info_file "$1" set $MD5SUM for srcurl in $DOWNLOAD; do dlfile="$( basename "$srcurl" )" 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