Files
bforce/contrib/callout.sh
T
2004-12-30 16:00:36 +00:00

230 lines
5.4 KiB
Bash

#!/bin/sh
Ver=1.1h
# óËÒÉÐÔ ÄÌÑ ÐÒÏÚ×ÏÎËÉ ÎÁ ÁÐÌÉÎËÏ×
# ðÒÏ ×ÒÅÍÑ ÉÈ ÒÁÂÏÔÙ (É ÔÅÌÅÆÏÎÙ ÈÉÄÄÅÎÏ×) ÄÏÌÖÅÎ ÚÎÁÔØ ÍÅÊÌÅÒ
#
# úÁÔÏÞÅÎ ÄÌÑ ÍÅÊÌÅÒÁ BinkleyForce
# äÌÑ ÄÒÕÇÉÈ ÐÒÁ×ÉÔØ ÆÕÎËÃÉÀ docallout
#
# Copyright (c) 2000 by Georgi Fofanov, 2:5050/29@fidonet
#
# 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.
#
# ðÕÔØ Ë outbound'Õ ÎÕÖÎÏÊ ÚÏÎÙ (ÐÏËÁ ÚÎÁÅÍ ÔÏÌØËÏ ÐÒÏ ÏÄÎÕ ÚÏÎÕ)
outb=/var/spool/ifmail/outb/
# ðÕÔØ Ë ËÁÔÁÌÏÇÕ Ó lock-ÆÁÊÌÁÍÉ (ÐÏÓÌÅÄÎÉÊ ÓÌÜÛ ÎÕÖÅÎ!)
lock=/var/lock/
# ðÁÕÚÁ ÍÅÖÄÕ Ú×ÏÎËÁÍÉ
# ÷ ÓÅËÕÎÄÁÈ
dialdelay=120
# ðÅÒÉÏÄ ÓËÁÎÉÒÏ×ÁÎÉÑ outbound'Á
# ðÏËÁ ÐÏÓÌÅ ÚÁ×ÅÒÛÅÎÉÑ ËÒÕÇÁ ÐÒÏÚ×ÏÎËÉ ÂÕÄÅÔ 2 ÐÁÕÚÙ - dialdelay É scan
# ÷ ÓÅËÕÎÄÁÈ
scan=60
# ðÁÕÚÁ ÍÅÖÄÕ ÐÒÏ×ÅÒËÁÍÉ lock-ÆÁÊÌÁ
# ÷ ÓÅËÕÎÄÁÈ
lockdelay=10
# òÁÓÐÏÌÏÖÅÎÉÅ ÍÅÊÌÅÒÁ
mailer=/usr/local/bin/bforce
# ëÏÍÁÎÄÁ, ×ÙÐÏÌÎÑÅÍÁÑ ÐÏÓÌÅ ÕÓÐÅÛÎÏÊ ÓÅÓÓÉÉ
after=/usr/local/bin/after_session
# õÓÔÒÏÊÓÔ×Ï, ÎÁ ËÏÔÏÒÏÍ ÓÉÄÉÔ ÍÏÄÅÍ
TTY="ttyS1"
# úÄÅÓØ ÐÅÒÅÞÉÓÌÅÎÙ ÓÉÓÔÅÍÙ, ÎÁ ËÏÔÏÒÙÅ ÍÏÖÎÏ Ú×ÏÎÉÔØ É (ÞÅÒÅÚ ÐÒÏÂÅÌ) ÞÉÓÌÏ
# ÉÈ ÍÏÄÅÍÎÙÈ ÌÉÎÉÊ
# îÁÐÒÉÍÅÒ:
# 2:5050/13 3
# 2:5050/9 2
# 2:5050/33 1
sys_poll=/etc/fido/poll.list
# ðÏÌØÚÏ×ÁÔÅÌØ, ÏÔ ÉÍÅÎÉ ËÏÔÏÒÏÇÏ ÎÁÄÏ ÚÁÐÕÓËÁÔØ
mailer_owner=fido
# ÷ÒÅÍÅÎÎÙÊ ÆÁÊÌ, ËÕÄÁ ÚÁÐÉÓÙ×ÁÅÔÓÑ ÓÐÉÓÏË ?lo É ?ut
list_file=/var/spool/ifmail/list.lst
# ÷ÒÅÍÅÎÎÙÊ ÆÁÊÌ
tmp_file=/var/spool/ifmail/list.tmp
# ÷ÒÅÍÅÎÎÙÊ ÆÁÊÌ, × ËÏÔÏÒÏÍ ÐÅÒÅÞÉÓÌÅÎÙ ÓÉÓÔÅÍÙ, ÎÁ ËÏÔÏÒÙÅ ÂÕÄÅÍ Ú×ÏÎÉÔØ
poll_file=/var/spool/ifmail/polling.list
# íÁËÓÉÍÁÌØÎÏÅ ÞÉÓÌÏ ÐÏÐÙÔÏË ÄÏÚ×ÏÎÉÔØÓÑ ÎÁ ÓÉÓÔÅÍÕ
MAXTRY=25
# óËÏÌØËÏ ×ÒÅÍÅÎÉ ÎÅ Ú×ÏÎÉÔØ ÎÁ ÓÉÓÔÅÍÕ, ÅÓÌÉ ÉÓÞÅÒÐÁÎÏ ÞÉÓÌÏ ÐÏÐÙÔÏË ÄÏÚ×ÏÎÁ
# ÷ ÍÉÎÕÔÁÈ
MAXTIME=60
# ðÒÏÉÚ×ÏÄÉÍ Ú×ÏÎÏË
function docallout ()
{
local zone=$1 net=$2 node=$3 point=$4 curtry=$5 numline=$6 line
let line=${curtry}%${numline}
if [ $point = 0 ] ; then
echo -n `date +%b\ %m\ %T` callout[$$] ú×ÏÎÉÍ ÎÁ ${zone}:${net}/${node} \(try \#${curtry}\)
$mailer ${zone}:${net}/${node} -l $line
let result=$?
else
echo -n `date +%b\ %m.%Y\ %T` callout[$$] ú×ÏÎÉÍ ÎÁ ${zone}:${net}/${node}.${point} \(try \#${curtry}\)
$mailer ${zone}:${net}/${node}.${point} -l $line
let result=$?
fi
case $result in
0 ) echo " ÕÓÐÅÛÎÏ" ;;
* ) echo " ÏÛÉÂËÁ" \#$result ;;
esac
if [ $result = 0 ] ; then
echo `date +%s` 0 0 >$sts
`$after`
else
echo `date +%s` $curtry $result >$sts
fi
}
# ðÒÏ×ÅÒÑÅÍ, ÍÏÖÎÏ ÌÉ Ú×ÏÎÉÔØ ÎÁ ÜÔÕ ÓÉÓÔÅÍÕ
function checkcallout ()
{
local curtry=$1 zone=$2 net=$3 node=$4 point=$5 numline=0
if [ $point = 0 ] ; then
`fgrep "${zone}:${net}/${node}" $sys_poll | awk '{ print "let numline=" $2 }'`
else
`fgrep "${zone}:${net}/${node}.${point}" $sys_poll | awk '{ print "let numline=" $2 }'`
fi
if [ $numline == 0 ] ; then return ; fi
docallout $zone $net $node $point $curtry $numline
}
# óËÁÎÉÒÕÅÍ outbound
function scandir ()
{
find -type f -and \( -name "*.?lo" -o -name "*.?ut" \) > $list_file
for file in `cat $list_file` ; do
eval `echo $file | awk '{ sub(/\.\//, "")
if (substr($0, 9, 4) == ".pnt") {
point = substr($0, 18, 4)
} else {
point = 0
}
printf "zonehex=%s nethex=%s nodehex=%s pointhex=%s let zone=0x%s net=0x%s node=0x%s point=0x%s",
"2", substr($0, 1, 4), substr($0, 5, 4), point,
"2", substr($0, 1, 4), substr($0, 5, 4), point
}'`
ext=${file:${#file}-3}
sts=${file%%?ut}
sts=${sts%%?lo}
bsy=${sts}bsy
sts=${sts}sts
if [ $ext != hlo -a $ext != hut ] ; then
echo ${zone} ${net} ${node} ${point} $sts $bsy >> $tmp_file
fi
done
rm $list_file
if [ -f $tmp_file ] ; then
`cat $tmp_file | sort | uniq > $poll_file`
rm $tmp_file
n=0
for sys in `cat $poll_file` ; do
let n=${n}+1
let tmp=${n}%6
case $tmp in
1 ) let zone=$sys ;;
2 ) let net=$sys ;;
3 ) let node=$sys ;;
4 ) let point=$sys ;;
5 ) sts=$sys ;;
0 ) bsy=$sys ;;
esac
if [ $tmp == 0 ] ; then
while [ -e ${lock}LCK..$TTY ]
do
sleep $lockdelay
done
if [ ! -f $bsy ] ; then
if [ ! -f $sts ] ; then
let lasttime=0 retries=0 errcode=0
else
`cat $sts|awk '{ print "let lasttime=" $1 " retries=" $2 " errcode=" $3 }'`
fi
let curtime=`date +%s`
let timediff=${curtime}-${lasttime}
let curtry=${retries}+1
if [ $curtry -gt $MAXTRY ] ; then
if [ $timediff -gt $MAXTIME ] ; then
let curtry=1
checkcallout $curtry $zone $net $node $point
sleep $dialdelay
fi
else
checkcallout $curtry $zone $net $node $point
sleep $dialdelay
fi
fi
fi
done
rm $poll_file
fi
}
function main ()
{
cd $outb
while [ ! -f /tmp/callout.exit ] ; do
if [ ! -e ${lock}LCK..$TTY ]; then
scandir
sleep $scan
else
sleep $lockdelay
fi
done
rm /tmp/callout.exit
}
if [ `whoami` != "$mailer_owner" ]; then
echo "wrong uid, run as user $mailer_owner (rc=2)"
exit 2
fi
. /etc/profile > /dev/null 2>&1
let MAXTIME=${MAXTIME}*60
main >> /var/log/ifmail/callout.log 2>&1
## éÚÍÅÎÅÎÉÑ
# Ver 1.1, 09 Jul 2000:
#
# ïÂÎÕÌÅÎÉÅ ÞÉÓÌÁ ÐÏÐÙÔÏË ÐÏÓÌÅ ÕÓÐÅÛÎÏÊ ÓÅÓÓÉÉ
#
# îÅ ÒÁÂÏÔÁÌ MAXTIME
# Ver 1.0, 08 Jul 2000:
#
# ðÅÒ×ÁÑ ÓÔÁÂÉÌØÎÁÑ ×ÅÒÓÉÑ