Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
222 changes: 123 additions & 99 deletions misc/srifreq
Original file line number Diff line number Diff line change
Expand Up @@ -2,129 +2,153 @@

# Simple SRIF compatible FREQ processor
# © Copyleft Stas Degteff 2:5080/102@fidonet
version=1.0

SCRIPT_NAME=${0##*/}
version=1.0-modified-2021-07-12-2

##### Configuration
PUB=/ftp/pub
if [ ${BASH_VERSINFO[1]} -ge 4 ]
then
ALIASES=( [FILES]=/ftp/pub/FILES )
fi

PUB=/ftp/pub/

logfacilityinfo=local1.notice
logfacilityerror=local1.err
logstderr= #-s

if [ ${BASH_VERSINFO[0]} -ge 4 ]
then
declare -A ALIASES

# Static aliases (enable if desired!)
#ALIASES=( [EXAMPLE1]=/path/to/example1 [EXAMPLE2]=/path/to/example2 )

# Add aliases from ifcico reqmap (enable if desired!)
#IFCICO_REQMAP=/etc/ifmail/reqmap
#[ -s "$IFCICO_REQMAP" ] && [ -r "$IFCICO_REQMAP" ] && { while read -r key value; do [ ! "$key" ] && continue; ALIASES[$key]=$value; done; } < "$IFCICO_REQMAP"

fi

##### Implementation

function usage ()
function usage
{
echo "Simple SRIF compatible Fidonet File Request processor v.${version}"
echo -e "@ copyleft Stas Degteff 2:5080/102\n"
if [ ${BASH_VERSINFO[1]} -ge 4 ]
then
Aliases are supported
fi
echo "Usage: `basename $0` <SRIF-file>"
echo "Simple SRIF compatible Fidonet File Request processor v.${version}"
echo -e "@ copyleft Stas Degteff 2:5080/102\n"
[ ${BASH_VERSINFO[0]} -ge 4 ] && echo -e "Aliases are supported\n"
echo "Usage: $SCRIPT_NAME <SRIF-file>"
}
if [ ${BASH_VERSINFO[1]} -ge 4 ]
then
declare -A ALIASES
fi

function getSrifFile ( )
function getSrifFile
# read information from SRIF file
# Parameters: $1 = SRIF file name
{
local token value error

logger -p ${logfacilityinfo} ${logstderr} -t "srifreq[$$]" "parse SRIF file: ${1}"
{ while read -u 4 token value
do
token=${token//[\'\"\`\$]/}
value=${value//[\'\"\`\$]/}
if [ ${BASH_VERSINFO[1]} -ge 4 ]
then
token=${token,,}
fi
local token value error

# case ${token,,} in
case ${token} in
# [Ss][yY][sS][oO][pP])
# sysop=value
# logger -p ${logfacilityinfo} ${logstderr} -t "srifreq[$$]" "sysop: ${sysop}"
# ;;
# [Aa][Kk][Aa])
# aka=value
# logger -p ${logfacilityinfo} ${logstderr} -t "srifreq[$$]" "aka: ${aka}"
# ;;
[Rr][eE][qQ][uU][eE][sS][tT][Ll][iI][sS][tT])
# requestlist)
requestlist=${value//\.\.\/}
logger -p ${logfacilityinfo} ${logstderr} -t "srifreq[$$]" "requestlist: ${requestlist}"
if [ ! -s ${requestlist} ]
then
error=1
logger -p ${logfacilityerror} ${logstderr} -t "srifreq[$$]" "broken SRIF file: RequestList" ${requestlist} "is not exist or empty!"
else
if [ ! -r ${requestlist} ]
then
error=1
logger -p ${logfacilityerror} ${logstderr} -t "srifreq[$$]" "Error: RequestList" ${requestlist} "is not readable!"
fi
fi
;;
[Rr][eE][sS][pP][oO][nN][sS][eE][Ll][iI][sS][tT])
# responselist)
responselist=${value//\.\.\/}
logger -p ${logfacilityinfo} ${logstderr} -t "srifreq[$$]" "responselist: ${responselist}"
if [ ! -w `dirname ${responselist}` ]
then
error=1
logger -p ${logfacilityerror} ${logstderr} -t "srifreq[$$]" "responselist ${responselist} is not writable"
fi
;;
esac
done
} 4<$1
if [ -z ${responselist} -o -z ${requestlist} ]
then
logger -p ${logfacilityerror} ${logstderr} -t "srifreq[$$]" "broken SRIF file: ResponseList or RequestList is not specified"
logger -p "$logfacilityinfo" $logstderr -t "${SCRIPT_NAME}[$$]" "SRIF file: $1"
{
while read -u 4 token value
do

# remove special characters
token=${token//[\'\"\`\$]/}
value=${value//[\'\"\`\$]/}

case "$token" in

[Ss][yY][sS][oO][pP])
sysop=$value
logger -p "$logfacilityinfo" $logstderr -t "${SCRIPT_NAME}[$$]" "Sysop: $sysop"
;;

[Aa][Kk][Aa])
aka=$value
logger -p "$logfacilityinfo" $logstderr -t "${SCRIPT_NAME}[$$]" "AKA: $aka"
;;

[Rr][eE][qQ][uU][eE][sS][tT][Ll][iI][sS][tT])

# remove any directory traversals (../)
# NOTE: Probably unnecessary, as the RequestList path is created by the receiving (local) mailer, which should be trusted!
requestlist=${value//\.\.\/}

logger -p "$logfacilityinfo" $logstderr -t "${SCRIPT_NAME}[$$]" "RequestList: $requestlist"
if [ ! -s "$requestlist" ]
then
error=1
logger -p "$logfacilityerror" $logstderr -t "${SCRIPT_NAME}[$$]" "ERROR: Broken SRIF file: RequestList $requestlist does not exist or is empty!"
else
if [ ! -r "$requestlist" ]
then
error=1
logger -p "$logfacilityerror" $logstderr -t "${SCRIPT_NAME}[$$]" "ERROR: RequestList $requestlist is not readable!"
fi
fi
;;

[Rr][eE][sS][pP][oO][nN][sS][eE][Ll][iI][sS][tT])

# remove any directory traversals (../)
# NOTE: Probably unnecessary, as the ResponseList path is created by the receiving (local) mailer, which should be trusted!
responselist=${value//\.\.\/}

logger -p "$logfacilityinfo" $logstderr -t "${SCRIPT_NAME}[$$]" "ResponseList: $responselist"
if [ ! -w "$(dirname -- "$responselist")" ]
then
error=1
logger -p "$logfacilityerror" $logstderr -t "${SCRIPT_NAME}[$$]" "ERROR: Directory $(dirname -- "$responselist") is not writable, so cannot write ResponseList ${responselist}!"
fi
;;

esac
done
} 4< "$1"

if [ -z "$requestlist" -o -z "$responselist" ]
then
logger -p "$logfacilityerror" $logstderr -t "${SCRIPT_NAME}[$$]" "ERROR: Broken SRIF file: RequestList and/or ResponseList not specified!"
error=1
fi
if [ ${error} ] ; then exit ${error} ; fi

[ "$error" ] && exit $error
}

function processrequest ()
function processrequest
# Process requested file list
# Parameters: $1 = request file (one requesting file in line)
# $2 = responce file (found files prefixed with "+")
{ local fname
while read -u4 fname
do
# $2 = response file (found files prefixed with "+")
{
local fname

while read -u 4 fname
do

# remove special characters
fname=${fname//[\'\"\`\$]}
fname=${fname//$'\r'}
fname=`basename ${fname}`
logger -p ${logfacilityinfo} ${logstderr} -t "srifreq[$$]" "Find file ${fname}"
if [ ${BASH_VERSINFO[1]} -ge 4 ]
then
if [ -n ${ALIASES[${fname}]} ]
then
echo "+${ALIASES[${fname}]}" >>${2}
else
find ${PUB} -name ${fname} -printf "+%p\n" 2>/dev/null >>${2}

# extract basename
fname=${fname##*/}

# ignore empty lines/names
[ ! "$fname" ] && continue

logger -p "$logfacilityinfo" $logstderr -t "${SCRIPT_NAME}[$$]" "Requested file: $fname"

if [ ${BASH_VERSINFO[0]} -ge 4 ]
then
if [ "${ALIASES[$fname]}" ]
then
echo "+${ALIASES[$fname]}" >> "$2"
else
find "$PUB" -name "$fname" -printf "+%p\n" 2> /dev/null >> "$2"
fi
else
find ${PUB} -name ${fname} -printf "+%p\n" 2>/dev/null >>${2}
else
find "$PUB" -name "$fname" -printf "+%p\n" 2> /dev/null >> "$2"
fi
done
} 4<${1}
#### main code
if [ $# != 1 -o ! -f "$1" ]
then
usage
exit 1
fi

getSrifFile $1
processrequest ${requestlist} ${responselist}
} 4< "$1"

#### main code
[ $# != 1 ] && { usage >&2; exit 1; }
getSrifFile "$1"
processrequest "$requestlist" "$responselist"
exit 0