#!/bin/sh #---------------------------------------------------------------------------- # /usr/bin/mail2fax - mail to fax gateway script # # Creation: 2006-12-26 jed # Last Update: $Id$ # # Copyright (c) 2007-@@YEAR@@ Holger Bruenjes, holgerbruenjes(at)gmx(dot)net # # Usage: cat test.fax | mail2fax [-debug|-simulate|-help|--help] sender-address fax-number # # Switches: # -debug - show debug messages while executing programs # -receiver - receiver information, format: see fax-number # -sender - sender information, format: see sender-address # -simulate - execute script without finaly sending the fax # -subject - get regarding information, e.g. "concerning our phone call" # -help|--help - show usage information # # Parameters: sender-address - email address of sender # fax-number - fax number to dial. # Format: or # / or # // or # faxg3// or # faxg3//@domain.tld # # Important information: # # 01.06.2014/JED - If the Remote-CAPI and an AVM Fritz!Box are used, # coverpages are currently not supported due to a # capifax restriction (only one single file can be # send at a time). # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. #---------------------------------------------------------------------------- #exec 2> /tmp/mail2fax-trace$$.log #set -x # set '-D' or '' for notify mail, changes from eisfax.sh # do not edit that, edit EisFAX config file faxmail_notify='-D' # --------------------------------------------------------------------------- # check if yes or no # # input: $1 - 'yes' or 'no' # return: 0 - valid value # 1 - invalid value # ---------------------------------------------------------------------------- check_yesno() { yesno=${1} retval=1 case ${yesno} in yes|no) # valid value retval=0 ;; esac return ${retval} } # ---------------------------------------------------------------------------- # check if modem group exists # # input: $1 - name of modem group # return: 0 - group exists # 1 - group doesn't exist # --------------------------------------------------------------------------- check_mdmgroup() { mdmgroup="$(echo \"${1}\" | tr 'A-Z' 'a-z')" retval=1 if [ -f ${hylafax_etc_path}/config ] then for MGROUP in $(grep "^ModemGroup:" ${hylafax_etc_path}/config | sed 's/ //g' | cut -d: -f2 | tr 'A-Z' 'a-z') do if [ "${mdmgroup}" = "${MGROUP}" ] then # group found retval=0 break fi done fi return ${retval} } # ---------------------------------------------------------------------------- # check if modem speed is an allowed value # # input: $1 - modem speed # return: 0 - speed allowed # 1 - speed not allowed # ---------------------------------------------------------------------------- check_mdmspeed() { mdmspeed=${1} retval=1 # check if numeric value echo "${mdmspeed}" | grep -q '^[0-9]*$' if [ $? -eq 0 ] then case ${mdmspeed} in 2400|4800|7200|9600|12000|14400|16800|19200|21600|24000|26400|28800|31200|33600) # allowed speed value retval=0 ;; esac fi return ${retval} } # ---------------------------------------------------------------------------- # extract information from string # # input: $1 - field identifier # $2 - text string # return: parameter value # ---------------------------------------------------------------------------- extract_info() { field="${1}" text="${2}" echo "${text}" | sed -e "s/${field}=//" -e 's/_/ /g' } # ---------------------------------------------------------------------------- # should coverpage be used # # return: 0 - use coverpage # 1 - don't use coverpage # ---------------------------------------------------------------------------- use_coverpage() { ret_val=1 if [ -f ${hylafax_coverpage_file} ] then # file exists, check if coverpage usage cpage=$(grep "^coverpage:" ${hylafax_coverpage_file} | cut -d: -f2) if [ "${cpage}" = "yes" ] then # coverpage=yes ret_val=0 fi fi return ${ret_val} } # ---------------------------------------------------------------------------- # get coverpage type # # input: $1 - modem group (optional) # return: 1 - yes - use coverpage, allow overwrite # 2 - no - don't use coverpage, allow overwrite # 3 - yesfix - always use coverpage, don't allow overwrite # 4 - nofix - never use coverpage, don't allow overwrite # ---------------------------------------------------------------------------- get_covertype() { mdmgroup="$(echo \"${1}\" | tr 'A-Z' 'a-z')" retval=4 if use_coverpage then # coverpage=yes cpage_type=$(grep "^default:" ${hylafax_coverpage_file} | cut -d: -f2) case ${cpage_type} in 1|2|3|4) # value in range - go on... retval=${cpage_type} if [ "${mdmgroup}" != "" ] then cpage_type=$(grep "^${mdmgroup}:" ${hylafax_coverpage_file} | cut -d: -f2) case ${cpage_type} in 1|2|3|4) # value in range retval=${cpage_type} ;; *) # value not allowed ;; esac fi ;; *) # value not allowed ;; esac fi return ${retval} } # ---------------------------------------------------------------------------- # print help # ---------------------------------------------------------------------------- print_help() { echo "Usage: cat test.fax | mail2fax [-debug]|-help|--help][-simulate][-subject 'subject-text']" echo " sender-address fax-number" echo echo " cat test.fax | mail2fax [-debug]|-help|--help] -receiver fax-number -sender sender-address" echo " [-simulate][-subject 'subject-text']" } # ---------------------------------------------------------------------------- # main # ---------------------------------------------------------------------------- RUN_CMD="$0 $*" run_path=/run hylafax_etc_path=/var/spool/hylafax/etc hylafax_cover_path=/var/spool/hylafax/coverpage hylafax_coverpage_file=/var/lib/eisfax/eisfax-coverpage msg_tmp_file=${run_path}/mail2fax-tmp.$$ # get parameters debug='' fax_receiver='' fax_sender='' fax_regarding='' simulate=0 while [ 1 ] do case ${1} in -debug) # debug mode debug='-debug' shift ;; '-help'|'--help'|'-?'|'/?') # show help print_help exit 1 ;; -receiver) # get receiver information, e.g. "Tom Jones" fax_receiver="${2}" shift; shift ;; -sender) # get sender information, e.g. "modem-group/options/112233" fax_sender="${2}" shift; shift ;; -simulate) # simulation mode - no fax will be send simulate=1 shift ;; -subject) # get regarding information, e.g. "concerning our phone call" fax_regarding="${2}" shift; shift ;; -*) # invalid switch given echo "invalid switch '${1}' given!" exit 1 ;; *) break ;; esac done # read command line parameters if [ "${fax_sender}" = "" ] then fax_sender="${1}" fi if [ "${fax_receiver}" = "" ] then fax_receiver="${2}" fi if [ "${fax_sender}" != "" -a "${fax_receiver}" != "" ] then # set defaults fax_comment='' fax_number='' fax_coverpage='' fax_regarding='' fax_template='' from_address='' from_company='' from_location='' from_name='' from_voice='' to_company='' to_location='' to_name='' to_voice='' modem_group='' modem_speed='' # check if domain has given within parameter echo "${fax_receiver}" | grep -q "\@" if [ $? -eq 0 ] then # remove domain part, e.g. options/112233@domain.tld -> options/112233 fax_receiver="$(echo \"${fax_receiver}\" | cut -d@ -f1 | sed 's/ //g')" fi idx=1 while [ ${idx} -ne 0 ] do # check if additional parameters, like modem-name or modem-speed have been given echo "${fax_receiver}" | grep -q "\/" if [ $? -eq 0 ] then # separate parameters echo "${fax_receiver}" | grep -i -q "^faxg3\/" if [ $? -eq 0 ] then # strip first parameter fax_receiver="$(echo \"${fax_receiver}\" | cut -d/ -f2-)" fi echo "${fax_receiver}" | grep -E -i -q "^gr=|^sp=|^cc=|^cp=|^cs=|^ct=|^fc=|^fl=|^fn=|^fv=|^tc=|^tl=|^tn=|^tv=" if [ $? -eq 0 ] then # options options="$(echo \"${fax_receiver}\" | cut -d/ -f1 | sed 's/ //g')" _oldifs=${IFS} IFS=# set ${options} IFS=${_oldifs} while [ 1 ] do case ${1} in gr=*) # modem-group, e.g. gr=modem-group/112233 -> modem-group modem_group=$(extract_info gr "${1}") if ! check_mdmgroup ${modem_group} then # group doesn't exist modem_group='' fi ;; sp=*) # modem speed, e.g. sp=9600/112233 -> 9600 modem_speed=$(extract_info sp "${1}") if ! check_mdmspeed ${modem_speed} then # speed not allowed modem_speed='' fi ;; #------------ cc=*) # comment, e.g. cc=My_Comment -> My Comment fax_comment=$(extract_info cc "${1}") ;; cp=*) # coverpage, e.g. cp=yes -> yes fax_coverpage=$(extract_info cp "${1}") if ! check_yesno ${fax_coverpage} then fax_coverpage='' fi ;; cs=*) # subject, e.g. cs=My_Subject -> My Subject fax_regarding=$(extract_info cs "${1}") ;; ct=*) # template, e.g. ct=my-own-template -> /my-own-template fax_template=${hylafax_cover_path}/$(extract_info ct "${1}") ;; #------------ fc=*) # from company, e.g. fc=From_Company -> From Company from_company=$(extract_info fc "${1}") ;; fl=*) # from location, e.g. fl=From_Location -> From Location from_location=$(extract_info fl "${1}") ;; fn=*) # from, e.g. fn=Tom_Jones -> Tom Jones from_name=$(extract_info fn "${1}") ;; fv=*) # from voice, e.g. fv=0221.112233 -> 0221.112233 from_voice=$(extract_info fv "${1}") ;; #------------ tc=*) # to company, e.g. tc=To_Company -> To Company to_company=$(extract_info tc "${1}") ;; tl=*) # to location, e.g. tl=To_Location -> To Location to_location=$(extract_info tl "${1}") ;; tn=*) # to, e.g. fn=Mike_Oldfield -> Mike Oldfield to_name=$(extract_info tn "${1}") ;; tv=*) # to voice, e.g. tv=0211.334455 -> 0211.334455 to_voice=$(extract_info tv "${1}") ;; #------------ *) break ;; esac # next parameter shift done fi idx=$((${idx} + 1)) else # extract fax number, e.g. 112233 -> 112233 fax_number="$(echo ${fax_receiver} | sed 's/ //g')" idx=0 fi # strip first parameter fax_receiver="$(echo \"${fax_receiver}\" | cut -d/ -f2-)" done # set optional parameters cmd_str1='' cmd_str2='-m' # add debug options if [ "${debug}" != "" ] then cmd_str1="-v" cmd_str2="${cmd_str2} -v -v" fi # faxcover: absolute pathname of a cover sheet template if [ "${fax_template}" != "" ] then if [ -f ${fax_template} ] then cmd_str2="${cmd_str2} -C ${fax_template}" fi fi # faxcover: activation get_covertype ${modem_group} case $? in 1) # yes - use coverpage, allow overwrite fax_sys_coverpage='yes' coverpage='' if [ "${fax_coverpage}" = "no" ] then # don't use coverpage coverpage='-n' fi ;; 2) # no - don't use coverpage, allow overwrite fax_sys_coverpage='no' coverpage='-n' if [ "${fax_coverpage}" = "yes" ] then # use coverpage coverpage='' fi ;; 3) # yesfix - always use coverpage, don't allow overwrite fax_sys_coverpage='yesfix' coverpage='' ;; 4) # nofix - never use coverpage, don't allow overwrite fax_sys_coverpage='nofix' coverpage='-n' ;; *) # default fax_sys_coverpage='no-default' coverpage='-n' ;; esac cmd_str2="${cmd_str2} ${coverpage}" # from-name if [ "${from_name}" = "" ] then from_address="${fax_sender}" else from_address="\"${from_name}\" <${fax_sender}>" fi # modem-name if [ "${modem_group}" != "" ] then cmd_str2="${cmd_str2} -h ${modem_group}@localhost" fi # modem-speed if [ "${modem_speed}" != "" ] then cmd_str2="${cmd_str2} -B ${modem_speed}" fi # to-name if [ "${to_name}" != "" ] then # add to-name to dial-string fax_number="${to_name}@${fax_number}" fi if [ ${simulate:-0} -eq 1 ] then # printout parameters echo "faxcover: system-cover :${fax_sys_coverpage}:" echo "faxcover: user-cover ..:${fax_coverpage}:" if [ "${coverpage}" = "" ] then echo "faxcover: result-cover :yes:" else echo "faxcover: result-cover :no:" fi echo echo "faxcover: from-company :${from_company}:" echo "faxcover: from-name ...:${from_name}:" echo "faxcover: from-location:${from_location}:" echo "faxcover: from-voice ..:${from_voice}:" echo echo "faxcover: to-company ..:${to_company}:" echo "faxcover: to-name .....:${to_name}:" echo "faxcover: to-location .:${to_location}:" echo "faxcover: to-voice ....:${to_voice}:" echo echo "faxcover: comment .....:${fax_comment}:" echo "faxcover: regarding ...:${fax_regarding}:" echo echo "modem-group:${modem_group}:" echo "modem-speed:${modem_speed}:" echo "fax-sender:${fax_sender}:" echo "fax-number:${fax_number}:" echo echo "faxmail:${cmd_str1}:" echo "sendfax:${cmd_str2}:" else # trick to run command and parse command line parameters properly # set german time format LC_TIME=de_DE export LC_TIME # 1. concatenate To: line if a newline is found # 2. add newline to end of file if it doesn't exist to prevent faxmail problems # 3. use tee command to create a message dump for debug purposes # 4. use faxmail command to convert mime-parts to postscript # 5. use sendfax to send the fax sed -e :a -e '/^To: *$/N; s/\n *//; ta' | awk '/^$/{f=1}END{ if (!f) {print "\r"}}1' | /usr/bin/tee ${msg_tmp_file} | /usr/bin/faxmail ${cmd_str1} | /usr/bin/sendfax ${cmd_str2} ${faxmail_notify} -c "${fax_comment}" -f "${from_address}" -r "${fax_regarding}" -U "${from_voice}" -Y "${from_location}" -X "${from_company}" -y "${to_location}" -x "${to_company}" -V "${to_voice}" -d "${fax_number}" # if [ "${debug}" = "" ] # then # delete message dump file rm -f ${msg_tmp_file} # fi fi else # show help echo "Invalid number of parameters given!" exit 1 fi # --------------------------------------------------------------------------- # end # ---------------------------------------------------------------------------