X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=mailtest-check;h=91e577cbe23d4abf5c92ba1993c95d77d5eebbec;hb=6cc73025405b7a540eec371d1d8f7d9d13d8e019;hp=3fdefffb1050afca706edf6622ee5e061dc33185;hpb=d4366929e6e200155b010dc05ce74255ee6a45ed;p=distro-setup diff --git a/mailtest-check b/mailtest-check index 3fdefff..91e577c 100755 --- a/mailtest-check +++ b/mailtest-check @@ -16,16 +16,27 @@ shopt -s nullglob e() { $int || return 0; printf "mailtest-check: %s\n" "$*"; } - -## Minutes before we give error. -# We run this cronjob along with sending the test email every 5 minutes, -# so give it 1 minute to arrive, then if the latest email is older than -# 7 minutes, the last 2 haven't arrived in a reasonable amount of time. -min_limit=7 +getspamdpid() { + if [[ ! $spamdpid || ! -d /proc/$spamdpid ]]; then + # try twice in case we are restarting, it happens. + for i in 1 2; do + spamdpid=$(systemctl show --property MainPID --value spamassassin | sed 's/^[10]$//' ||:) + if [[ $spamdpid ]]; then + break + fi + sleep 30 + done + fi +} +pr() { + if $doprom && [[ -e /var/lib/prometheus/node-exporter ]]; then + cat >>/var/lib/prometheus/node-exporter/mailtest-check.prom.$$ + fi +} -# spamassassin checking takes about 8 seconds. only do that every -# once in a while. +#### begin arg processing #### +# spamassassin checking takes about 8 seconds. slow=false if [[ $1 == slow ]]; then slow=true @@ -44,65 +55,87 @@ fi if [[ $1 == nonint ]]; then int=false fi +#### end arg processing #### if ! $int; then sleep 60 fi -# avoid errors like this: -# Nov 8 08:16:05.439 [6080] warn: plugin: failed to parse plugin (from @INC): Can't locate Mail/SpamAssassin/Plugin/WLBLEval.pm: lib/Mail/SpamAssassin/Plugin/WLBLEval.pm: Permission denied at (eval 59) line 1. -#Nov 8 08:16:05.439 [6080] warn: plugin: failed to parse plugin (from @INC): Can't locate Mail/SpamAssassin/Plugin/VBounce.pm: lib/Mail/SpamAssassin/Plugin/VBounce.pm: Permission denied at (eval 60) line 1. -# i dont know why, i just found the solution online -cd /m/md +# TODO, get je to deliver the local mailbox: /m/md/INBOX +# dovecot appears to setup, i can t be sure. + +source /a/bin/bash_unpublished/source-state + +doprom=false case $HOSTNAME in - bk) - folders=(/m/md/{expertpathologyreview.com,amnimal.ninja}/testignore) - froms=(ian@iankelling.org z@zroe.org testignore@je.b8.nz iank@gnu.org) - ;; - je) - froms=(ian@iankelling.org z@zroe.org testignore@expertpathologyreview.com testignore@amnimal.ninja) - folders=(/m/md/je.b8.nz/testignore) + $MAIL_HOST|bk|je) + doprom=true ;; *) - 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) - if ! $int; then - timeout 120 rsync --chown iank:iank -e "ssh -oIdentitiesOnly=yes -F /dev/null -i /root/.ssh/jtuttle" -t --inplace -r 'jtuttle@fencepost.gnu.org:/home/j/jtuttle/Maildir/new/' /m/md/l/testignore/new - fi + rm -f /var/lib/prometheus/node-exporter/mailtest-check.prom* ;; esac -getspamdpid() { - if [[ ! $spamdpid || ! -d /proc/$spamdpid ]]; then - spamdpid=$(systemctl status spamassassin| sed -n '/^ *Main PID:/s/[^0-9]//gp' ||:) +main() { + + case $HOSTNAME in + bk) + folders=(/m/md/{expertpathologyreview.com,amnimal.ninja}/testignore) + froms=(ian@iankelling.org z@zroe.org testignore@je.b8.nz iank@gnu.org) + ;; + je) + froms=(ian@iankelling.org z@zroe.org iank@gnu.org testignore@amnimal.ninja) + folders=(/m/md/je.b8.nz/testignore) + ;; + *) + 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) + if ! $int; then + timeout 120 rsync --chown iank:iank -e "ssh -oIdentitiesOnly=yes -F /dev/null -i /root/.ssh/jtuttle" -t --inplace -r 'jtuttle@fencepost.gnu.org:/home/j/jtuttle/Maildir/new/' /m/md/l/testignore/new + fi + ;; + esac + + + # avoid errors like this: + # Nov 8 08:16:05.439 [6080] warn: plugin: failed to parse plugin (from @INC): Can't locate Mail/SpamAssassin/Plugin/WLBLEval.pm: lib/Mail/SpamAssassin/Plugin/WLBLEval.pm: Permission denied at (eval 59) line 1. + #Nov 8 08:16:05.439 [6080] warn: plugin: failed to parse plugin (from @INC): Can't locate Mail/SpamAssassin/Plugin/VBounce.pm: lib/Mail/SpamAssassin/Plugin/VBounce.pm: Permission denied at (eval 60) line 1. + # i dont know why, i just found the solution online + cd /m/md + + + getspamdpid + # first time we write, overwrite anything existing + if [[ -e /var/lib/prometheus/node-exporter ]]; then + cat >/var/lib/prometheus/node-exporter/mailtest-check.prom.$$ < 0 )) +EOF fi -} -getspamdpid -e spamdpid: $spamdpid -if [[ ! $spamdpid ]]; then - echo $HOSTNAME mailtest spamd pid not found. systemctl status spamassassin: - systemctl status spamassassin -fi -tmpfile=$(mktemp) -for folder in ${folders[@]}; do - for from in ${froms[@]}; do - latest= - last_sec=0 - - if ! grep -rlFx "From: $from" $folder/{new,cur} >$tmpfile; then - e "no message found from: $from" - continue - fi - # webmail sends them to cur it seems - while read -r file; do - if [[ $file -nt $latest ]]; then - latest=$file + e spamdpid: $spamdpid + if [[ ! $spamdpid ]]; then + echo mailtest spamd pid not found. systemctl status spamassassin: + systemctl status spamassassin + fi + tmpfile=$(mktemp) + declare -i unexpected=0 + for folder in ${folders[@]}; do + for from in ${froms[@]}; do + latest= + last_sec=0 + + if ! grep -rlFx "From: $from" $folder/{new,cur} >$tmpfile; then + echo "no message found from: $from" + continue fi - done <$tmpfile + # webmail sends them to cur it seems + while read -r file; do + if [[ $file -nt $latest ]]; then + latest=$file + fi + done <$tmpfile - if [[ $latest ]]; then to=$(awk '/^Envelope-to: / {print $2}' $latest) last_sec=$(awk '/^Subject: / {print $4}' $latest) @@ -121,7 +154,8 @@ for folder in ${folders[@]}; do # 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 - for r in $($spamcpre sudo -u Debian-exim spamassassin -t --cf='score PYZOR_CHECK 0' <"$latest" | tail -n2 | head -n1 | sed -r 's/^\([^)]*\) *//;s/=[^, ]*([, ]|$)/ /g'); do + raw_results="$($spamcpre sudo -u Debian-exim spamassassin -t --cf='score PYZOR_CHECK 0' <"$latest" | tail -n2 | head -n1 | sed -r 's/^\([^)]*\) *//;s/=[^, ]*([, ]|$)/ /g')" + for r in $raw_results; do case $r in # got this in an update 2022-01. dun care T_SCC_BODY_TEXT_LINE|SCC_BODY_SINGLE_WORD) : ;; @@ -178,23 +212,55 @@ for folder in ${folders[@]}; do if (( ${#missing[@]} )); then printf "missing %s" "${missing[*]}" fi - echo - echo mailtest-check: cat $latest: - cat $latest - echo mailtest-check: end of cat - printf "$(tput setaf 5 2>/dev/null ||:)█$(tput sgr0 2>/dev/null||:)%.0s" $(eval echo "{1..${COLUMNS:-60}}") + echo # ends our printf string buildup + + 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 fi # if spamdpid fi # if $slow - fi # if [[ $latest ]] - now=$(date +%s) - limit=$(( now - 60 * min_limit )) - age_sec=$(( now - last_sec )) - e $((age_sec / 60)):$(( age_sec % 60 )) ago. to:$to from:$from $latest + now=$EPOCHSECONDS + age_sec=$(( now - last_sec )) + e $((age_sec / 60)):$(( age_sec % 60 )) ago. to:$to from:$from $latest + + # usec = unix seconds + pr <