#!/bin/sh

# /usr/local/bin/fax_xxxxxx

# Copyright (c) 2002-2013 Leisenfels. All rights reserved.
# Use is subject to license terms.

# Configuration section. please adjust values.
# Add additional recipients separated by comma.
MAILTO="info@yourdomain.com"
SENDER='root@yourdomain.com (fax service)'
TARGET_MSN="123456"
MAILER="/usr/sbin/sendmail"
ARCHIVE_DIR="/var/spool/fax/incoming"
ARCHIVE_PERMS="600"
ARCHIVE_OWNER="root"
TEMP_FILE="/tmp/`basename $0`.$$"
NOW_DATE=`date`
NOW_FILE=`date +%Y-%m-%d_%H:%M:%S`
NEW_LOG_FILE="${TARGET_MSN}_${NOW_FILE}.txt"
ATTACH_FAX_FILES="yes"
ATTACH_LOG_FILE="yes"
NICE="nice -n -10"
EFAX="/usr/local/bin/efax"
DEV="ttyS0"
INIT="-iZ0 -i&F&D2&C1&K3S7=120 -iM1L1 -i#CID=1"
CLASSINIT="-o0"
LOCK="/var/lock/LCK..$DEV"
FROM="+49 1234 $TARGET_MSN"
SUBJECT="[fax] New fax for $FROM"
RESET="-kZ0"
ANSRINGS=1
ANSFNAME="${TARGET_MSN}_%Y-%m-%d_%H:%M:%S"
CLEANUP="rm -f ${TARGET_MSN}_*-*-*_*:*:*.[0-9][0-9][0-9]"
SUFFIX="tif"
MIMENCODE="/usr/bin/mimencode"
LINK1=""
LINK2=""


# Archive directory does already exist? Create otherwise and set permissions.
if [ ! -d "$ARCHIVE_DIR"  ] ; then
  mkdir -p $ARCHIVE_DIR >/dev/null 2>&1
  chmod $ARCHIVE_PERMS $ARCHIVE_DIR >/dev/null 2>&1
  chown $ARCHIVE_OWNER $ARCHIVE_DIR >/dev/null 2>&1
  if [ ! -d "$ARCHIVE_DIR"  ] ; then
    exit -1
  fi
fi

# Any faxes have been received?
cd $ARCHIVE_DIR >/dev/null 2>&1
CANDIDATES=`ls ${DEV}.[0-9]* 2>/dev/null`
for f in $CANDIDATES
do
  FILES=`sed -n -e  '/received ->/s/^.*-> \(.*\)$/\1/p' $f`
  FILES=`echo $FILES`
  FILE_COUNT=`echo $FILES|wc --words`
  FILE_COUNT=`echo $FILE_COUNT`
  if [ "$FILE_COUNT" -eq "0" ] ; then
    # Script seems to have been interrupted. Delete log file and continue.
    rm -f $f >/dev/null 2>&1
    continue
  fi
  chmod $ARCHIVE_PERMS $f >/dev/null 2>&1
  chown $ARCHIVE_OWNER $f >/dev/null 2>&1
  REMOTE_ID=`sed -n -e '/remote ID ->/s/^.*-> \(.*\)$/\1/p' -e tok -e b -e ':ok' -e q $f`
  if [ -z "$REMOTE_ID" ] ; then
    REMOTE_ID='?'
  else
    # Remove leading SPACEs and quotes
    REMOTE_ID=`echo $REMOTE_ID|sed -e 's/"//g'` >/dev/null 2>&1
    REMOTE_ID=`echo $REMOTE_ID`
  fi

  # Rename the log file (.txt suffix)
  mv $f $NEW_LOG_FILE >/dev/null 2>&1

  # Extract some pieces of information from the log file
  BEGIN_TIME=`grep "activity detected" $NEW_LOG_FILE|awk '{print $2}'` >/dev/null 2>&1
  END_TIME=`grep "done," $NEW_LOG_FILE|awk '{print $2}'` >/dev/null 2>&1
  VERTICAL_RES=`grep "session" $NEW_LOG_FILE|grep -v "session format"|awk '{print $8}'` >/dev/null 2>&1
  BIT_RATE=`grep "session" $NEW_LOG_FILE|grep -v "session format"|awk '{print $9}'` >/dev/null 2>&1
  WIDTH=`grep "session" $NEW_LOG_FILE|grep -v "session format"|awk '{print $10}'` >/dev/null 2>&1
  LENGTH=`grep "session" $NEW_LOG_FILE|grep -v "session format"|awk '{print $11}'` >/dev/null 2>&1
  DATA_FORMAT=`grep "session" $NEW_LOG_FILE|grep -v "session format"|awk '{print $12}'` >/dev/null 2>&1
  ERROR_CORR=`grep "session" $NEW_LOG_FILE|grep -v "session format"|awk '{print $13}'` >/dev/null 2>&1
  BINARY_FILE=`grep "session" $NEW_LOG_FILE|grep -v "session format"|awk '{print $14}'` >/dev/null 2>&1
  MIN_SCAN_TIME=`grep "session" $NEW_LOG_FILE|grep -v "session format"|awk '{print $15}'` >/dev/null 2>&1
  CLIP=`grep "NMBR = " $NEW_LOG_FILE|awk '{print $10}'|sed -e 's/<CR><LF>]//g'` >/dev/null 2>&1

  # Any CLIP info?
  if [ -z "$CLIP" ] ; then
    CLIP='?'
  fi

  # Here, also deleted files may be recognized, ignored below
  FILE_DATA_ALL=`grep "wrote" $NEW_LOG_FILE|awk '{split($0,a," as "); print a[2]}'|sed -e 's/ /_/g'` >/dev/null 2>&1

  # Let's generate the e-mail text
  touch $TEMP_FILE
  echo "From: $SENDER" >>$TEMP_FILE
  for RECIPIENT in $MAILTO
  do
    echo "To: $RECIPIENT" >>$TEMP_FILE
  done
  echo "Subject: $SUBJECT" >>$TEMP_FILE
  echo "Content-Type: multipart/mixed;" >>$TEMP_FILE
  echo " boundary=\"------------060502070807080307040206\"" >>$TEMP_FILE
  echo "" >>$TEMP_FILE
  echo "This is a multi-part message in MIME format." >>$TEMP_FILE
  echo "--------------060502070807080307040206" >>$TEMP_FILE
  echo "Content-Type: text/plain; charset=us-ascii; format=flowed" >>$TEMP_FILE
  echo "Content-Transfer-Encoding: 8bit" >>$TEMP_FILE
  echo "" >>$TEMP_FILE
  echo "" >>$TEMP_FILE
  echo "Dear receiver," >>$TEMP_FILE
  echo "" >>$TEMP_FILE
  echo "a new fax for the station $FROM has been received:" >>$TEMP_FILE
  echo "" >>$TEMP_FILE
  echo "Pages:        $FILE_COUNT" >>$TEMP_FILE
  echo "Ident:        $REMOTE_ID" >>$TEMP_FILE
  echo "CLIP:         $CLIP" >>$TEMP_FILE
  echo "Start:        $BEGIN_TIME" >>$TEMP_FILE
  echo "End:          $END_TIME" >>$TEMP_FILE
  echo "" >>$TEMP_FILE

  # And the names of the fax files including the file info
  COLLECT=""
  TEMP_STRING=""
  INDEX=0
  for FAX_FILE in $FILES
  do
    if [ "$INDEX" -eq "0" ] ; then
      echo "File(s):      $ARCHIVE_DIR/$FAX_FILE.$SUFFIX" >>$TEMP_FILE
    else
      echo "              $ARCHIVE_DIR/$FAX_FILE.$SUFFIX" >>$TEMP_FILE
    fi
    COLLECT="$COLLECT $ARCHIVE_DIR/$FAX_FILE.$SUFFIX"
    INDEX=`expr $INDEX + 1`

    # Extract the appropriate info line
    DATA_INDEX=1
    for LINE in $FILE_DATA_ALL ; do
      if [ "$DATA_INDEX" -eq "$INDEX" ] ; then
        if [ "$INDEX" -eq "1" ] ; then
          TEMP_STRING="$LINE"
        else
          TEMP_STRING="$TEMP_STRING, $LINE"
        fi
      fi
      DATA_INDEX=`expr $DATA_INDEX + 1`
    done
  done
  echo "" >>$TEMP_FILE
  echo "Log (efax):   $ARCHIVE_DIR/$NEW_LOG_FILE" >>$TEMP_FILE
  echo "" >>$TEMP_FILE

  # Include archive links?
  if [ ! -z "$LINK1" ] ; then
    echo "$LINK1" >>$TEMP_FILE
  fi
  if [ ! -z "$LINK2" ] ; then
    echo "$LINK2" >>$TEMP_FILE
  fi

  # Re-transform the '_' into SPACEs after assembling
  FILE_DATA=`echo "$TEMP_STRING"|sed -e 's/_/ /g'` >/dev/null 2>&1

  # Send an e-mail?
  if [ ! -z "$MAILTO" ] ; then

    # Create attachments and archive files
    for FAX_FILE in $FILES
    do
      if [ "$ATTACH_FAX_FILES" = "yes" ] ; then

        echo "--------------060502070807080307040206" >>$TEMP_FILE
        echo "Content-Type: image/tiff;" >>$TEMP_FILE
        echo " name=\"`basename $FAX_FILE`.$SUFFIX\"" >>$TEMP_FILE
        echo "Content-Transfer-Encoding: base64" >>$TEMP_FILE
        echo "Content-Disposition: inline;" >>$TEMP_FILE
        echo " filename=\"`basename $FAX_FILE`.$SUFFIX\"" >>$TEMP_FILE
        echo "" >>$TEMP_FILE

        # Attach the fax pages
        $MIMENCODE $FAX_FILE >>$TEMP_FILE

      fi

      # Adjust file suffix and permissions
      chmod $ARCHIVE_PERMS $FAX_FILE >/dev/null 2>&1
      chown $ARCHIVE_OWNER $FAX_FILE >/dev/null 2>&1
      mv $FAX_FILE $FAX_FILE.$SUFFIX >/dev/null 2>&1

    done

    # And attach the log file, then copy and delete
    if [ "$ATTACH_LOG_FILE" = "yes" ] ; then

      echo "--------------060502070807080307040206" >>$TEMP_FILE
      echo "Content-Type: application/plain;" >>$TEMP_FILE
      echo " name=\"`basename $NEW_LOG_FILE`\"" >>$TEMP_FILE
      echo "Content-Transfer-Encoding: base64" >>$TEMP_FILE
      echo "Content-Disposition: inline;" >>$TEMP_FILE
      echo " filename=\"`basename $NEW_LOG_FILE`\"" >>$TEMP_FILE
      echo "" >>$TEMP_FILE

      # Add log file as attachment
      $MIMENCODE $NEW_LOG_FILE >>$TEMP_FILE

    fi

    # Completed, let's send the e-mail and cleanup
    cat $TEMP_FILE | $MAILER -odq -t
    rm -f $TEMP_FILE >/dev/null 2>&1

  fi

done

# Delete unwanted fax files
`$CLEANUP >/dev/null 2>&1`

# Finally take care about the next incoming faxes
exec $NICE $EFAX -v "" -v chewmainrxtf -d /dev/$DEV $INIT $CLASSINIT -x $LOCK -l "$FROM" \
                 $RESET -jS0=$ANSRINGS -w -s -r "$ANSFNAME" 2>/dev/null >${DEV}.$$
exit 0
