Чтиво: установка сервера часть 024
При выходе в Инет мне бы хотелось отслеживать - сколько длился доступ и
сколько информации было получено/отправлено, какой пользователь
инициировал дозвон, по какому логину. Данную информацию можно получить
штатными средствами pppd. При установленном соединении ыpppd
устанавливает следующие переменные окружения (я рассматриваю только
нужные мне, про остальные можно прочитать в man pppd):
IPLOCAL - ip-адрес присвоенный интерфейсу в результате соединения
PPPLOGNAME - имя пользователя инициировавшего соединение
Также запускается скрипт ip-up, который в свою очередь запускает
ip-up.local
При окончании связи дополнительно устанавливаются такие переменные
окружения как:
CONNECT_TIME - количество секунд между началом и завершением соединения
BYTES_SENT - количество байт отправленное через соединение
BYTES_RCVD - количество байт полученное через соединение
После чего запускается скрипт ip-down, который запускает ip-dwon.local
Таким образом, если зафиксировать в каком-нибудь файле состояние
переменных на начало и конец соединения, то можно получить неплохую
статистику по дозвонам.
Пусть статистику нужно записывать в /var/log/ppp.log, тогда в файл
/etc/ppp/ip-up.local нужно добавить строчки
/etc/ppp/ip-up.local # Данные о соединении
FILE_ACCOUNT="/etc/ppp/account"
. $FILE_ACCOUNT
# Log-файл
LOG_FILE="/var/log/ppp.log"
# Временная метка
CUR_DATE=`date +%Y%m%d" "%T`
# Записать статистику начала соединения в log-файл
echo ${CUR_DATE}" activated: account: "${ACCOUNT}", user: "${PPPLOGNAME}\
", local ip: "${IPLOCAL} >> $LOG_FILE
а в файл /etc/ppp/ip-down.local -
/etc/ppp/ip-down.local # Данные о соединении
FILE_ACCOUNT="/etc/ppp/account"
. $FILE_ACCOUNT
# Log-файл
LOG_FILE="/var/log/ppp.log"
# Временная метка
CUR_DATE=`date +%Y%m%d" "%T`
# Подготовка цифр, отвечающих за время проведенное в сети, к
# удобочитаемому формату: Часы:Минуты:Секунды
CT=${CONNECT_TIME}
CTT=`expr ${CT} % 60`
[ ${CTT} -lt 10 ] && PRE_S="0" || PRE_S=""
CON_TIME=${PRE_S}${CTT}
CT=`expr ${CT} / 60`
CTT=`expr ${CT} % 60`
[ ${CTT} -lt 10 ] && PRE_S="0" || PRE_S=""
CON_TIME=${PRE_S}${CTT}":"${CON_TIME}
CT=`expr ${CT} / 60`
CON_TIME=${CT}:${CON_TIME}
# Записать статистику конца соединения в log-файл
echo ${CUR_DATE}" terminated: account: "${ACCOUNT}", time: "${CON_TIME}\
", data received: "${BYTES_RCVD}", send: "${BYTES_SENT} >> $LOG_FILE
Теперь, при использовании Инета в /var/log/ppp.log будт появляться
следующие строчки:
20031021 15:16:57 activated: account: mylogin, user: nina, local ip: 213.59.73.164
20031021 15:19:57 terminated: account: mylogin, time: 0:03:14, recieved: 214003,
send: 37826
Ну, я думаю здесь ничего сложного.
C уважением, Kolotov Alexandr (aka mr. Эбола)
отвечать: myscri***@e*****.ru
ICQ: 100349254
-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.linux.kirovlug-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.linux.kirovlug&email=
http://subscribe.ru/ mailto:ask@subscribe.ru
On Tue, Oct 21, 2003 at 03:59:15PM +0400, Kolotov Alexandr wrote:
попонтуемся?
$statprov.sh --help
Использовать:
statprov.sh {-h|--help} эта справка
statprov.sh за весь период
statprov.sh -d|--today за сегодня
statprov.sh -w|--lastweek за неделю
statprov.sh -m|--lastmonth за месяц
statprov.sh {--|нач_дата} [--|конеч_дата] на период [<нач_дата>; <конеч_дата>]
$statprov.sh 2003/08/10 2003/08/15
Расчет на период с 2003/08/10 по 2003/08/15
Соединение Время (ч) Послано (Мб) Получено (Мб)
work 21.1667 14.8174 152.076
TOTAL 92.6167 59.4082 751.945
cat /etc/ppp/ip-down.d/10log
#!/bin/sh
#
okrugl()
{
if [ $(( $1 / $2 )) = 0 ]
then
echo 1
else
echo $[( $1 + $2 / 2 ) / $2]
fi
}
echo Connected: ${PPP_IPPARAM} `date +'%Y/%m/%d %T' -d "-${CONNECT_TIME} sec"`\
- `date +'%T'`" Time: `okrugl $CONNECT_TIME 60` m, Sent: `okrugl $BYTES_SENT
1024` Kb, \
Rcvd: `okrugl $BYTES_RCVD 1024` Kb" >> /var/log/ppp.log
# last line
cat bin/statprov.sh
#!/bin/sh
prog=`echo $0 | sed 's|.*/||'`
if test -z $1; then
date_ot="0000/00/00"
else
case "$1" in
-h | --help) echo -e "Использовать:\
\n\t$prog {-h|--help} эта справка\
\n\t$prog за весь период\
\n\t$prog -d|--today за сегодня\
\n\t$prog -w|--lastweek за неделю\
\n\t$prog -m|--lastmonth за месяц\
\n\t$prog {--|нач_дата} [--|конеч_дата] на период [<нач_дата>; <конеч_дата>]";
exit;;
-d|--today) date_ot=`date '+%Y/%m/%d'`; date_do=`date '+%Y/%m/%d'`;;
-w|--lastweek) date_ot=`date -d 'week ago' '+%Y/%m/%d'`; date_do=`date '+%Y/%m/%d'`;;
-m|--lastmonth) date_ot=`date -d 'month ago' '+%Y/%m/%d'`; date_do=`date '+%Y/%m/%d'`;;
--) date_ot="0000/00/00";;
[0-9][0-9][0-9][0-9]/[0-1][0-9]/[0-3][0-9]) date_ot="$1";;
*) echo Неверный формат начальной даты; exit 1;;
esac
fi
if test -z $2; then
if test -z $date_do; then
date_do="9999/99/99"
fi
else
case "$2" in
--) date_do="9999/99/99";;
[0-9][0-9][0-9][0-9]/[0-1][0-9]/[0-3][0-9]) date_do="$2";;
*) echo Неверный формат конечной даты; exit 2;;
esac
fi
echo Расчет на период с $date_ot по $date_do
pushd /etc/chatscripts > /dev/null
echo -e "Соединение\tВремя (ч)\tПослано (Мб)\tПолучено (Мб)"
echo for i in *
do
if [ $i == "provider" ] ; then continue; fi
if test -z `echo $i | awk '! /.*\.bak/ {print 1}'`; then continue; fi
awk -v prov=$i -v date_ot=$date_ot -v date_do=$date_do '$2 ~ prov { if ( $3
" \t" time/60 "\t\t" Snt/1024 "\t\t" Rcvd/1024}' < /var/log/ppp.log
done
echo awk '{time+=$8; Snt+=$11; Rcvd+=$14} END{print "TOTAL \t" time/60 "\t\t"
Snt/1024 "\t\t" Rcvd/1024}' < /var/log/ppp.log
-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.linux.kirovlug-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.linux.kirovlug&email=
http://subscribe.ru/ mailto:ask@subscribe.ru