diff misc/fetchblack.in @ 0:c7f6b056b673

First import of vendor version
author Peter Gervai <grin@grin.hu>
date Tue, 10 Mar 2009 13:49:58 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/fetchblack.in	Tue Mar 10 13:49:58 2009 +0100
@@ -0,0 +1,211 @@
+#! /bin/sh
+
+# fetch a blacklist dcc.dcc-servers.net DCC servers
+
+# This script should be run about twice an hour at an arbitrary time
+#	instead of 0,30 to minimize pile-ups on the FTP server.
+
+# -h homedir	set DCC home directory
+
+# -o blklist	file of local blacklist entries
+
+# -p pgm	fetch, wget, curl, or ftp
+
+# -s srvr-host	host name of source of the common blacklist
+
+# Rhyolite Software DCC 1.3.103-1.50 $Revision$
+# @configure_input@
+
+
+# other, probably local blacklist files
+OTHER_BLS=
+
+exec </dev/null
+
+HTTP_REFERER=DCC-1.3.103-script; export HTTP_REFERER
+
+DCC_HOMEDIR=@prefix@
+SRVR_BL=dcc-servers-blacklist
+SRVRS=
+PGM=@FETCH_CMD@
+FORCE=
+MIRROR=
+
+USAGE="`basename $0`: [-xf] [-h homedir] [-o blklist] [-p pgm] [-s srvr-host]"
+while getopts "xfh:o:p:s:m:" c; do
+    case $c in
+	x) set -x;;
+	f) FORCE=yes;;
+	h) DCC_HOMEDIR="$OPTARG";;
+	o) OTHER_BLS="$OTHER_BLS $OPTARG";;
+	p) PGM=$OPTARG;;
+	s) SRVRS="$SRVRS $OPTARG";;
+	m) MIRROR=$OPTARG;;
+	*) echo "$USAGE" 1>&2; exit 1;;
+    esac
+done
+shift `expr $OPTIND - 1 || true`
+if test "$#" -ne 0; then
+    echo "$USAGE" 1>&2; exit 1
+fi
+if test -z "$SRVRS"; then
+    SRVRS="http://www.dcc-servers.net/dcc http://www.rhyolite.com/dcc ftp://ftp.dcc-servers.net ftp://ftp.rhyolite.com"
+fi
+URLS=
+for SRVR in $SRVRS; do
+    if expr "$SRVR" : '.[hft]*tp://' >/dev/null; then
+	if expr "$SRVR" : ".*/$SRVR_BL"'$' >/dev/null; then
+	    URLS="$URLS $SRVR"
+	else
+	    URLS="$URLS $SRVR/$SRVR_BL"
+	fi
+    else
+	URLS="$URLS ftp://$SRVR/$SRVR_BL"
+    fi
+done
+
+# dccd expects this target
+TGT_BL=$DCC_HOMEDIR/blacklist
+NEW_BL=new-blacklist
+MARKER=fetch-failed
+BDIR=$DCC_HOMEDIR/$SRVR_BL
+FLOG=$BDIR/fetch-log
+
+if test ! -d $BDIR; then
+    mkdir $BDIR
+fi
+cd $BDIR
+
+# use fetch, wget, curl, or ftp that understands URLs
+if test ! -s $SRVR_BL; then
+    echo "# initial place keeper" >$SRVR_BL
+fi
+mv $SRVR_BL $SRVR_BL.old
+rm -f $FLOG
+BASE_PGM=`basename "$PGM"`
+if test "$BASE_PGM" = wget; then
+    BASE_PGM=
+    for URL in $URLS; do
+	echo "$URL:" >>$FLOG
+	# Do not use --mirror because -r results in a 0 exit status
+	#   even on failure.
+	# Do not use --no-remove-listing, -nr, or --dont-remove-listing
+	#   because none of them are supported by all versions of wget.
+	# At least some versions of wget exit with 0 after having done
+	#   nothing but emitting a usage message.
+	if $PGM -nd --retr-symlinks -N --no-host-directories		\
+		--passive-ftp @FETCH_WGET_OPTS@ $URL >>$FLOG 2>&1; then
+	    if test -s $SRVR_BL; then
+		if test -z "`sed -n -e 2q				\
+			    -e 's/.*DOCTYPE.*/HTML/p'			\
+			    -e 's/<HEAD>/HTML/p' -e 's/<head>/HTML/p'	\
+		    $SRVR_BL`"; then
+		    break;
+		fi
+		# do not leave a broken file
+		rm $SRVR_BL
+	    fi
+	fi
+	echo >>$FLOG
+    done
+fi
+
+if test "$BASE_PGM" = fetch; then
+    BASE_PGM=
+    for URL in $URLS; do
+	echo "$URL:" >>$FLOG
+	$PGM -p -m $URL >>$FLOG 2>&1
+	if test -s $SRVR_BL; then
+	    break;
+	fi
+	echo >>$FLOG
+    done
+fi
+
+if test "$BASE_PGM" = curl; then
+    BASE_PGM=
+    for URL in $URLS; do
+	echo "$URL:" >>$FLOG
+	$PGM @FETCH_CURL_OPTS@ --connect-timeout 30 --max-time 600\
+	    $URL -o $SRVR_BL >>$FLOG 2>&1
+	# --fail does not work on at least some versions of curl
+	if test -s $SRVR_BL; then
+		if test -z "`sed -n -e 2q				\
+			    -e 's/.*DOCTYPE.*/HTML/p'			\
+			    -e 's/<HEAD>/HTML/p' -e 's/<head>/HTML/p'	\
+			$SRVR_BL`"; then
+		break;
+	    fi
+	    # do not leave a broken file
+	    rm $SRVR_BL
+	fi
+	echo >>$FLOG
+    done
+fi
+
+if test "$BASE_PGM" = ftp; then
+    BASE_PGM=
+    for URL in $URLS; do
+	echo "$URL:" >>$FLOG
+	$PGM -p $URL >>$FLOG 2>&1
+	if test -s $SRVR_BL; then
+	    break;
+	fi
+	echo >>$FLOG
+    done
+    # if that did not work, try ancient FTP
+    if test ! -s $SRVR_BL; then
+	for URL in $URLS; do
+	    HOST=`expr "$URL" : "ftp://\([^/]*\)/"`
+	    RFILE=`expr "$URL" : "ftp://[^/]*/\(.*\)"`
+	    if test -z "$RFILE" -o -z "$HOST"; then
+		continue
+	    fi
+	    echo "$URL:" >>$FLOG
+	    (echo "user anonymous `hostname`"; echo "get $RFILE $SRVR_BL")    \
+		| ftp -n $HOST >>$FLOG 2>&1
+	    if test -s $SRVR_BL; then
+		break;
+	    fi
+	    # some versions of ftp like to leave empty files
+	    rm -f $SRVR_BL
+	    echo >>$FLOG
+	done
+    fi
+fi
+
+if test -s $SRVR_BL; then
+    rm -f $MARKER $SRVR_BL.old
+    if test -n "$MIRROR"; then
+	cp $SRVR_BL $MIRROR
+    fi
+else
+    # complain only when the list is more than a day old, and then only
+    #	once per day
+    OLD_MARKER="`find $MARKER -follow -mtime -1 2>/dev/null`"
+    if test -z "$OLD_MARKER"; then
+	echo "Unable to fetch blacklist; see $FLOG" > $MARKER
+	date >>$MARKER
+    fi
+    # continue so that we include new versions of local blacklists
+    mv $SRVR_BL.old $SRVR_BL
+fi
+
+# add the local lists last so that they can override
+rm -f $NEW_BL
+cat  $SRVR_BL >$NEW_BL
+for NM in $OTHER_BLS; do
+    if test -s "$NM"; then
+	echo >>$NEW_BL
+	echo >>$NEW_BL
+	echo >>$NEW_BL
+	echo "# local file $NM" >>$NEW_BL
+	cat $NM >>$NEW_BL
+    fi
+done
+if test -z "$FORCE" && cmp $NEW_BL ../blacklist 1>/dev/null 2>&1; then :
+else
+    # copy it in case the target is a symbolic link
+    cp $NEW_BL $TGT_BL
+fi
+rm $NEW_BL