#!SCRIPTSHELLCMD_MARKER PROGNAME=`basename $0` ################################################################################ # # CONFIGURABLE THINGS # ################################################################################ TMP_DIR=/var/tmp DEST_DIR=/home/db/alexis/docs/html/mino-hp MAILSERVER_ADMIN=alexis SPOOL_DIR=/home/db/alexis/var/spool/mailserver FACILITY=news VERBOSE_LEVEL=5 ################################################################################ # # END OF CONFIGURABLE THINGS # ################################################################################ spool_message() { info "message spooler started ..." debug 5 "spool_message: checking directory access ..." for DIR in $TMP_DIR $SPOOL_DIR; do [ ! -d $DIR -o ! -w $DIR ] && { error -ne "$DIR is not accessible, abandonning message spooling" return } done delonexit $TMP_DIR/$PROGNAME.$$.mbx cat > $TMP_DIR/$PROGNAME.$$.mbx debug 5 "spool_message: extracting sender ..." FROM=`sed -n "s/^From:.*<\(.*\)>.*/\1/p" $TMP_DIR/$PROGNAME.$$.mbx` [ "X$FROM" != X ] || { warning "no return address found" } debug 5 "spool_message: extracting timestamp ..." DATE=`sed -n "s/^Date:\(.*\)/\1/p" $TMP_DIR/$PROGNAME.$$.mbx | head -1` TIMESTAMP=`echo "$DATE" | sed 's/[^0-9]//g'` [ "X$TIMESTAMP" != X ] || { warning "no date found, using default" TIMESTAMP=`date | sed 's/[^0-9]//g'` } MSGID=$TIMESTAMP.$$ info "this message has been assigned id $MSGID" debug 5 "spool_message: locking message $MSGID ..." lock message-$MSGID gen_lock_file_name || { error -ne "spool failed, message left in $TMP_DIR/$PROGNAME.$$.mbx" dontdelonexit $TMP_DIR/$PROGNAME.$$.mbx return } debug 5 "spool_message: spooling message $MSGID ..." mv $TMP_DIR/$PROGNAME.$$.mbx $SPOOL_DIR/message-$MSGID || { error -ne "spool failed, message left in $TMP_DIR/$PROGNAME.$$.mbx" dontdelonexit $TMP_DIR/$PROGNAME.$$.mbx unlock message-$MSGID gen_lock_file_name return } rm -f $TMP_DIR/$PROGNAME.$$.mbx dontdelonexit $TMP_DIR/$PROGNAME.$$.mbx unlock message-$MSGID gen_lock_file_name info "new message successfully spooled" } process_queue() { info "queue processor started ..." debug 5 "process_queue: checking directory access ..." for DIR in $TMP_DIR $SPOOL_DIR $SPOOL_DIR/bad $DEST_DIR; do [ ! -d $DIR -o ! -w $DIR ] && { error -ne "$DIR is not accessible, abandonning queue processing" unlock daemon gen_lock_file_name return } done debug 5 "process_queue: locking processor daemon ..." lock daemon gen_lock_file_name || { warning "another daemon is running" return } JOBCOUNT=0 while :; do debug 5 "process_queue: scanning for messages ..." MSGIDS=`ls $SPOOL_DIR | sed -n 's/^message-\([0-9][0-9]*\.[0-9][0-9]*\)$/\1/p' | sort` [ "X$MSGIDS" = X ] && break debug 5 "process_queue: processing messages ..." for MSGID in $MSGIDS; do process_message $MSGID && JOBCOUNT=`expr $JOBCOUNT + 1` done done if [ $JOBCOUNT -gt 0 ]; then info "uploading to web server ..." delonexit $TMP_DIR/$PROGNAME.$$.upl if $DEST_DIR/upload > $TMP_DIR/$PROGNAME.$$.upl; then info -f $TMP_DIR/$PROGNAME.$$.upl else error -ne -f $TMP_DIR/$PROGNAME.$$.upl error -ne "UPLOAD FAILED!" fi rm $TMP_DIR/$PROGNAME.$$.upl dontdelonexit $TMP_DIR/$PROGNAME.$$.upl fi unlock daemon gen_lock_file_name info "queue successfully processed" } process_message() { local MSGID=$1 debug 5 "process_message: locking message $MSGID ..." lock message-$MSGID gen_lock_file_name || { warning "message $MSGID locked; will try later" return 1 } info "processing message $MSGID" debug 5 "process_message: creating MIME-unpacking directory ..." delonexit $TMP_DIR/$PROGNAME.$$.pk mkdir -p $TMP_DIR/$PROGNAME.$$.pk || { error -ne "can't create unpacking directory, will try again later" unlock message-$MSGID gen_lock_file_name return 1 } debug 5 "process_message: MIME-unpacking ..." { munpack -C $TMP_DIR/$PROGNAME.$$.pk $SPOOL_DIR/message-$MSGID | egrep -q 'Did not find anything to unpack'; } && { error -ne "unable to unpack, moving to 'bad'" rm -fr $TMP_DIR/$PROGNAME.$$.pk dontdelonexit $TMP_DIR/$PROGNAME.$$.pk mkdir -p $SPOOL_DIR/bad mv $SPOOL_DIR/message-$MSGID $SPOOL_DIR/bad/message-$MSGID unlock message-$MSGID gen_lock_file_name return 1 } debug 5 "process_message: scanning for zips ..." ZIPS=`ls $TMP_DIR/$PROGNAME.$$.pk | egrep '\.zip$' | sort` [ "X$ZIPS" = X ] && { warning "no zips to process, moving to 'bad'" rm -fr $TMP_DIR/$PROGNAME.$$.pk dontdelonexit $TMP_DIR/$PROGNAME.$$.pk mkdir -p $SPOOL_DIR/bad mv $SPOOL_DIR/message-$MSGID $SPOOL_DIR/bad/message-$MSGID unlock message-$MSGID gen_lock_file_name return 1 } debug 5 "process_message: zips found" info "removing old contents of $DEST_DIR ..." find $DEST_DIR ! -path $DEST_DIR ! -path $DEST_DIR/upload -print | xargs rm -fr delonexit $TMP_DIR/$PROGNAME.$$.zipls for ZIP in $ZIPS; do info "unzipping $ZIP ..." unzip -d $DEST_DIR $TMP_DIR/$PROGNAME.$$.pk/$ZIP > $TMP_DIR/$PROGNAME.$$.zipls 2>&1 info -f $TMP_DIR/$PROGNAME.$$.zipls done rm $TMP_DIR/$PROGNAME.$$.zipls dontdelonexit $TMP_DIR/$PROGNAME.$$.zipls rm $SPOOL_DIR/message-$MSGID unlock message-$MSGID gen_lock_file_name rm -fr $TMP_DIR/$PROGNAME.$$.pk dontdelonexit $TMP_DIR/$PROGNAME.$$.pk info "message successfully processed" return 0 } main() { MODE=both while [ "X$1" != X ]; do case "$1" in -d) VERBOSE_LEVEL=$2 shift ;; -v) VERBOSE_LEVEL=3 ;; -s) MODE=spoolonly ;; -p) MODE=processonly ;; -*) usage ;; *) break ;; esac shift done trap genericsighandler 1 2 15 LOG_FILE=$TMP_DIR/$PROGNAME.$$.log delonexit $LOG_FILE [ $MODE = both -o $MODE = spoolonly ] && spool_message [ $MODE = both -o $MODE = processonly ] && process_queue mailx -s "Mino Mail Server Log" $MAILSERVER_ADMIN $FROM < $LOG_FILE rm -f $LOG_FILE dontdelonexit $LOG_FILE exitdel } gen_lock_file_name() { typeset LOCK_WHAT LOCK_WHAT=$1 echo $SPOOL_DIR/$LOCK_WHAT.lock } #shpp include utils.sh.shpp