diff options
Diffstat (limited to 'contrib/directory-archive/fetch-all-functions')
-rw-r--r-- | contrib/directory-archive/fetch-all-functions | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/contrib/directory-archive/fetch-all-functions b/contrib/directory-archive/fetch-all-functions new file mode 100644 index 0000000000..6d5a0e469d --- /dev/null +++ b/contrib/directory-archive/fetch-all-functions @@ -0,0 +1,72 @@ +#!/bin/bash + +# function used by fetch-all* to download server descriptors and +# extra info documents + +# Copyright (c) 2005, 2006, 2007, 2008 Peter Palfrader +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + + +fetch_digest() { + local digest + local objecttype + local urlpart + local pathpart + local target + local targetdir + local dirserver + local ei + + digest="$1" + objecttype="$2" + if [ "$objecttype" = "server-descriptor" ] ; then + urlpart="server" + pathpart="server-descriptor" + elif [ "$objecttype" = "extra-info" ] ; then + urlpart="extra" + pathpart="extra-info" + else + echo "Called fetch_digest with illegal objecttype '$objecttype'" >&2 + exit 1 + fi + target=$( echo $digest | sed -e 's#^\(.\)\(.\)#'"$pathpart"'/\1/\2/\1\2#' ) + targetdir=$( dirname $target ) + [ -d "$targetdir" ] || mkdir -p "$targetdir" + if ! [ -e "$target" ]; then + for dirserver in $DIRSERVERS; do + wget -q -O "$target" http://$dirserver/tor/$urlpart/d/"$digest" || rm -f "$target" + if [ -s "$target" ]; then + if egrep '^opt extra-info-digest ' "$target" > /dev/null; then + ei=$( egrep '^opt extra-info-digest ' "$target" | awk '{print $3}' | tr 'A-F' 'a-f' ) + fetch_digest "$ei" "extra-info" + elif egrep '^extra-info-digest ' "$target" > /dev/null; then + ei=$( egrep '^extra-info-digest ' "$target" | awk '{print $2}' | tr 'A-F' 'a-f' ) + fetch_digest "$ei" "extra-info" + fi + break + else + rm -f "$target" + fi + done + fi + #if ! [ -e "$target" ]; then + # echo "$objecttype $digest" >> failed + #fi +} |