fi
tmpfile=$(mktemp)
declare -i unexpected=0
+ declare -i missing_dnswl=0
for folder in ${folders[@]}; do
for from in ${froms[@]}; do
latest=
fi
# webmail sends them to cur it seems
while read -r file; do
- if [[ $file -nt $latest ]]; then
+ file_sec=$(awk '/^Subject: / {print $4}' $file)
+ if [[ $file_sec ]] && (( file_sec > last_sec )); then
latest=$file
+ last_sec="$file_sec"
fi
done <$tmpfile
to=$(awk '/^Envelope-to: / {print $2}' $latest)
- last_sec=$(awk '/^Subject: / {print $4}' $latest)
if $slow; then
if ! $int; then
if [[ $(readlink /proc/$$/ns/net) != "$(readlink /proc/$spamdpid/ns/net)" ]]; then
spamcpre="nsenter -t $spamdpid -n -m"
fi
-
+ unset results
declare -A results
# pyzor fails for our test message, so dont put useless load on their
# servers.
# example line that sed is parsing:
# (-0.1 / 5.0 requ) DKIM_SIGNED=0.1,DKIM_VALID=-0.1,DKIM_VALID_AU=-0.1,SPF_HELO_PASS=-0.001,SPF_PASS=-0.001,TVD_SPACE_RATIO=0.001 autolearn=_AUTOLEARN
- raw_results="$($spamcpre sudo -u Debian-exim spamassassin -t --cf='score PYZOR_CHECK 0' <"$latest" | tail -n2 | head -n1 | sed -r 's/^\([^)]*\) *//;s/=[^, ]*([, ]|$)/ /g')"
+ resultfile=$(mktemp)
+ $spamcpre sudo -u Debian-exim spamassassin -D -t --cf='score PYZOR_CHECK 0' <"$latest" &>$resultfile
+
+ # note: on some mail, its 1 line after the send-test-forward, on others its 2 with a blank inbetween.
+ # I use the sed -n to filter this.
+ raw_results="$(tail $resultfile | grep -A2 -Fx /usr/local/bin/send-test-forward | tail -n+2 | sed -nr 's/^\([^)]*\) *//;s/=[^, ]*([, ]|$)/ /gp')"
for r in $raw_results; do
case $r in
# got this in an update 2022-01. dun care
fi
done
if (( ${#results[@]} || ${#missing[@]} )); then
- printf "$HOSTNAME spamtest %s/%s\n" "$latest"
+ printf "$HOSTNAME spamtest %s\n" "$latest"
if (( ${#results[@]} )); then
printf "unexpected %s" "${!results[*]} "
fi
printf "missing %s" "${missing[*]}"
fi
echo # ends our printf string buildup
-
+ cat $resultfile
+ echo mailtest-check: end of spam debug results
+ # lets just handle 1 failure at a time in interactive mode.
if $int; then
- echo mailtest-check: cat $latest:
- cat $latest
- echo mailtest-check: end of cat
- echo "$(tput setaf 5 2>/dev/null ||:)█$(tput sgr0 2>/dev/null||:)%.0s" $(eval echo "{1..${COLUMNS:-60}}")
+ echo mailtest-check: from: $from, to: $to
+ exit 0
fi
+
+ # less verbose debug output, commented since I might want it another time.
+ # if $int; then
+ # echo mailtest-check: cat $latest:
+ # cat $latest
+ # echo mailtest-check: end of cat
+ # echo "$(tput setaf 5 2>/dev/null ||:)█$(tput sgr0 2>/dev/null||:)%.0s" $(eval echo "{1..${COLUMNS:-60}}")
+ #fi
fi
+ rm -f $resultfile
+ unexpected=$(( unexpected + ${#results[@]} ))
+ for miss in ${missing[@]}; do
+ # We expect dns reputation services to go down from time to time, so
+ # we count them separately and alert differently.
+ case $miss in
+ RCVD_IN_DNSWL_MED|DKIMWL_WL_HIGH)
+ missing_dnswl+=1
+ ;;
+ *)
+ unexpected+=1
+ ;;
+ esac
+ done
fi # if spamdpid
fi # if $slow
pr <<EOF
mailtest_check_last_usec{folder="$folder",from="$from"} $last_sec
EOF
- done
- unexpected=$(( unexpected + ${#results[@]} + ${#missing[@]} ))
- done
+ done # end for from in ${froms[@]}
+ done # end for folder in ${folders[@]}
if $slow; then
pr <<EOF
+mailtest_check_missing_dnswl $missing_dnswl
mailtest_check_unexpected_spamd_results $unexpected
EOF
fi
}
loop-main() {
+ # When running under systemd, the system just started. Ve nice and
+ # give programs some time to finish their startup.
+ sleep 5
while true; do
premain_sec=$EPOCHSECONDS
main
- sleep $(( 300 - ( $EPOCHSECONDS - premain_sec ) ))
+ sleep $(( 300 - ( EPOCHSECONDS - premain_sec ) ))
done
}