blob: 809c5afcafec350b332b30cb2803b4adb08f1f8b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
#!/bin/bash
#
# A script that debugs how different onion-grab configurations perform with
# regards to successful connections, connection errors, found onions, etc. To
# conduct these tests from multiple vantage points, Mullvad VPN is used.
#
###
# Options you will likely want to tune yourself
###
relays=(\
se-sto-wg-001\
us-nyc-wg-501\
au-mel-wg-301\
)
limits=(\
5\
10\
)
num_workers=16
input_file=example.lst
###
# Other options
###
tmp_dir="$(mktemp -d)"
out_dir="data/$(date +%Y%m%d-%H%M%S)"
mullvad_wait_s=5
timeout=30s
set -eu
function main() {
num_sites="$(wc -l $input_file | cut -d' ' -f1)"
debug "relays=${#relays[@]} (${relays[@]})"
debug "limits=${#limits[@]} (${limits[@]})"
debug "numWorkers=$num_workers"
debug "inputFile=$input_file ($num_sites sites)"
debug "tmp_dir=$tmp_dir"
debug "out_dir=$out_dir"
debug "mullvad_wait_s=$mullvad_wait_s"
num_test="$(( ${#limits[@]} * ${#relays[@]} ))"
debug "about to start $num_test tests"
runtime_s=0
for limit in ${limits[@]}; do
for relay in ${relays[@]}; do
seconds=$(( $num_sites / $limit ))
runtime_s=$(( $runtime_s + $seconds ))
done
done
now=$(date +%s)
estimated_done=$(( $now + $runtime_s ))
debug "estimated done? earliest $(date -d @$estimated_done +"%Y-%m-%d %H:%M:%S %Z")"
i=1
for limit in ${limits[@]}; do
for relay in ${relays[@]}; do
mullvad disconnect >/dev/null
mullvad relay set hostname $relay >/dev/null
mullvad connect >/dev/null
sleep $mullvad_wait_s
ip=$(curl -s https://am.i.mullvad.net)
debug "working on test $i/$num_test at relay $relay ($ip) with limit $limit sites/s"
shuf -o $tmp_dir/input.lst $input_file
stdout_file=$tmp_dir/$relay-$limit.stdout
stderr_file=$tmp_dir/$relay-$limit.stderr
onion-grab -i $tmp_dir/input.lst -t $timeout -l $limit -w $num_workers >$stdout_file 2>$stderr_file
i=$(( $i + 1 ))
done
done
mkdir -p $out_dir
for limit in ${limits[@]}; do
dup_file=$tmp_dir/dup.txt
rm -f $dup_file
for relay in ${relays[@]}; do
stdout_file=$tmp_dir/$relay-$limit.stdout
stderr_file=$tmp_dir/$relay-$limit.stderr
cut -d' ' -f1 $stdout_file >> $dup_file
avg_rate=$(grep 'Average rate:' $stderr_file | tail -n1 | xargs | cut -d' ' -f3)
if [[ -z "$avg_rate" ]]; then
avg_rate="n/a"
fi
num_onion=$(wc -l $stdout_file | cut -d' ' -f1)
processed=$(grep Processed $stderr_file | tail -n1 | xargs | cut -d' ' -f2)
success=$(grep Success $stderr_file | tail -n1 | xargs | cut -d' ' -f2)
failure=$(grep Failure $stderr_file | tail -n1 | xargs | cut -d' ' -f2)
failure_dns=$(grep DNS $stderr_file | tail -n1 | xargs | cut -d' ' -f2)
failure_dns_detailed=$(grep DNS $stderr_file | tail -n1 | xargs | cut -d' ' -f3-)
info "relay:$relay limit:$limit/s avg-rate:$avg_rate/s onions:$num_onion connected:$success/$processed dns-error:$failure_dns/$failure $failure_dns_detailed"
output_file="$out_dir/$relay-l$limit.txt"
mv $stdout_file $output_file
done
num_sites=$(sort -Vu $dup_file | wc -l | cut -d' ' -f1)
info "all relays with limit $limit sites/s: $num_sites unique sites with onion locations found"
done
info "stored collected test data in $out_dir"
rm -rf $tmp_dir
}
function debug() {
echo "$(date +"%Y-%m-%d %H:%M:%S %Z") [DEBU] $@" >&2
}
function info() {
echo "$(date +"%Y-%m-%d %H:%M:%S %Z") [INFO] $@" >&2
}
main $@
|