From 4c4a001cacd9c3e1c2552dbcaf50165091a82ac1 Mon Sep 17 00:00:00 2001 From: Roland Reichwein Date: Sat, 11 Feb 2023 11:24:22 +0100 Subject: Separated out weblog from webserver --- procmail/procmail.sh | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++ procmail/procmailrc | 12 ++++++ 2 files changed, 131 insertions(+) create mode 100755 procmail/procmail.sh create mode 100644 procmail/procmailrc (limited to 'procmail') diff --git a/procmail/procmail.sh b/procmail/procmail.sh new file mode 100755 index 0000000..134d957 --- /dev/null +++ b/procmail/procmail.sh @@ -0,0 +1,119 @@ +#!/bin/bash +# +# Mail Blog input script, to be called by procmail +# +set -e + +function atexit { + if [ "$ERRORMSG" != "" -o -s errormsg.txt ] ; then + (echo "$ERRORMSG" ; cat errormsg.txt) | mutt -s "bloginput: Error" -- "$ADDR" >> ~/log 2>&1 + fi + cd + rm -rf "$DIR" +} +trap atexit EXIT + +function mimedecode() { + perl -ne 'require MIME::Head; $head = MIME::Head->read(\*STDIN); $head->decode(); print $head->get("Subject")' +} + +function next_index() { + DIR=$1 + + LASTENTRY=`ls -1dr $DIR/$(date +%Y)/$(date +%Y%m%d)* 2>/dev/null | xargs -n 1 basename | head -n1` + + if [ "$LASTENTRY" == "" ] ; then + echo 001 + return + fi + + INDEX=${LASTENTRY:9:3} + + INDEX=$(($INDEX + 1)) + + while [ "$((${#INDEX} < 3))" == "1" ] ; do INDEX=0$INDEX ; done + + echo $INDEX +} + +echo "Log at `date`:" >> ~/log 2>&1 + +BLOGDIR=/var/www/rolandreichwein.de-blog +#BLOGDIR=/var/www/blog + +# Default: Error +ERRORMSG="General error." +USERLOG="" + +DIR=`mktemp -d` + +cd "$DIR" + +touch body.txt +touch errormsg.txt + +cat > inmail + +ADDR=`grep "^From: " inmail | sed -e 's/^From: //'` +if echo "$ADDR" | grep -q -v "^[a-zA-Z0-9@._-<>\" ]\+$" ; then + # can't send error message to unknown requester + ERRORMSG="" + exit 1 +fi +if echo "$ADDR" | grep -q "weblog-bloginput" ; then + # don't reply to mails from weblog-bloginput, i.e. prevent mail loops + ERRORMSG="" + exit 1 +fi + +ALLLINES=`wc -l inmail | cut -f1 -d" "` + +HEADERLINES=`cat inmail | (n=0; while read i ; do + if [ "$i" == "" ] ; then + echo $n + break + fi + n=$(($n + 1)) +done)` + +HEADER=`head -n$HEADERLINES inmail` +BODY=`tail -n$(($ALLLINES - $HEADERLINES - 1)) inmail` + +echo "$HEADER" > /home/weblog-bloginput/header.txt +echo "$BODY" > /home/weblog-bloginput/body.txt + +SUBJECT=`echo "$HEADER" | mimedecode` +SUBJECT_PATH=`echo "$SUBJECT" | sed -e 's/[^a-zA-Z0-9]/_/g'` +ARTICLEINDEX=`next_index $BLOGDIR` + +ARTICLEDIR="$BLOGDIR/`date +%Y/%Y%m%d`_${ARTICLEINDEX}_$SUBJECT_PATH" + +mkdir -p $ARTICLEDIR +echo "Subject: $SUBJECT" >> $ARTICLEDIR/article.data +echo "" >> $ARTICLEDIR/article.data + +# get attachments +munpack -C $ARTICLEDIR `pwd`/inmail >/dev/null || true + +DATANAME="`ls $ARTICLEDIR/*.desc || true`" 2>/dev/null +if [ "$DATANAME" = "" ] ; then + echo "$BODY" >> $ARTICLEDIR/article.data +else + cat "$DATANAME" >> $ARTICLEDIR/article.data + rm "$DATANAME" +fi + +chmod -R a+r $ARTICLEDIR +chmod a+x $ARTICLEDIR + +( +echo "Processed successfully." +echo "ARTICLEDIR=$ARTICLEDIR" +) | mutt -s "Bloginput: $SUBJECT_PATH" -- "$ADDR" >> ~/log 2>&1 + +echo "User log:" >> ~/log +cat body.txt >> ~/log + +ERRORMSG="" +echo "Done successfully at `date`." >> ~/log 2>&1 + diff --git a/procmail/procmailrc b/procmail/procmailrc new file mode 100644 index 0000000..fa1fe6f --- /dev/null +++ b/procmail/procmailrc @@ -0,0 +1,12 @@ +:0: +* ^X-Virus-Infected +Virus +# TODO: can be /dev/null later + +:0: +* ^X-Spam-Flag: YES +Spam +# TODO: can be /dev/null later + +:0 fhbw +| /home/weblog-bloginput/procmail.sh -- cgit v1.2.3