various fixes
[distro-setup] / mailtest-check
index 02cdfcbcad94027f720563e87d6509c48f9c19f6..67cca9ca84c9e347289306646f05c1aedb8601c8 100755 (executable)
@@ -120,6 +120,7 @@ EOF
   fi
   tmpfile=$(mktemp)
   declare -i unexpected=0
+  declare -i missing_dnswl=0
   for folder in ${folders[@]}; do
     for from in ${froms[@]}; do
       latest=
@@ -131,13 +132,14 @@ EOF
       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
@@ -148,16 +150,18 @@ EOF
           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
           resultfile=$(mktemp)
-          $spamcpre sudo -u Debian-exim spamassassin -t --cf='score PYZOR_CHECK 0' <"$latest" &>$resultfile
+          $spamcpre sudo -u Debian-exim spamassassin -D -t --cf='score PYZOR_CHECK 0' <"$latest" &>$resultfile
 
-          raw_results="$(tail $resultfile | grep -A1 -Fx /usr/local/bin/send-test-forward | tail -n1 | sed -r 's/^\([^)]*\) *//;s/=[^, ]*([, ]|$)/ /g')"
+          # 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
@@ -218,6 +222,11 @@ EOF
             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: from: $from, to: $to
+              exit 0
+            fi
 
             # less verbose debug output, commented since I might want it another time.
             # if $int; then
@@ -228,6 +237,19 @@ EOF
             #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
 
@@ -239,11 +261,11 @@ EOF
       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
@@ -256,10 +278,13 @@ EOF
 }
 
 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
 }