#!/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] [int|nonint]
+# 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
#
# for non-interactive, dont print unless something went
# wrong
+#set -x
-source /b/bash-bear-trap/bash-bear
[[ $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" "$*"; }
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
# 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
;;
*)
folders=(/m/md/l/testignore)
- froms=(testignore@je.b8.nz testignore@expertpathologyreview.com testignore@amnimal.ninja ian@iankelling.org z@zroe.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
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
# 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
+ # 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.
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
while true; do
premain_sec=$EPOCHSECONDS
main
+ maini=$((maini + 1))
sleep $(( 300 - ( EPOCHSECONDS - premain_sec ) ))
done
}
-if [[ $INVOCATION_ID ]]; then
+if [[ $PPID == 1 ]]; then
loop-main
else
main