230 lines
5.4 KiB
Bash
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:
|
||
#
|
||
# Первая стабильная версия
|