hi since I had a few nice comments about the above script, I post a second revised version.
this script takes as its argument the file README.mirrors (that can be downloaded from the debian ftp sites), extracts the list of hosts and pings them all (it takes roughly 60 seconds, since it parallelizes) then sorts the output by fastest transmit time a.Mennucci --------------------------------- script follows ------------------------ #!/bin/sh # sort_mirrors_by_speed v 0.2 # by A.Mennucci Nov 97 # # this program is subject to the # GNU general public license # # this program will scan the file in $1 using # grep "\.[a-zA-Z]*:" $1 | awk '{print $1}' # to find mirror site host names. # # the string before the : character is considered to be a # mirror site host name # # Mirror sites are pinged and statistics are collected and sorted # # TODO # with an option like --archie , this would be great # to sort the output of archie # # ############# max number of coesisting pings u=`ulimit -u` MAX_PINGS=`/usr/bin/expr $u - 6 ` if [ $MAX_PINGS -le 0 ] ; then MAX_PINGS=1 fi #I do not know how to get the max resident memory # that would help in computing this if [ $MAX_PINGS -gt 30 ] ; then MAX_PINGS=30 fi ########## ditto PING_PACKETS=20 ##########note that ping adds 8 bytes to a packet PACKET_SIZE=1016 ############## umask 066 if [ "$1" = "-h" -o "$1" = "--help" ] ; then echo Usage: $0 mirrorfile echo " Argument must be the file README.mirrors " echo " containing a list of debian mirrors." echo " This program will ping all mirrors with $PING_PACKETS packets" echo " to test their speed and reliability, and then will try to " echo " compute the speed of the connection. It will" echo " sort the result, put it in file mirrors_by_speed and show the best." exit 0 fi if [ x$TMPDIR = x ] ; then tmpdir=/tmp else tmpdir=$TMPDIR fi # warning: using the directory /tmp and running this script # as root may be a potential security problem: I do not guarantee security if ! [ -w $tmpdir ] ; then echo $0 ERROR dir $tmpdir is not writable echo please create it if it does not exist exit 1 fi tmpdir=$tmpdir/sort_m_$$_`dd if=/dev/random count=1 bs=16 2> /dev/null |\ sed -n l | /usr/bin/tr --delete --complement "[:alnum:]" ` if ! mkdir $tmpdir ; then echo $0: cannot make dir $tmpdir exit 1 fi ## this doesnt work as I expected, alas #trap "/bin/rm -r $tmpdir ; exit" SIGTERM #trap "/bin/rm -r $tmpdir ; exit" SIGQUIT #trap "/bin/rm -r $tmpdir ; exit" SIGINT #trap -p if [ ! -r "$1" -o "$1" = "" ] ; then echo $0 ERROR Give as argument the file README.mirrors echo " containing a list of debian mirrors" exit 1 fi if [ -r mirrors_by_speed ] ; then echo $0 ERROR the file mirrors_by_speed already exists exit 1 fi ################ here we go n=0 echo -n "Testing " grep "\.[a-zA-Z]*:" $1 | awk '{print $1}' | \ wc --lines | tr "\n" " " echo " debian mirror sites for speed and reliability." echo Parallelizing: up to $MAX_PINGS pings at a time. echo -n "Tests done : " for i in ` grep "\.[a-zA-Z]*:" $1 | awk '{print $1}' ` ; do n=`expr $n + 1 ` touch $tmpdir/__$n ( h=$n #echo -n "i$h " # note that ping adds 8 bytes to a packet if ping -s $PACKET_SIZE -p A7C3 -c $PING_PACKETS `echo "$i" |\ cut -d: -f1 ` >> $tmpdir/__$h 2>> /dev/null ; then #if [ ! -r $tmpdir/__$h ] ; then exit ; fi ms=`grep "round-trip" $tmpdir/__$h |\ cut -d/ -f 4 | cut -d. -f1 ` #if [ ! -r $tmpdir/__$h ] ; then exit ; fi r=`grep "received" $tmpdir/__$h |\ cut -d"," -f 3 | cut -d% -f1 ` #if [ ! -r $tmpdir/__$h ] ; then exit ; fi b=`expr \( $PACKET_SIZE + 8 \) \* \( 100 - $r \) \* 10 / $ms ` #if [ ! -r $tmpdir/__$h ] ; then exit ; fi echo "$b b/s, $ms ms/p, $r% loss, SITE $i" >> mirrors_by_speed #echo "$b bytes/sec, $ms ms, $r% loss, SITE $i" else echo "0 PING ERROR FOR SITE $i " >> mirrors_by_speed fi #if [ -r $tmpdir/__$h ] ; then rm $tmpdir/__$h ; fi rm $tmpdir/__$h echo -n "$h " ) & # we do not want to flood the net; we test $MAX_PINGS sites at a time # this is taken from an idea by Gertjan Klein <[EMAIL PROTECTED]> while [ `/bin/ls -1f $tmpdir | /usr/bin/wc --lines` \ -ge `/usr/bin/expr $MAX_PINGS + 2 ` ] do /usr/bin/sleep 2 done if ! [ -w $tmpdir ] ; then echo ABORTED exit fi done wait echo "." echo "Fastest mirrors are (b/s=Bytes/sec, ms/p=millisec/packet): " mv mirrors_by_speed mirrors_by_speed~ sort -nr mirrors_by_speed~ > mirrors_by_speed head mirrors_by_speed rm -r $tmpdir mirrors_by_speed~ -- TO UNSUBSCRIBE FROM THIS MAILING LIST: e-mail the word "unsubscribe" to [EMAIL PROTECTED] . Trouble? e-mail to [EMAIL PROTECTED] .