minor fix
[distro-setup] / mailtest-check
index b2e02c3112e06a32c7fd0864b2f30e621190155c..9f37cb94ab6513352295c0e5debdcf8a24bba540 100755 (executable)
@@ -1,17 +1,40 @@
 #!/bin/bash
 #!/bin/bash
+# I, Ian Kelling, follow the GNU license recommendations at
+# https://www.gnu.org/licenses/license-recommendations.en.html. They
+# recommend that small programs, < 300 lines, be licensed under the
+# Apache License 2.0. This file contains or is part of one or more small
+# programs. If a small program grows beyond 300 lines, I plan to switch
+# its license to GPL.
 
 
-# Usage: mail-test-check [slow] [anything]
+# Copyright 2024 Ian Kelling
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+
+#     http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+# Usage: mailtest-check [slow] [int|nonint]
 #
 # slow: do slow checks, like spamassassin
 #
 #
 # slow: do slow checks, like spamassassin
 #
-# anything: consider non-interactive, dont print unless something went
+# for  non-interactive, dont print unless something went
 # wrong
 
 # wrong
 
+#set -x
 
 
-source /b/errhandle/err
 
 [[ $EUID == 0 ]] || exec sudo -E "${BASH_SOURCE[0]}" "$@"
 
 
 [[ $EUID == 0 ]] || exec sudo -E "${BASH_SOURCE[0]}" "$@"
 
+source /b/bash-bear-trap/bash-bear
+
 shopt -s nullglob
 
 e() { $int || return 0; printf "mailtest-check: %s\n" "$*"; }
 shopt -s nullglob
 
 e() { $int || return 0; printf "mailtest-check: %s\n" "$*"; }
@@ -19,8 +42,8 @@ e() { $int || return 0; printf "mailtest-check: %s\n" "$*"; }
 getspamdpid() {
   if [[ ! $spamdpid || ! -d /proc/$spamdpid ]]; then
     # try twice in case we are restarting, it happens.
 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]$//' ||:)
+    for (( i=0; i<2; i++ )); do
+      spamdpid=$(systemctl show --property MainPID --value $spamd_ser | sed 's/^[10]$//' ||:)
       if [[ $spamdpid ]]; then
         break
       fi
       if [[ $spamdpid ]]; then
         break
       fi
@@ -62,6 +85,13 @@ fi
 # TODO, get je to deliver the local mailbox: /m/md/INBOX
 # dovecot appears to setup, i can t be sure.
 
 # TODO, get je to deliver the local mailbox: /m/md/INBOX
 # dovecot appears to setup, i can t be sure.
 
+maini=0
+
+spamd_ser=spamd
+if systemctl cat spamassassin &>/dev/null; then
+  spamd_ser=spamassassin
+fi
+
 source /a/bin/bash_unpublished/source-state
 
 doprom=false
 source /a/bin/bash_unpublished/source-state
 
 doprom=false
@@ -88,7 +118,11 @@ main() {
       ;;
     *)
       folders=(/m/md/l/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)
+      # save some cpu cycles
+      froms=(testignore@je.b8.nz ian@iankelling.org)
+      if (( maini % 10 == 0 )); then
+        froms=(testignore@je.b8.nz testignore@expertpathologyreview.com testignore@amnimal.ninja ian@iankelling.org z@zroe.org)
+      fi
       if ! $int; then
         ### begin rsyncing fencepost email ###
         # We dont want to exit if rsync fails, that will get caught by
       if ! $int; then
         ### begin rsyncing fencepost email ###
         # We dont want to exit if rsync fails, that will get caught by
@@ -137,15 +171,15 @@ EOF
   fi
   e spamdpid: $spamdpid
   if [[ ! $spamdpid ]]; then
   fi
   e spamdpid: $spamdpid
   if [[ ! $spamdpid ]]; then
-    echo mailtest spamd pid not found. systemctl status spamassassin:
-    systemctl status spamassassin
+    echo mailtest spamd pid not found. systemctl status $spamd_ser:
+    systemctl status $spamd_ser
   fi
   tmpfile=$(mktemp)
   declare -i unexpected=0
   for folder in ${folders[@]}; do
     for from in ${froms[@]}; do
       declare -i missing_dnswl=0
   fi
   tmpfile=$(mktemp)
   declare -i unexpected=0
   for folder in ${folders[@]}; do
     for from in ${froms[@]}; do
       declare -i missing_dnswl=0
-      declare -i dnsfail=0
+      #declare -i dnsfail=0
       declare -i unexpected=0
       latest=
       last_sec=0
       declare -i unexpected=0
       latest=
       last_sec=0
@@ -182,13 +216,17 @@ EOF
           # 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
           resultfile=$(mktemp)
           # 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
           resultfile=$(mktemp)
-          $spamcpre sudo -u Debian-exim spamassassin -D -t --cf='score PYZOR_CHECK 0' <"$latest" &>$resultfile
+          # add -D for debug info. usually it
+          $spamcpre sudo -u Debian-exim spamassassin -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
 
           # 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
+              # This came in t12, but its just dkim + spf, and my
+              # systems aren't all t12, so ignore it for now.
+              DMARC_PASS) : ;;
               # got this in an update 2022-01. dun care
               T_SCC_BODY_TEXT_LINE|SCC_BODY_SINGLE_WORD) : ;;
               # we have a new domain, ignore this.
               # got this in an update 2022-01. dun care
               T_SCC_BODY_TEXT_LINE|SCC_BODY_SINGLE_WORD) : ;;
               # we have a new domain, ignore this.
@@ -262,7 +300,8 @@ EOF
           rm -f $resultfile
           for r in ${results[@]}; do
             case $r in
           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
               #   ;;
               # DKIM_INVALID|T_SPF_TEMPERROR|T_SPF_HELO_TEMPERROR)
               #   dnsfail+=1
               #   ;;
@@ -306,7 +345,7 @@ EOF
   if $doprom && [[ -e $dir  ]]; then
     for l in "${p_unexpected_spamd_results[@]}"; do
       printf "%s\n" "$l" >>$path
   if $doprom && [[ -e $dir  ]]; then
     for l in "${p_unexpected_spamd_results[@]}"; do
       printf "%s\n" "$l" >>$path
-      done
+    done
     for l in "${p_missing_dnswl[@]}"; do
       printf "%s\n" "$l" >>$path
     done
     for l in "${p_missing_dnswl[@]}"; do
       printf "%s\n" "$l" >>$path
     done
@@ -325,12 +364,13 @@ loop-main() {
   while true; do
     premain_sec=$EPOCHSECONDS
     main
   while true; do
     premain_sec=$EPOCHSECONDS
     main
+    maini=$((maini + 1))
     sleep $(( 300 - ( EPOCHSECONDS - premain_sec ) ))
   done
 }
 
 
     sleep $(( 300 - ( EPOCHSECONDS - premain_sec ) ))
   done
 }
 
 
-if [[ $INVOCATION_ID ]]; then
+if [[ $PPID == 1 ]]; then
   loop-main
 else
   main
   loop-main
 else
   main