ansible-role-postfix/templates/disclaimer.sh.j2

271 lines
9.5 KiB
Text
Raw Permalink Normal View History

2022-10-11 09:19:06 +02:00
#!/bin/bash
2023-11-02 16:27:34 +01:00
set -euo pipefail
2022-10-11 09:19:06 +02:00
# Clean up when done or when aborting.
trap "rm -f in.$$" 0 1 2 3 15
INSPECT_DIR=/var/spool/filter
SENDMAIL=/usr/sbin/sendmail
LOGFILE=/var/log/disclaimer.log
OUTSTATFOLDER=/var/spool/filter/out.stats
mkdir -p $OUTSTATFOLDER
INSTATFOLDER=/var/spool/filter/in.stats
mkdir -p $INSTATFOLDER
DISCLAIMER_ADDRESSES=/etc/postfix/disclaimer_addressess
TEXT_DISCLAIMER=/etc/postfix/text_disclaimer.txt
HTML_DISCLAIMER_FILE=/etc/postfix/html_disclaimer.htm
# Exit codes from <sysexits.h>
EX_TEMPFAIL=75
EX_UNAVAILABLE=69
DATE=$(date +%s)
APP=$(basename $0 .sh)
function Message() {
HIDE=$2
CDATE=$(date +%s)
MSG="[$$] $CDATE $1"
if [[ "$HIDE" != "true" ]]; then
echo "$MSG"
fi
/usr/bin/env logger -t "$APP" "$MSG"
echo "$MSG" >> $LOGFILE
#logger -t disclaimer.sh "$MSG"
}
#GetRecordID $FROM mail_addresses mail_address mail
function GetRecordID() {
TEXT="$1"
if [[ "$TEXT" == "" ]]; then
echo NULL
else
TABLE="$2"
FIELD="$3"
DATABASE="$4"
if [[ "$DATABASE" == "" ]]; then
Message "No database indicated." true
else
ACTION="$5"
QUERY="SELECT id FROM $TABLE WHERE $FIELD='$TEXT';"
RESULT=$(echo "$QUERY" | /usr/bin/env mysql --defaults-file=/var/spool/filter/.my.cnf $DATABASE)
RESULTID=$(echo "$RESULT" | grep -v id)
error_code=$?
if [[ "$error_code" != "0" ]]; then
Message "Error getting $FIELD id for $TEXT from database with query '$QUERY'. Result: $RESULT" true
else
if [[ "$RESULTID" == "" ]]; then
QUERY="INSERT INTO $TABLE (id, $FIELD) VALUES (NULL, '$TEXT');"
RESULT=$(echo "$QUERY" | /usr/bin/env mysql --defaults-file=/var/spool/filter/.my.cnf $DATABASE)
error_code=$?
if [[ "$error_code" != "0" ]]; then
Message "Error $error_code adding $FIELD to database with query '$QUERY'. Result: $RESULT" true
else
QUERY="SELECT id FROM $TABLE WHERE $FIELD='$FROM';"
RESULT=$(echo "$QUERY" | /usr/bin/env mysql --defaults-file=/var/spool/filter/.my.cnf $DATABASE)
RESULTID=$(echo "$RESULT" | grep -v id)
error_code=$?
if [[ "$error_code" != "0" ]]; then
Message "Error $error_code obtaining $FIELD id with query '$QUERY'. Result: $RESULT" true
fi
fi
fi
fi
echo $RESULTID
fi
fi
}
function FromID() {
FROM=$1
SENDER_ID=$(GetRecordID $FROM senders sender mailview "Getting Id for From $1")
echo $SENDER_ID
}
function RecipientID() {
RECIPIENT=$1
RECIPIENT_ID=$(GetRecordID $FROM recipients recipient mailview "Getting Id for To $1")
echo $RECIPIENT_ID
}
# Start processing.
Message "Processing message 'in.$$'"
cd $INSPECT_DIR
error_code=$?
if [[ "$error_code" != "0" ]]; then
Message "Error $error_code changing to directory '$INSPECT_DIR'"
exit $EX_TEMPFAIL;
fi
cat >in.$$
error_code=$?
if [[ "$error_code" != "0" ]]; then
Message "Cannot save mail to file"
exit $EX_TEMPFAIL
fi
#Save last message
cp in.$$ /var/spool/filter/last_message.eml -rfp
#Save copy of the messages. DANGEROUS!! Will consumpt disk space
mkdir -p /var/spool/filter/)date +%Y%m%d)/
cp in.$$ /var/spool/filter/)date +%Y%m%d)/)date +%Y%m%d%H%M%S%N).eml -rfp
# obtain header
FROMLONG=$(grep -m 1 "From:" in.$$ | sed "s/From://" -)
FROM=$(echo $FROMLONG | cut -d "<" -f 2 | cut -d ">" -f 1 | sed "s/'/\'/g" - )
SENDER_ID=$(FromID $FROM)
Message "From: $FROMLONG (Id: $SENDER_ID)"
MESSAGEID=$(grep -m 1 -i "^Message-id:" in.$$ | cut -d "<" -f 2 | cut -d ">" -f 1 | sed "s/'/\'/g" - )
Message "Message ID: $MESSAGEID"
SUBJECT=$(grep -m 1 "Subject:" in.$$ | sed "s/Subject://" - | sed "s/'/\'/g" - )
Message "Subject: $SUBJECT"
RECIPIENT=$(grep -m 1 "^To:" in.$$ | cut -d "<" -f 2 | cut -d ">" -f 1 | sed "s/'/\'/g" - )
RECIPIENT_ID=$(RecipientID $RECIPIENT)
Message "TO: $RECIPIENT"
CCRECIPIENT=$(grep -m 1 "Cc:" in.$$ | cut -d "<" -f 2 | cut -d ">" -f 1 | sed "s/'/\'/g" - )
Message "CC: $CCRECIPIENT"
BCRECIPIENT=$(grep -m 1 "Bcc:" in.$$ | cut -d "<" -f 2 | cut -d ">" -f 1 | sed "s/'/\'/g" - )
Message "CCO: $BCRECIPIENT"
DELIVEREDTO=$(grep -m 1 "Delivered-To:" in.$$ | cut -d "<" -f 2 | cut -d ">" -f 1 | sed "s/'/\'/g" - )
Message "Delivered to: $DELIVEREDTO"
RETURNPATH=$(grep -m 1 "Return-Path:" in.$$ | cut -d "<" -f 2 | cut -d ">" -f 1 | sed "s/'/\'/g" - )
Message "Return path: $RETURNPATH"
REPLYTO=$(grep -m 1 "Reply-To:" in.$$ | cut -d "<" -f 2 | cut -d ">" -f 1 | sed "s/'/\'/g" - )
Message "Reply to: $REPLYTO"
XORIGINALSENDER=$(grep -m 1 "X-Original-Sender:" in.$$ | cut -d "<" -f 2 | cut -d ">" -f 1 | sed "s/'/\'/g" - )
Message "Reply to: $XORIGINALSENDER"
SENDER=$(grep -m 1 "Sender:" in.$$ | cut -d "<" -f 2 | cut -d ">" -f 1 | sed "s/'/\'/g" - )
Message "Reply to: $SENDER"
XFORWARDEDTO=$(grep -m 1 "X-Forwarded-To:" in.$$ | cut -d "<" -f 2 | cut -d ">" -f 1 | sed "s/'/\'/g" - )
Message "Reply to: $XFORWARDEDTO"
XFORWARDEDFOR=$(grep -m 1 "X-Forwarded-For:" in.$$ | cut -d "<" -f 2 | cut -d ">" -f 1 | sed "s/'/\'/g" - )
Message "Reply to: $XFORWARDEDFOR"
XBEENTHERE=$(grep -m 1 "X-BeenThere:" in.$$ | cut -d "<" -f 2 | cut -d ">" -f 1 | sed "s/'/\'/g" - )
Message "Reply to: $XBEENTHERE"
if [[ $(grep -wi ^${FROM}$ ${DISCLAIMER_ADDRESSES}) ]]; then
DIRECTION=0
CURHOUR=$(date +%Y%m%d%H)
if [[ -e $INSTATFOLDER/$CURHOUR.stats ]]; then
CURHOURSTAT=$(cat $INSTATFOLDER/$CURHOUR.stats)
else
CURHOURSTAT=0
fi
CURHOURSTAT=$(expr $CURHOURSTAT + 1)
echo $CURHOURSTAT > $INSTATFOLDER/$CURHOUR.stats
Message "Sender '$FROMLONG' ($FROM) is in disclaimer addresses file"
QUERY="INSERT INTO messages (id, sender_id, subject, date, messageid) VALUES (NULL, '$SENDER_ID', '$SUBJECT', '$DATE', '$MESSAGEID');"
echo "$QUERY" | /usr/bin/env mysql --defaults-file=/var/spool/filter/.my.cnf mailview
error_code=$?
if [[ "$error_code" != "0" ]]; then
Message "Error $error_code while adding message to database with query '$QUERY'"
fi
QUERY="SELECT id FROM messages WHERE sender_id='$SENDER_ID' AND subject='$SUBJECT' AND date='$DATE';"
MSG_ID=$(echo "$QUERY" | /usr/bin/env mysql --defaults-file=/var/spool/filter/.my.cnf mailview | grep -v id)
error_code=$?
if [[ "$error_code" != "0" ]]; then
Message "Error $error_code while obtaining message id with query '$QUERY'"
fi
TMP_HTML_DISCLAIMER_FILE=$(/bin/mktemp /tmp/disclaimer.XXXXX)
if [[ -r /etc/postfix/$FROM.disclaimer.html ]]; then
HTML_DISCLAIMER=/etc/postfix/$FROM.disclaimer.html
fi
sed "s/id=MSGID/id=$DB_MSG_ID/g" $HTML_DISCLAIMER_FILE > $TMP_HTML_DISCLAIMER_FILE
TMP_HTML_DISCLAIMER_FILE_BIS=$(/bin/mktemp /tmp/disclaimer.XXXXX)
sed "s/SENDERID/$SENDER_ID/g" $TMP_HTML_DISCLAIMER_FILE > $TMP_HTML_DISCLAIMER_FILE_BIS
sed "s/RECIPIENTID/$RECIPIENT_ID/g" $TMP_HTML_DISCLAIMER_FILE_BIS > $TMP_HTML_DISCLAIMER_FILE
Message "Disclaimer HTML at '$TMP_HTML_DISCLAIMER_FILE'"
if [[ -r /etc/postfix/$FROM.disclaimer.txt ]]; then
TEXT_DISCLAIMER=/etc/postfix/$FROM.disclaimer.txt
fi
ALTERMIMERESULT=$(/usr/bin/altermime --input=in.$$
--log-syslog
--log-stdout
--disclaimer=$TEXT_DISCLAIMER
--disclaimer-html=$TMP_HTML_DISCLAIMER_FILE
--xheader="X-MTA: mudito.susurrando.com")
Message "altermime result: $ALTERMIMERESULT"
error_code=$?
if [[ "$error_code" != "0" ]]; then
Message "Error $error_code Message content rejected."
exit $EX_UNAVAILABLE;
fi
else
DIRECTION=1
Message "Sender '$FROMLONG' ($FROM) is NOT in disclaimer addresses file"
CURHOUR=$(date +%Y%m%d%H)
if [[ -e $OUTSTATFOLDER/$CURHOUR.stats ]]; then
CURHOURSTAT=$(cat $OUTSTATFOLDER/$CURHOUR.stats)
else
CURHOURSTAT=0
fi
CURHOURSTAT=$(expr $CURHOURSTAT + 1)
echo $CURHOURSTAT > $OUTSTATFOLDER/$CURHOUR.stats
fi
#Stats
FROMID=$(GetRecordID $FROM mail_addresses mail_address mail "Get ID of From $FROM")
Message "From $FROM with ID $FROMID"
if [[ "$RECIPIENT" != "" ]]; then
TOID=$(GetRecordID $RECIPIENT mail_addresses mail_address mail "Get ID of To $TO")
else
TOID="0"
fi
Message "To $RECIPIENT with ID $TOID"
if [[ "$CCRECIPIENT" != "" ]]; then
CCID=$(GetRecordID $CCRECIPIENT mail_addresses mail_address mail "Get ID of CC")
else
CCID="0"
fi
if [[ "$BCRECIPIENT" != "" ]]; then
CCOID=$(GetRecordID $BCRECIPIENT mail_addresses mail_address mail "Get ID of BCC")
else
CCOID="0"
fi
if [[ "$DELIVEREDTO" != "" ]]; then
DTID=$(GetRecordID $DELIVEREDTO mail_addresses mail_address mail "Get ID of DeliveredTo")
else
DTID="0"
fi
if [[ "$RETURNPATH" != "" ]]; then
RPID=$(GetRecordID $RETURNPATH mail_addresses mail_address mail)
else
RPID="0"
fi
if [[ "$XORIGINALSENDER" != "" ]]; then
XOSID=$(GetRecordID $XORIGINALSENDER mail_addresses mail_address mail)
else
XOSID="0"
fi
if [[ "$SENDER" != "" ]]; then
SID=$(GetRecordID $SENDER mail_addresses mail_address mail)
else
SID="0"
fi
if [[ "$XFORWARDEDTO" != "" ]]; then
XFTID=$(GetRecordID $XFORWARDEDTO mail_addresses mail_address mail)
else
XFTID="0"
fi
if [[ "$XFORWARDEDFOR" != "" ]]; then
XFFID=$(GetRecordID $XFORWARDEDFOR mail_addresses mail_address mail)
else
XFFID="0"
fi
QUERY="INSERT INTO stats (msgid, from_id, to_id,cc_id, cco_id, subject, direction, delivered_to_id, return_path_id, s_original_sender_id, sender_id, x_forwarded_to, x_forwarded_for) VALUES ('$MESSAGEID',$FROMID, $TOID, $CCID, $CCOID, '$SUBJECT', $DIRECTION, $DTID, $RPID, $XOSID, $SID, $XFTID, $XFFID);"
RESULT=$(echo "$QUERY" | /usr/bin/env mysql --defaults-file=/var/spool/filter/.my.cnf mail)
error_code=$?
if [[ "$error_code" != "0" ]]; then
Message "Error $error_code saving stats with query '$QUERY'. Result: $RESULT"
fi
Message "Arguments: $*"
$SENDMAIL "$@" <in.$$
error_code=$?
if [[ "$error_code" != "0" ]]; then
Message "Error $error_code sending file to sendmail"
exit $error_code
fi
exit 0