[Системное администрирование] Работаем с lightsquid или как сделать индивидуальную статистику для пользователей

Автор Сообщение
news_bot ®

Стаж: 6 лет 9 месяцев
Сообщений: 27286

Создавать темы news_bot ® написал(а)
24-Мар-2021 20:32

Итак, появилась у меня задача на работе: дать каждому пользователю возможность смотреть свои логи посещения интернета. Вроде кажется и задача такая — должна уже со всех сторон на любом форуме обсудится и как минимум должно быть готовое решение, как максимум пошаговая инструкция. Но ни того ни другого я не смог найти. Поэтому пришлось изобретать собственный велосипед. Ниже приведена почти пошаговая инструкция решения данной проблемы с использованием lightsquid и скриптов. Осторожно много скриптов.
Что нужно
  • Установленная Ubuntu server (лично в моей реализации это версия 13.04)
  • Установленный Apache2
  • Установленный настроенный и уже собирающий статистику squid (в моем случае это 2.7)

Предварительно оговорим условия:
  • Идентификация пользователя производится по его IP адресу
  • Каждый пользователь может смотреть только свою статистику
  • Статистика выводится через WEB интерфейс

Начинаем
Нужен сам lighsquid
Первым делом скачае LightSquid

Разархивируем. Я предпочел разархивировать в корень /var, на самом деле можете и в /www (если нужны графики и прочее)
tar -zxf lightsquid-1.8.tgz /var/lightsquid

Выставляем рекурсивно права 755 пользователю и группе www-data на каталог и его содержимое
chmod -R 755 /var/lightsquid
chown -R www-data:www-data /var/lightsquid

Делаем скрипты программы исполняемыми:
chmod +x *.cgi
chmod +x *.pl

Если вам действительно нужны графики то нужно установить пакет libgd-gd2-perl
sudo apt-get install libgd-gd2-perl

Теперь следует подправить сам конфиг LightSquid
nano /var/lightsquid/lightsquid.cfg

Правим пути в секции GLOBAL VARIABLES
#path to additional `cfg` files
$cfgpath ="/var/lightsquid";
#path to `tpl` folder
$tplpath ="/var/lightsquid/tpl";
#path to `lang` folder
$langpath ="/var/lightsquid/lang";
#path to `report` folder
$reportpath ="/var/lightsquid/report";
#path to access.log
$logpath ="/var/log/squid";
#path to `ip2name` folder
$ip2namepath ="/var/lightsquid/ip2name";

В секции WEB VARIABLES выставляем нужный язык интерфейса. В данном случае русский.
$lang =«ru»;

Ну все lightsquid должен быть готов к работе. Если у вас есть логи squid можете их про парсить что бы потом можно было увидеть их в отчете:
/var/lightsquid# ./lightparser.pl access.log.59 && ./lightparser.pl access.log.58 && ./lightparser.pl access.log.57 && ./lightparser.pl access.log.56 && ./lightparser.pl access.log.55 && ./lightparser.pl access.log.54 && ./lightparser.pl access.log.53… и т.д.

Сам процесс
Т.к. LightSquid с помощь cgi скриптов формирует html тэгированные файлы, потом выдает их серверу, сервер пользователю, а пользователь в свою очередь видит ВСЮ статистику по ВСЕМ пользователям — это не есть хорошо. Поэтому есть задача, «перехватить» вывод, сделать свой html файли с преферансом и куртизанками и выдать обработанный файл пользователю.
Первый скрипт на PHP
Создаем файл:
nano /var/www/index.php

Первый скрипт он у нас будет на РНР: это будет стартовая страничка которая будет показывать пользователю «обработанную» первую страницу ligsquid. Заносим данные:
<?php
$year = " {$_GET['year']}";
$month = " {$_GET['month']}";
$day = " {$_GET['day']}";
$ip_host = "{$_SERVER['REMOTE_ADDR']}";
$str = "sudo /var/lightsquid/my_scr/index.sh ".$ip_host.$year.$month.$day;
echo exec($str);
include "/var/lightsquid/my_tmp/".$ip_host."log_file.html"
?>

Принцип таков. Мы через РНР получаем какие либо параметры, в данном случае год, месяц, день, на стартовой странице эти параметры пусты, но если перейти на другой месяц, или год, то сразу же они будут заполнены.
Далее мы сами узнаем IP хоста, который запросил данную страничку. Этот ip нам нужен чтобы формировать ТОЛЬКО по нему данные, и вообще как — то ориентироваться среди создаваемых нами файлов, потому что мы будем привязывать имя файла к его IP адресу.
Далее мы формируем строку. Которая запускает следующий скрипт ( будет ниже описан) и передает в него параметры IP, год, месяц, день.
Вызываем этот скрипт на выполнение.
Показываем html страницу. Заметьте, что имя страницы формируется из IP адреса хоста и приставки «log_file.html»
Второй скрипт на shell
Данный скрипт будет реализовывать запуск cgi скиптра lightsquid и записывать результат выполнения (cgi скрипта) в отдельный файл. А потом инициализирует запуск другого скрипта с передачей в него параметров (о котором ниже).
Создаем фаил
nano /var/lightsquid/my_scr/index.sh

Делаем его исполняемым
chmod +x index.sh

Важное замечание, т.к. скрипт должен выполнятся из под правами пользователя www-data. То следует добавить в файл /etc/sudoers в блок # User privilege specification, такую вот строку:
www-data ALL=(ALL) NOPASSWD: /var/lightsquid/my_scr/index.sh

Далее записываем в файл сами данные
#!/bin/sh
$1 #ip адрес
$2 #год
$3 #месяц
$4 #день
str="log_file"
param="year="$2"&month="$3"&day="$4
LOG_FILE=/var/lightsquid/my_tmp/$1$str.html
{
export REQUEST_METHOD=GET
export QUERY_STRING=$param
/var/lightsquid/index.cgi
}> $LOG_FILE 2>&1
/var/lightsquid/my_scr/index.py $1

Разьясню:
Получаем параметры IP, год, день, месяц
В переменную записываем строку «log_file»
Формируем запрос и записываем его в переменную
Запускаем cgi скрипт в который передаем параметры, результат работы скрипта сохраняем в файл с именем IP хоста + «log_file.html»
Вызываем другой скрипт, передаем в него параметры.
Третий скрипт на Python
Т.к. сформированная страница содержим много лишнего и неправильные ссылки (например она ссылается на cgi который мы не можем перехватить), и прочее, надо этот файл подкорректировать. заменить все ссылки на наши и удалить пару строк.
Создаем файл:
nano /var/lightsquid/my_scr/index.py

Делаем файл исполняемым.
chmod +x index.sh

Записываем в него следующие данные:
#!/usr/bin/env python
#coding: utf-8
import sys #импортируем модуль sys он нам нужен чтобы читать передаваемые в скрипт параметры
ip_host = sys.argv[1] #считываем передаваемый IP адрес
#скрипт удаляет все строчки из файла сгенерированным lightsquid
seach_ip = ip_host
path_file = '/var/lightsquid/my_tmp/'+ ip_host + 'log_file.html' #путь до файла который редактируем
count_line = sum(1 for l in open(path_file, 'r')) #подсчитываем количество строк в файле
#len(open(path_file, 'r').readlines())            #второй способ посчитать количество строк в файле маленьком
file = open(path_file, 'r') # открыаем файл
lines = file.readlines()    # прочитываем строки в переменную
file.close()                #закрыаем файл
i = 0
for i in range(count_line): #цикл от 0 до количества строк в файле
if "day_detail.cgi" in lines[i]:  #если в строке найдено обращение к файлу cgi
        lines[i] = lines[i].replace('day_detail.cgi','day_detail.php') #немножко корректируем строку , чтобы ссылка обращалась к нашему скрипту
    if "group_detail.cgi" in lines[i]: #Ищем строку где вхождение этого словосочетания
        lines[i] = " <code><TD> </TD></code>"  #и приводим эту всю стоку к такому виду чтобы пользователи не могли смотреть группы
    if "index.cgi" in lines[i]:
        lines[i] = lines[i].replace('index.cgi','index.php')
    if "month_detail.cgi" in lines[i]:
        lines[i] = lines[i].replace('month_detail.cgi','month_detail.php')
    if "graph.cgi" in lines[i]:
        lines[i] = " "
    if "topsites.cgi" in lines[i]:
        lines[i] = lines[i].replace('topsites.cgi','topsites.php')
file = open('/var/lightsquid/my_tmp/' + ip_host + 'log_file.html','w')
file.writelines(lines)
file.close

Вообще в Python очень важно отступы (четыре пробела) для тех кто не в курсе :)
Поясню немного скрипт.
Получаем IP адрес пользователя который запросил статистику (этот IP адрес передается сюда из предыдущего скрипта).
Далее открываем файл сформированный cgi скриптом lightsquid'а
Узнаем сколько в нем строк
Делаем цикл, в этом цикле проверяем каждую строку на соответствие нашим требованиям. А именно изменяет пути ссылок с cgi на php, так же мне не нужно было чтобы пользователи не видели группы, поэтому я делаю этот столбец вообще пустым ().
Ну и все, записываем обратно уже обработанный файл.
И так, я разобрал один путь как все должно делаться. Но для полного функционирования нужно 27 скриптов. Конечно же, можно было все это дело впихнуть в одни скрипт и вообще получилось бы только 3, но я не стал себе усложнять жизнь. Ниже я хотел бы привести оставшиеся скрипты, но с коротким их разбором и без лишних действий их создания (т.к. подобные действия были описаны выше).
Остальные скипты
Все, что относится к bigfiles
bigfiles.php
<?php
$year = " {$_GET['year']}";
$month = " {$_GET['month']}";
$day = " {$_GET['day']}";
$ip_host = "{$_SERVER['REMOTE_ADDR']}";
$str = "sudo /var/lightsquid/my_scr/my_bigfiles.sh ".$ip_host.$year.$month.$day;
echo exec($str);
include "/var/lightsquid/my_tmp/".$ip_host."log_file.html"
?>

my_bigfiles.sh
#!/bin/sh
$1 #ip адрес
$2 #год
$3 #месяц
$4 #день
str="log_file"
param="year="$2"&month="$3"&day="$4"&user="$1
LOG_FILE=/var/lightsquid/my_tmp/$1$str.html
{
export REQUEST_METHOD=GET
export QUERY_STRING=$param
/var/lightsquid/bigfiles.cgi
}> $LOG_FILE 2>&1
/var/lightsquid/my_scr/my_bigfiles.py $1

my_bigfiles.py
#!/usr/bin/env python
#coding: utf-8
import sys #импортируем модуль sys он нам нужен чтобы читать передаваемые в скрипт параметры
ip_host = sys.argv[1] #считываем передаваемый IP адрес
seach_ip = ip_host
path_file = '/var/lightsquid/my_tmp/'+ ip_host + 'log_file.html' #путь до файла который редактируем
count_line = sum(1 for l in open(path_file, 'r')) #подсчитываем количество строк в файле
#len(open(path_file, 'r').readlines())            #второй способ посчитать количество строк в файле маленьком
file = open(path_file, 'r') # открыаем файл
lines = file.readlines()    # прочитываем строки в переменную
file.close()                #закрыаем файл
i = 0
for i in range(count_line): #цикл от 0 до количества строк в файле
    if "index.cgi" in lines[i]:
        lines[i] = lines[i].replace('index.cgi','index.php')
    if "user_detail.cgi" in lines[i]:
        lines[i] = lines[i].replace('user_detail.cgi','user_detail.php')
file = open('/var/lightsquid/my_tmp/' + ip_host + 'log_file.html','w')
file.writelines(lines)
file.close

Все что относится к day_detail
bigfiles.php
<?php
$year = " {$_GET['year']}";
$month = " {$_GET['month']}";
$day = " {$_GET['day']}";
$ip_host = "{$_SERVER['REMOTE_ADDR']}";
$str = "sudo /var/lightsquid/my_scr/my_day_detail.sh ".$ip_host.$year.$month.$day;
echo exec($str);
include "/var/lightsquid/my_tmp/".$ip_host."log_file.html"
?>

!/bin/sh
$1 #ip адрес
$2 #год
$3 #месяц
$4 #день
str="log_file"  #просто для описания файла
param="year="$2"&month="$3"&day="$4  #тут создаем параметр который потом передадим в скрипт
LOG_FILE=/var/lightsquid/my_tmp/$1$str.html  # место куда будем записывать результат выполнения скрипта
{
export REQUEST_METHOD=GET
export QUERY_STRING=$param
/var/lightsquid/day_detail.cgi
}> $LOG_FILE 2>&1
/var/lightsquid/my_scr/my_day_detail.py $1  #вызываем наш скрипт , которй обработает файл как надо ;)

#!/usr/bin/env python
#coding: utf-8
import sys #импортируем модуль sys он нам нужен чтобы читать передаваемые в скрипт параметры
ip_host = sys.argv[1] #считываем передаваемый IP адрес
#скрипт удаляет все строчки из файла сгенерированным lightsquid
#кроме строк где содержится ip пользователя который запросил статистику
seach_ip = ip_host
path_file = '/var/lightsquid/my_tmp/'+ ip_host + 'log_file.html' #путь до файла который редактируем
count_line = sum(1 for l in open(path_file, 'r')) #подсчитываем количество строк в файле
    #len(open(path_file, 'r').readlines())            #второй способ посчитать количество строк в файле маленьком
file = open(path_file, 'r') # открыаем файл
lines = file.readlines()    # прочитываем строки в переменную
file.close()                #закрыаем файл
for i in range(count_line): #цикл от 0 до количества строк в файле
    if "tr bgcolor=" + "\42" + "cornsilk" + "\42" in lines[i] or "tr bgcolor=" + "\42" + "beige" + "\42" in lines[i]:  #если в строке найдено вхождение цвета1 или цвета2 , то работаем дальше
        if seach_ip in lines[i+3]: continue   #если в строке найден нужнй ip адрес то все ок , если не найден то удаляе все это дело
        else:
            lines[i] = " "
            lines[i+1] = " "
            lines[i+2] = " "
            lines[i+3] = " "
            lines[i+4] = " "
            lines[i+5] = " "
            lines[i+6] = " "
            lines[i+7] = " "
            lines[i+8] = " "
            lines[i+9] = " "
            lines[i+10] = " "
            lines[i+11] = " "
            lines[i+12] = " "
            lines[i+13] = " "
            lines[i+14] = " "
            lines[i+15] = " "
            lines[i+16] = " "
    if "user_time.cgi" in lines[i]:
        lines[i] = lines[i].replace('user_time.cgi','user_time.php')
    if "index.cgi" in lines[i]:
        lines[i] = lines[i].replace('index.cgi','index.php')
    if "user_detail.cgi" in lines[i]:
        lines[i] = lines[i].replace('user_detail.cgi','user_detail.php')
    if "topsites.cgi" in lines[i]:
        lines[i] = " "
    if "bigfiles.cgi" in lines[i]:
        lines[i] = " "
    if "group_detail.cgi" in lines[i]: #Ищем строку где вхождение этого словосочетания
        lines[i] = " <TD> </TD>"  #и приводим эту всю стоку к такому виду чтобы пользователи не могли смотреть группы
    if "get.cgi" in lines[i]:
        lines[i] = lines[i].replace('get.cgi?png=datetime','datetime.png')
file = open('/var/lightsquid/my_tmp/' + ip_host + 'log_file.html','w')
file.writelines(lines)
file.close

Считаю нужным пояснить этот скрипт.
Скрипт получает IP пользователя который запросил данные.
Т.к. файл который генерирует cgi однотипный, я решил привязать поиск нужной мне строки к цвету строки, там их два "cornsilk" и "beige". Если находится такая строка где есть этот цвет, то мы перемещаемся на три строчки вниз, там есть IP адрес. Сравниваем тот или не тот, и если не тот то мы просто удаляем все 16 строк. (столько именно занимает описание одной строчки в отчете).
Все что относится к month_detail
month_detail.php
<?php
$year = " {$_GET['year']}";
$month = " {$_GET['month']}";
$mode = " {$_GET['mode']}";
$ip_host = "{$_SERVER['REMOTE_ADDR']}";
$str = "sudo /var/lightsquid/my_scr/my_month_detail.sh ".$ip_host.$year.$month.$mode;
echo exec($str);
include "/var/lightsquid/my_tmp/".$ip_host."log_file.html"
?>

my_month_detail.sh
!/bin/sh
$1 #ip адрес
$2 #год
$3 #месяц
$4 #параметр
str="log_file"  #просто для описания файла
param="year="$2"&month="$3"&mode="$4  #тут создаем параметр который потом передадим в скрипт
LOG_FILE=/var/lightsquid/my_tmp/$1$str.html  # место куда будем записывать результат выполнения скрипта
{
export REQUEST_METHOD=GET
export QUERY_STRING=$param
/var/lightsquid/month_detail.cgi
}> $LOG_FILE 2>&1
/var/lightsquid/my_scr/my_month_detail.py $1 $3  #вызываем наш скрипт , которй обработает файл как надо ;)

my_month_detail.py
#!/usr/bin/env python
#coding: utf-8
import sys #импортируем модуль sys он нам нужен чтобы читать передаваемые в скрипт параметры
ip_host = sys.argv[1] #считываем передаваемый IP адрес
month = sys.argv[2]
#скрипт удаляет все строчки из файла сгенерированным lightsquid
#кроме строк где содержится ip пользователя который запросил статистику
seach_ip = ip_host
path_file = '/var/lightsquid/my_tmp/'+ ip_host + 'log_file.html' #путь до файла который редактируем
count_line = sum(1 for l in open(path_file, 'r')) #подсчитываем количество строк в файле
    #len(open(path_file, 'r').readlines())            #второй способ посчитать количество строк в файле маленьком
file = open(path_file, 'r') # открыаем файл
lines = file.readlines()    # прочитываем строки в переменную
file.close()                #закрыаем файл
for i in range(count_line): #цикл от 0 до количества строк в файле
    if "tr bgcolor=" + "\42" + "cornsilk" + "\42" in lines[i] or "tr bgcolor=" + "\42" + "beige" + "\42" in lines[i]:  #если в строке найдено вхождение цвета1 или цвета2 , то работаем дальше
        if seach_ip in lines[i+3]: continue   #если в строке найден нужнй ip адрес то все ок , если не найден то удаляе все это дело
        else:
            if month == "all":  # тут проблема . если передается параметр определенного месяца , то количество стро одно , а если весь год , то количество строк другое
                lines[i] = " "
                lines[i+1] = " "
                lines[i+2] = " "
                lines[i+3] = " "
                lines[i+4] = " "
                lines[i+5] = " "
                lines[i+6] = " "
                lines[i+7] = " "
                lines[i+8] = " "
                lines[i+9] = " "
                lines[i+10] = " "
                lines[i+11] = " "
                lines[i+12] = " "
                lines[i+13] = " "
                lines[i+14] = " "
            else:
                lines[i] = " "
                lines[i+1] = " "
                lines[i+2] = " "
                lines[i+3] = " "
                lines[i+4] = " "
                lines[i+5] = " "
                lines[i+6] = " "
                lines[i+7] = " "
                lines[i+8] = " "
                lines[i+9] = " "
                lines[i+10] = " "
                lines[i+11] = " "
                lines[i+12] = " "
                lines[i+13] = " "
                lines[i+14] = " "
                lines[i+15] = " "
for i in range(count_line): #цикл от 0 до количества строк в файле
    if  lines[i]<> " ":
        if "index.cgi" in lines[i]:
            lines[i] = lines[i].replace('index.cgi','index.php')
        if "user_time.cgi" in lines[i]:
            lines[i] = lines[i].replace('user_time.cgi','user_time.php')
        if "graph.cgi" in lines[i]:
            lines[i] = '<TD></TD>'
        if "user_month.cgi" in lines[i]:
            lines[i] = lines[i].replace('user_month.cgi','user_month.php')
        if "user_detail.cgi" in lines[i]:
            lines[i] = lines[i].replace('user_detail.cgi','user_detail.php')
        if "get.cgi" in lines[i]:
            lines[i] = lines[i].replace('get.cgi?png=datetime','datetime.png')
        if "get.cgi" in lines[i]:
            lines[i] = lines[i].replace('get.cgi?png=graph','graph.png')
file = open('/var/lightsquid/my_tmp/' + ip_host + 'log_file.html','w')
file.writelines(lines)
file.close

В этом скрипте почти тоже самое что и было выше описано, только разница вот в чем, поступают разные параметры (год и месяц), поэтому и количество строк формирующие данные разные. в зависимости от получаемого параметра month = sys.argv[2] мы выбираем действие.
Все что относится к topsites
topsites.php
<?php
$year = " {$_GET['year']}";
$month = " {$_GET['month']}";
$day = " {$_GET['day']}";
$mode = " {$_GET['mode']}";
$order = " {$_GET['order']}";
$ip_host = "{$_SERVER['REMOTE_ADDR']}";
$str = "sudo /var/lightsquid/my_scr/my_topsites.sh ".$ip_host.$year.$month.$mode.$order;
echo exec($str);
include "/var/lightsquid/my_tmp/".$ip_host."log_file.html"
?>

my_topsites.sh
#!/bin/sh
$1 #ip адрес
$2 #год
$3 #месяц
$4 #день\параметр
$5 #параметр\другоще
$6 #другое
str="log_file"  #просто для описания файла
if [ $5 = "hits" -o $4 = "size" ]
then
param="year="$2"&month="$3"&day=&mode="$4"&order="$5
else
param="year="$2"&month="$3"&mode="$4  #тут создаем параметр который потом передадим в скрипт
fi
LOG_FILE=/var/lightsquid/my_tmp/$1$str.html  # место куда будем записывать результат выполнения скрипта
{
export REQUEST_METHOD=GET
export QUERY_STRING=$param
/var/lightsquid/topsites.cgi
}> $LOG_FILE 2>&1
/var/lightsquid/my_scr/my_topsites.py $1  #вызываем наш скрипт , которй обработает файл как надо ;)

Тут немного посложнее, тоже в скрипт передаются разные параметры, и в зависимости от принимаемых скриптом параметров он формирует запрос к cgi скрипту.
my_topsites.py
!/usr/bin/env python
#coding: utf-8
import sys #импортируем модуль sys он нам нужен чтобы читать передаваемые в скрипт параметры
ip_host = sys.argv[1] #считываем передаваемый IP адрес
seach_ip = ip_host
path_file = '/var/lightsquid/my_tmp/'+ ip_host + 'log_file.html' #путь до файла который редактируем
count_line = sum(1 for l in open(path_file, 'r')) #подсчитываем количество строк в файле
#len(open(path_file, 'r').readlines())            #второй способ посчитать количество строк в файле маленьком
file = open(path_file, 'r') # открыаем файл
lines = file.readlines()    # прочитываем строки в переменную
file.close()                #закрыаем файл
i = 0
for i in range(count_line): #цикл от 0 до количества строк в файле
    if "whousesite.cgi" in lines[i]: #Ищем строку где вхождение этого словосочетания
        lines[i] = " <TD> </TD>"  #и приводим эту всю стоку к такому виду чтобы пользователи не могли смотреть группы
    if "index.cgi" in lines[i]:
        lines[i] = lines[i].replace('index.cgi','index.php')
    if "topsites.cgi" in lines[i]:
        lines[i] = lines[i].replace('topsites.cgi','topsites.php')
file = open('/var/lightsquid/my_tmp/' + ip_host + 'log_file.html','w')
file.writelines(lines)
file.close

Все что относится к user_detail
user_detail.php
<?php
$year = " {$_GET['year']}";
$month = " {$_GET['month']}";
$day = " {$_GET['day']}";
$mode = " {$_GET['mode']}";
$ip_host = "{$_SERVER['REMOTE_ADDR']}";
$str = "sudo /var/lightsquid/my_scr/my_user_detail.sh ".$ip_host.$year.$month.$day.$mode;
echo exec($str);
include "/var/lightsquid/my_tmp/".$ip_host."log_file.html"
?>

user_detail.sh
#!/bin/sh
$1 #ip адрес
$2 #год
$3 #месяц
$4 #день\параметр
str="log_file"  #просто для описания файла
if [ $4 = "month" -o $4 = "year" ]
then
param="year="$2"&month="$3"&user="$1"&mode="$4  #тут создаем параметр который потом передадим в скрипт
else
param="year="$2"&month="$3"&day="$4"&user="$1
fi
LOG_FILE=/var/lightsquid/my_tmp/$1$str.html  # место куда будем записывать результат выполнения скрипта
{
export REQUEST_METHOD=GET
export QUERY_STRING=$param
/var/lightsquid/user_detail.cgi
}> $LOG_FILE 2>&1
/var/lightsquid/my_scr/my_user_detail.py $1  #вызываем наш скрипт , которй обработает файл как надо ;)

user_detail.py
#!/usr/bin/env python
#coding: utf-8
import sys #импортируем модуль sys он нам нужен чтобы читать передаваемые в скрипт параметры
ip_host = sys.argv[1] #считываем передаваемый IP адрес
seach_ip = ip_host
path_file = '/var/lightsquid/my_tmp/'+ ip_host + 'log_file.html' #путь до файла который редактируем
count_line = sum(1 for l in open(path_file, 'r')) #подсчитываем количество строк в файле
#len(open(path_file, 'r').readlines())            #второй способ посчитать количество строк в файле маленьком
file = open(path_file, 'r') # открыаем файл
lines = file.readlines()    # прочитываем строки в переменную
file.close()                #закрываем файл
i = 0
for i in range(count_line): #цикл от 0 до количества строк в файле
    if "index.cgi" in lines[i]:
        lines[i] = lines[i].replace('index.cgi','index.php')
    if "user_time.cgi" in lines[i]:
        lines[i] = lines[i].replace('user_time.cgi','user_time.php')
    if "bigfiles.cgi" in lines[i]:
        lines[i] = lines[i].replace('bigfiles.cgi','bigfiles.php')
    if "get.cgi" in lines[i]:
        lines[i] = lines[i].replace('get.cgi?png=datetime','datetime.png')
file = open('/var/lightsquid/my_tmp/' + ip_host + 'log_file.html','w')
file.writelines(lines)
file.close

Все что относится к user_month
user_month.php
<?php
$year = " {$_GET['year']}";
$month = " {$_GET['month']}";
$ip_host = "{$_SERVER['REMOTE_ADDR']}";
$str = "sudo /var/lightsquid/my_scr/my_user_month.sh ".$ip_host.$year.$month;
echo exec($str);
include "/var/lightsquid/my_tmp/".$ip_host."log_file.html"
?>

user_month.sh
#!/bin/sh
$1 #ip адрес
$2 #год
$3 #месяц
str="log_file"
param="year="$2"&month="$3"&user="$1
LOG_FILE=/var/lightsquid/my_tmp/$1$str.html
{
export REQUEST_METHOD=GET
export QUERY_STRING=$param
/var/lightsquid/user_month.cgi
}> $LOG_FILE 2>&1
/var/lightsquid/my_scr/my_user_month.py $1

user_month.py
#!/usr/bin/env python
#coding: utf-8
import sys #импортируем модуль sys он нам нужен чтобы читать передаваемые в скрипт параметры
ip_host = sys.argv[1] #считываем передаваемый IP адрес
#скрипт удаляет все строчки из файла сгенерированным lightsquid
#кроме строк где содержится ip пользователя который запросил статистику
seach_ip = ip_host
path_file = '/var/lightsquid/my_tmp/'+ ip_host + 'log_file.html' #путь до файла который редактируем
count_line = sum(1 for l in open(path_file, 'r')) #подсчитываем количество строк в файле
#len(open(path_file, 'r').readlines())            #второй способ посчитать количество строк в файле маленьком
file = open(path_file, 'r') # открыаем файл
lines = file.readlines()    # прочитываем строки в переменную
file.close()                #закрыаем файл
i = 0
for i in range(count_line): #цикл от 0 до количества строк в файле
    if "user_detail.cgi" in lines[i]:  #если в строке найдено обращение к файлу cgi
        lines[i] = lines[i].replace('user_detail.cgi','user_detail.php') #немножко корректируем строку , чтобы ссылка обращалась к нашему скрипту
    if "index.cgi" in lines[i]:
        lines[i] = lines[i].replace('index.cgi','index.php')
    if "graph.cgi" in lines[i]:
        lines[i] = lines[i].replace('graph.cgi','graph.php')
file = open('/var/lightsquid/my_tmp/' + ip_host + 'log_file.html','w')
file.writelines(lines)
file.close

Все что относится к user_time
user_time.php
<?php
$year = " {$_GET['year']}";
$month = " {$_GET['month']}";
$day = " {$_GET['day']}";
$mode = " {$_GET['mode']}";
$ip_host = "{$_SERVER['REMOTE_ADDR']}";
$str = "sudo /var/lightsquid/my_scr/my_user_time.sh ".$ip_host.$year.$month.$mode;
echo exec($str);
include "/var/lightsquid/my_tmp/".$ip_host."log_file.html"
?>

user_time.sh
#!/bin/sh
$1 #ip адрес
$2 #год
$3 #месяц
$4 #день\параметр
str="log_file"  #просто для описания файла
if [ $4 = "month" -o $4 = "year" ]
then
param="year="$2"&month="$3"&user="$1"&mode="$4  #тут создаем параметр который потом передадим в скрипт
else
param="year="$2"&month="$3"&day="$4"&user="$1
fi
LOG_FILE=/var/lightsquid/my_tmp/$1$str.html  # место куда будем записывать результат выполнения скрипта
{
export REQUEST_METHOD=GET
export QUERY_STRING=$param
/var/lightsquid/user_time.cgi
}> $LOG_FILE 2>&1
/var/lightsquid/my_scr/my_user_time.py $1  #вызываем наш скрипт , которй обработает файл как надо ;)

user_time.py
#!/usr/bin/env python
#coding: utf-8
import sys #импортируем модуль sys он нам нужен чтобы читать передаваемые в скрипт параметры
ip_host = sys.argv[1] #считываем передаваемый IP адрес
#скрипт удаляет все строчки из файла сгенерированным lightsquid
#кроме строк где содержится ip пользователя который запросил статистику
seach_ip = ip_host
path_file = '/var/lightsquid/my_tmp/'+ ip_host + 'log_file.html' #путь до файла который редактируем
count_line = sum(1 for l in open(path_file, 'r')) #подсчитываем количество строк в файле
#len(open(path_file, 'r').readlines())            #второй способ посчитать количество строк в файле маленьком
file = open(path_file, 'r') # открыаем файл
lines = file.readlines()    # прочитываем строки в переменную
file.close()                #закрыаем файл
i = 0
for i in range(count_line): #цикл от 0 до количества строк в файле
    if "index.cgi" in lines[i]:
        lines[i] = lines[i].replace('index.cgi','index.php')
file = open('/var/lightsquid/my_tmp/' + ip_host + 'log_file.html','w')
file.writelines(lines)
file.close

Итог
Ну вот и все, надеюсь ни кого ни утомил количеством скриптов. Надеюсь данная статья поможет кому то решить такой же вопрос, а возможно он и улучшить его.
===========
Источник:
habr.com
===========

Похожие новости: Теги для поиска: #_sistemnoe_administrirovanie (Системное администрирование), #_ubuntu, #_sistemnoe_administrirovanie (
Системное администрирование
)
Профиль  ЛС 
Показать сообщения:     

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы

Текущее время: 22-Ноя 04:08
Часовой пояс: UTC + 5