record-tempfail () { record-outcome "$1" tempfail "$2"; }
record-permfail () { record-outcome "$1" permfail "$2"; }
+choose () {
+ local all=$1
+ shuf -n1 -o $all.chosen $all
+}
+
probe-addr () {
local mx=$1
local addr=$2
case $rc in
0)
# have a list of MX's
- exec 3<$td/dns
+ choose $td/dns
+
local pref
local mx
local statustype
local rhs
+
+ exec 3<$td/dns.chosen
while read <&3 pref mx statustype statustypenum rhs; do
case $statustypenum in
0)
rhs=${rhs##* (}
rhs=${rhs% )}
local addr
+ exec 5>$td/dns-addrs
for addr in $rhs; do
case $addr in
INET|INET6) continue ;;
esac
+ echo >&5 $addr
+ done
+ choose $td/dns-addrs
+ exec 5<$td/dns-addrs.chosen
+ while read addr <&5; do
probe-addr $mx $addr
done
;;
case $rc in
0)
# have a list of A's (dealt with MXs above)
- exec 3<$td/dns
+ choose $td/dns
+ exec 3<$td/dns.chosen
local addr
while read <&3 addr; do
probe-addr 'NONE' $addr