X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=mailtest-check;h=2287d708cdc44e0ccd572b0ff008ff38efe224a5;hb=e168eaa6f27cc556b7edfb9148f80905d26e21f6;hp=cce5908fb78267d53c06a8bb224df0248b40daca;hpb=b28eebdf9143aa17733f233b30b96f462008f3b6;p=distro-setup diff --git a/mailtest-check b/mailtest-check index cce5908..2287d70 100755 --- a/mailtest-check +++ b/mailtest-check @@ -1,14 +1,14 @@ #!/bin/bash -# Usage: mail-test-check [slow] [anything] +# Usage: mail-test-check [slow] [int|nonint] # # slow: do slow checks, like spamassassin # -# anything: consider non-interactive, dont print unless something went +# for non-interactive, dont print unless something went # wrong -source /b/errhandle/err +source /b/bash-bear-trap/bash-bear [[ $EUID == 0 ]] || exec sudo -E "${BASH_SOURCE[0]}" "$@" @@ -28,11 +28,6 @@ getspamdpid() { done fi } -pr() { - if $doprom && [[ -e /var/lib/prometheus/node-exporter ]]; then - cat >>/var/lib/prometheus/node-exporter/mailtest-check.prom.$$ - fi -} #### begin arg processing #### @@ -81,6 +76,7 @@ esac main() { + local -a p_unexpected_spamd_results p_missing_dnswl p_last_usec case $HOSTNAME in bk) folders=(/m/md/{expertpathologyreview.com,amnimal.ninja}/testignore) @@ -92,7 +88,7 @@ main() { ;; *) folders=(/m/md/l/testignore) - froms=(testignore@je.b8.nz testignore@expertpathologyreview.com testignore@amnimal.ninja ian@iankelling.org z@zroe.org iank@gnu.org) + froms=(testignore@je.b8.nz testignore@expertpathologyreview.com testignore@amnimal.ninja ian@iankelling.org z@zroe.org) if ! $int; then ### begin rsyncing fencepost email ### # We dont want to exit if rsync fails, that will get caught by @@ -104,6 +100,7 @@ main() { try_left=$(( try_limit - ( EPOCHSECONDS - try_start_time) )) timeout=120 # somewhat arbitrary value if (( try_left < 0 )); then + echo "mailtest-check: failed to rsync fencepost > $try_limit seconds" break fi if (( try_left < timeout )); then @@ -145,10 +142,11 @@ EOF fi tmpfile=$(mktemp) declare -i unexpected=0 - declare -i missing_dnswl=0 - declare -i dnsfail=0 for folder in ${folders[@]}; do for from in ${froms[@]}; do + declare -i missing_dnswl=0 + #declare -i dnsfail=0 + declare -i unexpected=0 latest= last_sec=0 @@ -197,6 +195,10 @@ EOF # it seems like some versions of spamassassin do BODY_SINGLE_WORD, others dont, we dun care. # bayes_00 is a new one indicating ham, we dont care if its missing. BAYES_00|BODY_SINGLE_WORD|FROM_FMBLA_NEWDOM*|autolearn) : ;; + + # These have somewhat randomly been added and removed, resulting in useless alerts, so ignore them. + RCVD_IN_DNSWL_MED|DKIMWL_WL_HIGH) : ;; + SPF_HELO_NEUTRAL) # some of my domains use neutral spf, treat them the same. results[SPF_HELO_PASS]=t @@ -213,12 +215,7 @@ EOF keys=(DKIM_SIGNED DKIM_VALID{,_AU,_EF} SPF_HELO_PASS SPF_PASS TVD_SPACE_RATIO) if [[ $to == *@gnu.org && $from == *@gnu.org ]]; then keys=(ALL_TRUSTED TVD_SPACE_RATIO) - elif [[ $to == *@gnu.org ]]; then - # eggs has RCVD_IN_DNSWL_MED - keys+=(RCVD_IN_DNSWL_MED) - elif [[ $from == *@gnu.org ]]; then - # eggs has these - keys+=(RCVD_IN_DNSWL_MED DKIMWL_WL_HIGH) + # from eggs had DKIMWL_WL_HIGH sometime in 2022, then DKIMWL_WL_MED unti march 2023 fi for t in ${keys[@]}; do @@ -260,13 +257,13 @@ EOF # 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 for r in ${results[@]}; do case $r in - # iank: for when we want to handle dns errors differently + # iank: for when we want to handle dns errors differently. + # also uncomment declaration of dnsfail above. # DKIM_INVALID|T_SPF_TEMPERROR|T_SPF_HELO_TEMPERROR) # dnsfail+=1 # ;; @@ -276,19 +273,21 @@ EOF esac done for miss in ${missing[@]}; do - # We expect dns failures from time to time, so - # we count them separately and alert differently. + # At some point we had annoying dns failures that we couldn't solve so we + # we counted dns fail related results separately and alert differently. + # DKIM_VALID|DKIM_VALID_AU|DKIM_VALID_EF|SPF_HELO_PASS|SPF_PASS| case $miss in - # iank: dns fail - # DKIM_VALID|DKIM_VALID_AU|DKIM_VALID_EF|SPF_HELO_PASS|SPF_PASS| - RCVD_IN_DNSWL_MED|DKIMWL_WL_HIGH) - missing_dnswl+=1 - ;; *) unexpected+=1 ;; esac done + mapfile -O ${#p_missing_dnswl[@]} -t p_missing_dnswl <>$path + done + for l in "${p_missing_dnswl[@]}"; do + printf "%s\n" "$l" >>$path + done + for l in "${p_last_usec[@]}"; do + printf "%s\n" "$l" >>$path + done + mv $path $dir/mailtest-check.prom # note: node_textfile_mtime_seconds will tell us when this last happened. useful for debugging. fi }