Что нужно
- Установленная 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/
Добавить комментарий