set -euo pipefail
case "$#" in
0) ;;
*) echo >&2 'bad usage'; exit 8 ;;
esac
root="$(git rev-parse --show-toplevel)"
out="$root/crates/tor-netdoc/testdata-live"
cd "$out"
files=(consensus authority consensus-microdesc)
declare -A rust_per_relay_data
run-curl () {
local url="$1"
local file="$2"
if test -s "$file"; then return; fi
echo >&2 "fetching $url"
curl -f "http://$url" >"$file.tmp"
mv -f "$file"{.tmp,}
}
rust_per_variety () {
local suffix="$1"
printf "PerVariety {
"
for f in "${files[@]}"; do
printf ' '
case $f in
consensus) printf "plain: " ;;
consensus-microdesc) printf "md: " ;;
authority) printf "vote: " ;;
*) echo >&2 "unhandled for rust_per_variety $f"; exit 16 ;;
esac
printf 'include_str!("%s"),
' "$f$suffix"
done
printf " }"
}
rust_per_relay () {
local suffix=$1
printf ' PerRelay {
nick: "%s",
data: ' "$nick"
rust_per_variety "--$suffix--$nick"
printf "
},"
}
start () {
for f in "${files[@]}"; do
run-curl "$auth/tor/status-vote/current/$f" .entire."$f"
perl -ne 'print or die $! unless m/^r /..0' \
<.entire."$f" >"$f.new"
done
rust_module=\
"//! Automatically generated by testdata-live-download - DO NOT EDIT
use super::*;
/// Network status documents
pub const NETSTATUS: PerVariety =
$(rust_per_variety "");
"
}
include_relay () {
id=$1; nick=$2
for f in "${files[@]}"; do
ent_file="$f--entry--$nick"
perl -ne '
BEGIN { $exp = shift @ARGV; }
$y = ($1 eq $exp) if m/^r (\S+ \S+) /;
print or die $! if $y;
' <.entire."$f" >"$ent_file" "$nick $id"
cat "$ent_file">>"$f.new"
case "$f" in
consensus|authority)
digest=$(perl <"$ent_file" -ne '
use MIME::Base64;
next unless m{^r \S+ \S+ (\S+) };
print uc unpack "H*", decode_base64($1);
')
url="$auth/tor/server/d"
;;
consensus-microdesc)
digest=$(perl <"$ent_file" -ne '
next unless m{^m ([+/0-9a-zA-Z]+)\s};
print $1;
')
url="$auth/tor/micro/d"
;;
*)
echo >&2 'Unknown file type!'
exit 1
;;
esac
desc_file_tmp=.tmp."$f--desc--$nick.${digest//\//_}"
run-curl "$url/$digest" "$desc_file_tmp"
cp "$desc_file_tmp" "$f--desc--$nick"
rust_per_relay_data[ROUTERSTATUSES]+="$(rust_per_relay entry)
"
rust_per_relay_data[DESCRIPTORS]+="$(rust_per_relay desc)
"
done
}
rust_relay_list () {
local var=$1; shift
rust_module+=\
"
$(cat)
pub const RELAY_$var: &[PerRelay] = &[
${rust_per_relay_data[$var]}];
"
}
finish () {
for f in "${files[@]}"; do
perl -ne 'print or die $! if m/^directory-footer\s/..0' \
<.entire."$f" >>"$f.new"
mv "$f"{.new,}
done
rust_relay_list ROUTERSTATUSES <<'END'
/// Relays' routerstatus entries (excerpts from each corresponding network status)
END
rust_relay_list DESCRIPTORS <<'END'
/// Relays' router descriptors and microdescriptors
END
printf "%s" "$rust_module" >generated_consts.rs
echo
echo "Updated $out. Don't forget to git add."
}
auth=tor.cypherpunks.eu
start
include_relay 'AAAErLudKby6FyVrs1ko3b/Iq6k' lisdex
include_relay 'GiXGNY25E0KqUXIKUDi3J0JzJJg' moria1
include_relay 'MDUJq5EO8ge3Q4wnQ1xKL9V58bE' Ukko
include_relay 'UEheA8o505O9VNMVzrpl5t0P3bk' d2d4
include_relay 'VpJ+YbUebzY/tVSYFQpt389wd/I' Akka
finish