set -e
+. settings
+
id=$(date +%s)_$$
fail () {
record-probing () {
# implicitly uses newsgroup, id, domain
- # prints working dir filename
+ # caller must "local td", which will be set
local probeid=$1
- probeid=${probeid//[^=-.,_0-9A-Za-z]/%/}
+ probeid="$domain,${probeid//[^-=.,_0-9A-Za-z]/%/},$id"
case $probeid in
.*|*/*) fail "yikes, sanitisation bug!" ;;
esac
- local newtd="monitoring/modrelays.probes/$probeid"
- mkdir -p $newtd
- printf "%s" $newtd
+ td="probes/probes/$probeid"
+ mkdir -p $td
}
record-outcome () {
local probeid=$1
local outcome=$2
local message=$3
- local td=`record-probing "$probeid"`
- printf "%s\n" >"$td"/"$outcome"
+ local td
+ record-probing "$probeid"
+ printf "%s\n" >"$td"/"$outcome" "$message"
}
-record-success () { record-outcome "$1" ok '' }
-record-tempfail () { record-outcome "$1" tempfail "$2" }
-record-permfail () { record-outcome "$1" permfail "$2" }
+record-success () { record-outcome "$1" ok ''; }
+record-tempfail () { record-outcome "$1" tempfail "$2"; }
+record-permfail () { record-outcome "$1" permfail "$2"; }
probe-addr () {
local mx=$1
local addr=$2
- local td=`record-probing "mx=$mx,addr=$addr"`
+ local td
+ record-probing "mx=$mx,addr=$addr"
set +e
swaks --to "${GROUP//./-/}@$domain" \
local rhs
local prefix
local expect_no_5xx='initial connection'
- while read <$td/swaks.log prefix rhs; do
+ exec <$td/swaks.log
+ while read prefix rhs; do
case "$prefix" in
'<'*)
case "$rhs" in
5*)
if [ "x$expect_no_5xx" != x ] && \
[ "x$permfail" = x ]; then
- permfail="$rhs ($expect_no_5xx)" ;;
+ permfail="$rhs ($expect_no_5xx)"
fi
;;
esac
esac
;;
*)
+ esac
done
if [ "x$permfail" = x ]; then
probe-domain () {
local domain=$1
- local td=`record-probing dns`
+ local td
+ record-probing dns
set +e
adnshost -Fi -Tn +Do +Dt -t mx $domain >$td/dns
local mx
local statustype
local rhs
- while read pref mx statustype rhs; do
- case $statustype in
+ while read pref mx statustype statustypenum rhs; do
+ case $statustypenum in
0)
# have a list of relays
case $rhs in
record-permfail "mx=$mx" \
"dns format $rhs"
continue
- ;;
- rhs=${rhs%%* (}
- rhs=${rhs# )}
+ ;;
+ esac
+ rhs=${rhs##* (}
+ rhs=${rhs% )}
local addr
for addr in $rhs; do
case $addr in
;;
[123])
# temporary errors
- record-tempfail "mx=$mx" "dns $rc $rhs"
+ record-tempfail "mx=$mx" \
+ "dns $rc $statustype $rhs"
;;
*)
# yikes
- record-permfail "mx=$mx" "dns $rc $rhs"
+ record-permfail "mx=$mx" \
+ "dns $rc $statustype $rhs"
;;
esac
done
return
;;
6)
- permfail, try A
+ # permfail, try A
set +e
- adnshost -Fi -Tn +Do +Dt -t a $domain >$td
+ adnshost -Fi -Tn +Do +Dt -t a $domain >$td/dns
rc=$?
set -e
;;
exec <$td/dns
local addr
while read addr; do
- probe-addr '<no-mx>' $addr
+ probe-addr 'NONE' $addr
done
record-success dns
return
no_args () {
case $1 in
0) return ;;
- *) fail
+ *) fail "no arguments to $mode allowed" ;;
+ esac
+}
mode_all () {
no_args $#
for domain in $MODRELAYS; do
- probe $domain
+ probe-domain $domain
done
}
mode_all
}
-mode_relay () {
- relay="$1"
- probe "$relay"
+mode_domain () {
+ for domain in "$@"; do
+ probe-domain $domain
+ done
}
mode=$1; shift||: