chiark / gitweb /
choose only one at random master
authorWebSTUMP <webstump@chiark.greenend.org.uk>
Mon, 8 Apr 2024 09:42:43 +0000 (10:42 +0100)
committerWebSTUMP <webstump@chiark.greenend.org.uk>
Mon, 8 Apr 2024 09:42:43 +0000 (10:42 +0100)
probes/modrelays-probe

index 28db476376635eefd5afa5148687a1efb812addd..7c6884c0e6deb099688ee66a1eb99c00e6085fed 100755 (executable)
@@ -67,6 +67,11 @@ record-success () { record-outcome "$1" ok ''; }
 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
@@ -136,11 +141,14 @@ probe-domain () {
        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)
@@ -156,10 +164,16 @@ probe-domain () {
                                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
                                ;;
@@ -190,7 +204,8 @@ probe-domain () {
        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