You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
bforce/contrib/callout.sh

230 lines
5.4 KiB
Bash

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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