(См. также: Оптимизированная версия
free-sa-report2, теперь входит в комплект для сборки
rpm пакета free-sa).
Основные возможности:
-
Создание ежедневного и накопительного отчета прокси с использованием анализатора Free-SA;
-
Автоматическое получение отчетов из архивного лога Squid, в случае отработки logrotate в
текущем дне раньше выполнения задания free-sa-report.
Пример cкрипта для автоматизации процесса разбора логов Squid
Cкрипт
free-sa-report разработан для автоматизации процесса разбора логов прокси Squid
анализатором
Free-SA (http://free-sa.sourceforge.net).
Описание:
-
Данный скрипт помогает создавать и обновлять отчеты Free-SA
с определенной структурой каталогов, создавать архив.
-
Автоматический запуск скрипта осуществляется по расписанию cron.
-
Расписание спланировано в соответствии с настройками logrotate
для логов Squid.
-
Пример настройки logrotate и cron прилагаются.
Пример free-sa-report файла:
(Скачать файл можно будет
здесь. ЗЫ Не тыкать! Жать правой
кнопкой: сохранить ссылку как...)
Пример logrotate и cron ниже по тексту.
Условия:
-
Установлены: http-proxy (squid), Free-SA, httpd (например Apache).
Подробности установки смотрите в документации на соответствующие продукты.
-
Каталог htdocs Apache сервера: /srv/www/htdocs
-
Дерево каталогов free-sa относительно корневого htdocs:
./free-sa/
-
month/
-
week/
-
day/
-
archive/
В каталоге ./free-sa/month ./free-sa/week ./free-sa/day
автоматически создаются подкаталоги за период, типа: dd.mm.yyyy-dd.mm.yyyy-n
-
Архив с отчетами free-sa: ./free-sa/archive/free-sa.tar.bz2
-
Бинарник free-sa: /usr/bin/free-sa
-
Конфиг free-sa: /usr/share/free-sa/free-sa-report.conf (по умолчанию для скрипта)
либо /etc/free-sa/free-sa.conf
-
Каталог с логами Squid: /var/log/squid
Логи: access.log
Архивы: access.log-*.bz2
-
Предположим, что в нашей системе есть системный пользователь squid, от его имени стартует
служба /etc/init.d/squid и анализатор free-sa. Для нормальной работы скрипта установлен
владельцем папки /srv/www/htdocs/free-sa и всех подпапок - пользователь squid с правами 755.
-
Каталог /srv/www/htdocs/free-sa/month/var и /srv/www/htdocs/free-sa/week/var - промежуточный, используется для
формирования накопительного отчета lastdate-curdate.
-
В примере запуск free-sa осуществляется с параметром export LC_TIME=ru_RU.UTF-8 это
требуется для корректного определения дат.
Текст:
#!/bin/sh
#
# free-sa-report
# Report generate script for Free-SA
# Author: Konstantin Nadezhdin <w.homenki.ru>
#
# Read sysconfig
if [ -s /etc/sysconfig/free-sa ]; then
. /etc/sysconfig/free-sa
else
echo "Error: /etc/sysconfig/free-sa not exist!"
exit
fi
FREE_SA=/usr/bin/free-sa
if [ "$USE_FREE_SA_REPORT" != "yes" ]; then
echo "Error: free-sa-report disabled in /etc/sysconfig/free-sa"
exit
fi
if [ "$ACCESSLOG" = "" ]; then
ACCESSLOG=/var/log/squid/access.log
elif [ ! -s $ACCESSLOG ]; then
echo "$ACCESSLOG not exist!"
exit
fi
if [ "$HTMLOUT" = "" ]; then
HTMLOUT=/srv/www/htdocs/free-sa
elif [ ! -d $HTMLOUT ]; then
echo "$HTMLOUT not exist or isn't directory!"
exit
fi
if [ "$FREE_SA_CONF" = "" ]; then
FREE_SA_CONF=/usr/share/free-sa/free-sa-report.conf
elif [ ! -s $FREE_SA_CONF ]; then
echo "$FREE_SA_CONF not exist!"
exit
fi
if [ "$TMPDIR" = "" ]; then
TMPDIR=/var/cache/free-sa
elif [ ! -d $TMPDIR ]; then
echo "$TMPDIR not exist or isn't directory!"
exit
fi
export LC_TIME=ru_RU.UTF-8
FREE_SA_ARCH=$HTMLOUT/archive/free-sa.tar.bz2
MONTH_CONF=$TMPDIR/THISMONTH.conf
WEEK_CONF=$TMPDIR/THISWEEK.conf
DAY_CONF=$TMPDIR/TODAY.conf
TODAY=`date "+%Y%m%d"`
let i=`date "+%u"`-1
THISWEEK=`date -d -${i}day '+%d.%m.%Y'`
THISMONTH=`date "+01.%m.%Y"`
make_index ()
{
if [ ! -s $HTMLOUT/index.html ]; then
echo -e "<html>\n\
<head>\n\
<META http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">\n\
<script language=Javascript>\n\
function change(select) {\n\
if( select.options[ select.selectedIndex].value) {\n\
select.form.action = select.options[ select.selectedIndex].value;\n\
select.form.submit();\n\
}\n\
}\n\
</script>\n\
</head>\n\
<body>\n\
<h3>Free-SA report</h3>\n\
<form target='page' name='menuform'>\n\
<select name='slmenu' onchange='change(this)'>\n\
<option selected value=''>-Select reports-</option>\n\
<option value = 'day'>Free-SA reports by day</option>\n\
<option value = 'week'>Free-SA reports by week</option>\n\
<option value = 'month'>Free-SA reports by month</option>\n\
</select>\n\
</form>\n\
</body>\n\
</html>\n" > $HTMLOUT/index.html
fi
}
bunzip2_archive_log ()
{
if [ -s $ACCESSLOG-$TODAY.bz2 ]; then
bunzip2 -k $ACCESSLOG-$TODAY.bz2
fi
}
del_bunzip2ed_log ()
{
if [ -s $ACCESSLOG-$TODAY ]; then
rm -f $ACCESSLOG-$TODAY
fi
}
sed_conf ()
{
sed -e 's/^rotate=/#rotate=/' \
-e 's/^overwrite=/#overwrite=/' \
-e 's/^name=/#name=/' < $FREE_SA_CONF > $1
}
check_conf ()
{
case $1 in
month)
sed_conf "$MONTH_CONF"
echo -e "\nrotate=\"quarter\"\noverwrite=\"2\"\nname=\"THISMONTH\"" >> $MONTH_CONF
;;
week)
sed_conf "$WEEK_CONF"
echo -e "\nrotate=\"month\"\noverwrite=\"2\"\nname=\"THISWEEK\"" >> $WEEK_CONF
;;
day)
sed_conf "$DAY_CONF"
echo -e "\nrotate=\"week\"\noverwrite=\"2\"\nname=\"TODAY\"" >> $DAY_CONF
;;
*)
;;
esac
}
read_archive_log ()
{
if [ -s $ACCESSLOG-$TODAY ]; then
check_conf $1
$FREE_SA -l $ACCESSLOG-$TODAY $2
fi
}
check_dir ()
{
if [ ! -d $HTMLOUT/$1 ]; then
mkdir $HTMLOUT/$1
fi
if [ "$2" = "1" ]; then
for i in css png js
do
cp -pfuv /srv/www/htdocs/free-sa/*.$i $HTMLOUT/$1
done
fi
}
bunzip2_archive_log
#Month
check_dir month 1
check_dir month/var
check_conf month
$FREE_SA -l $ACCESSLOG -f $MONTH_CONF -o $HTMLOUT/month/var -d $THISMONTH-
rm -rf $HTMLOUT/month/lastdate-curdate && mv -f $HTMLOUT/month/var/*.*.*-*.*.* $HTMLOUT/month/lastdate-curdate
read_archive_log month "-f $MONTH_CONF -o $HTMLOUT/month -d $THISMONTH-"
check_conf month
$FREE_SA -F -f $MONTH_CONF -o $HTMLOUT/month
#Week
check_dir week 1
check_dir week/var
check_conf week
$FREE_SA -l $ACCESSLOG -f $WEEK_CONF -o $HTMLOUT/week/var -d $THISWEEK-
rm -rf $HTMLOUT/week/lastdate-curdate && mv -f $HTMLOUT/week/var/*.*.*-*.*.* $HTMLOUT/week/lastdate-curdate
read_archive_log week "-f $WEEK_CONF -o $HTMLOUT/week -d $THISWEEK-"
check_conf week
$FREE_SA -F -f $WEEK_CONF -o $HTMLOUT/week
#Day
check_dir day 1
check_conf day
$FREE_SA -l $ACCESSLOG -f $DAY_CONF -o $HTMLOUT/day -d day
read_archive_log day "-f $DAY_CONF -o $HTMLOUT/day -d day"
check_conf day
$FREE_SA -F -f $DAY_CONF -o $HTMLOUT/day
rm -rf $TMPDIR/*
del_bunzip2ed_log
make_index
#Archive free-sa
check_dir archive
rm -f $FREE_SA_ARCH
tar -cjf $FREE_SA_ARCH --exclude=archive* -C $HTMLOUT .
exit
Пример /etc/sysconfig/free-sa:
## Path: Applications/Free-SA
## Description: Configuration of free-sa
## Type: yesno
## Default: no
#
# Should free-sa-report be enabled to start by cron ("yes" or "no")
#
# To add free-sa-report to crontab.
# First read:
# man crontab
# Then use:
# crontab -u squid -e
# or:
# crontab -u squid path_to_sample_cron_file
#
# Sample cron file:
#
# PATH=/sbin:/bin:/usr/bin
# MAILTO=root
# 0 21 * * * /usr/sbin/free-sa-report
#
USE_FREE_SA_REPORT="yes"
## Type: string
## Default: "/var/log/squid/access.log"
#
# Path to squid access.log
#
ACCESSLOG="/var/log/squid/access.log"
## Type: string
## Default: "/srv/www/htdocs/free-sa"
#
# Where free-sa should save reports
#
HTMLOUT="/srv/www/htdocs/free-sa"
## Type: string
## Default: "/usr/share/free-sa/free-sa-report.conf"
#
# Path to default free-sa-report configuration file
#
FREE_SA_CONF="/usr/share/free-sa/free-sa-report.conf"
## Type: string
## Default: "/var/cache/free-sa"
#
# Where free-sa-report should create temp configuration
# files for day, week and month reports
#
TMPDIR="/var/cache/free-sa"
Пример настройки logrotate файла:
Позволяет ежедневно ротировать архив free-sa.tar.bz2
Текст:
# /etc/logrotate.d/free-sa
# $Id$
/srv/www/htdocs/free-sa/archive/free-sa.tar.bz2 {
daily
rotate 7
missingok
nocreate
sharedscripts
postrotate
endscript
}
Пример настройки cron:
-
Позволяет ежедневно выполнять free-sa-report
в 23:00.
-
Выбор времени должен быть согласован с отработкой logrotate! В разных дистрибутивах
схема запуска logrotate может отличаться, free-sa-report должен отрабатывать позже!
-
Для создания нового задания в cron можно добавить указанную ниже строку в файл cron_file,
затем выполнить команду crontab для пользователя squid: crontab -u squid cron_file
Проверить добавилось ли задание: crontab -u user -l
Текст:
0 23 * * * /usr/sbin/free-sa-report
Пример конфигурационного файла free-sa.conf
Вывод команды:
grep -Ev "^#|^$" free-sa.conf (коментарии опущены).
downloads="/etc/free-sa/downloads.sample"
tmpdir="/var/cache/free-sa"
ts="true"
paf="true"
saf="true"
pdn="true"
sdn="true"
cct="true"
pst="true"
dld="true"
fullurl="true"
users="true"
url_limit="80"
name="free-sa-report"
locale="ru_RU.UTF-8"
divisor="M"
Пример конфигурационного файла THISMONTH.conf, создаваемого скриптом автоматически
Отличается от предыдущего только некоторыми параметрами:
name="THISMONTH"
overwrite="2"
rotate="quarter"
Пример конфигурационного файла THISWEEK.conf, создаваемого скриптом автоматически
Отличается от предыдущего только некоторыми параметрами:
name="THISWEEK"
overwrite="2"
rotate="month"
Пример конфигурационного файла TODAY.conf, создаваемого скриптом автоматически
Отличается от предыдущего только некоторыми параметрами:
name="TODAY"
overwrite="2"
rotate="week"