|
|
#!/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:
|
|
|
#
|
|
|
# Первая стабильная версия
|