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

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.
Итак, появилась у меня задача на работе: дать каждому пользователю возможность смотреть свои логи посещения интернета. Вроде кажется и задача такая — должна уже со всех сторон на любом форуме обсудится и как минимум должно быть готовое решение, как максимум пошаговая инструкция. Но ни того ни другого я не смог найти. Поэтому пришлось изобретать собственный велосипед. Ниже приведена почти пошаговая инструкция решения данной проблемы с использованием lightsquid и скриптов. Осторожно много скриптов.

Что нужно


  • Установленная Ubuntu server (лично в моей реализации это версия 13.04)
  • Установленный Apache2
  • Установленный настроенный и уже собирающий статистику squid (в моем случае это 2.7)


Предварительно оговорим условия:


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


Начинаем


Нужен сам lighsquid

Первым делом скачае LightSquid
wget http://downloads.sourceforge.net/project/lightsquid/lightsquid/1.8/lightsquid-1.8.tgz


Разархивируем. Я предпочел разархивировать в корень /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



Итог



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


Интересные статьи

Интересные статьи

Субботний вечер омрачен скандалом - сайт не работает, провайдер негодяй, админы - не специалисты, а сервера - решето. Вызов принят, или почему при всей нелюбви к 1С-Битри...
Видеореклама набирает все больше оборотов: пользователи лучше реагируют на видео, чем на статические картинки и баннеры, а рекламные системы постоянно увеличивают количес...
В статье перечислены особенности двух популярных форматов сериализации, которые следует учитывать архитектору, выбирая один из них. Читать далее
В этой статье мы рассмотрим, как система управления 1С-Битрикс справляется с большими нагрузками. Данный вопрос особенно актуален сегодня, когда электронная торговля начинает конкурировать по обороту ...
Что объединяет Trello, Gmail, Aviasales и Google Keep? В каждом из них есть Drag-&-Drop-компоненты, которые можно перетаскивать мышкой. Использование этих компонентов делает сайты по-настояще...