Русский
Русский
English
Статистика
Реклама

Работаем с 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="$4LOG_FILE=/var/lightsquid/my_tmp/$1$str.html{export REQUEST_METHOD=GETexport 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-8import sys #импортируем модуль sys он нам нужен чтобы читать передаваемые в скрипт параметрыip_host = sys.argv[1] #считываем передаваемый IP адрес#скрипт удаляет все строчки из файла сгенерированным lightsquidseach_ip = ip_hostpath_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 = 0for 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="$1LOG_FILE=/var/lightsquid/my_tmp/$1$str.html{export REQUEST_METHOD=GETexport 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-8import sys #импортируем модуль sys он нам нужен чтобы читать передаваемые в скрипт параметрыip_host = sys.argv[1] #считываем передаваемый IP адресseach_ip = ip_hostpath_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 = 0for 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=GETexport 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-8import sys #импортируем модуль sys он нам нужен чтобы читать передаваемые в скрипт параметрыip_host = sys.argv[1] #считываем передаваемый IP адрес#скрипт удаляет все строчки из файла сгенерированным lightsquid#кроме строк где содержится ip пользователя который запросил статистикуseach_ip = ip_hostpath_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=GETexport 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-8import sys #импортируем модуль sys он нам нужен чтобы читать передаваемые в скрипт параметрыip_host = sys.argv[1] #считываем передаваемый IP адресmonth = sys.argv[2]#скрипт удаляет все строчки из файла сгенерированным lightsquid#кроме строк где содержится ip пользователя который запросил статистикуseach_ip = ip_hostpath_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" ]thenparam="year="$2"&month="$3"&day=&mode="$4"&order="$5elseparam="year="$2"&month="$3"&mode="$4  #тут создаем параметр который потом передадим в скриптfiLOG_FILE=/var/lightsquid/my_tmp/$1$str.html  # место куда будем записывать результат выполнения скрипта{export REQUEST_METHOD=GETexport 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-8import sys #импортируем модуль sys он нам нужен чтобы читать передаваемые в скрипт параметрыip_host = sys.argv[1] #считываем передаваемый IP адресseach_ip = ip_hostpath_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 = 0for 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" ]thenparam="year="$2"&month="$3"&user="$1"&mode="$4  #тут создаем параметр который потом передадим в скриптelseparam="year="$2"&month="$3"&day="$4"&user="$1fiLOG_FILE=/var/lightsquid/my_tmp/$1$str.html  # место куда будем записывать результат выполнения скрипта{export REQUEST_METHOD=GETexport 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-8import sys #импортируем модуль sys он нам нужен чтобы читать передаваемые в скрипт параметрыip_host = sys.argv[1] #считываем передаваемый IP адресseach_ip = ip_hostpath_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 = 0for 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="$1LOG_FILE=/var/lightsquid/my_tmp/$1$str.html{export REQUEST_METHOD=GETexport 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-8import sys #импортируем модуль sys он нам нужен чтобы читать передаваемые в скрипт параметрыip_host = sys.argv[1] #считываем передаваемый IP адрес#скрипт удаляет все строчки из файла сгенерированным lightsquid#кроме строк где содержится ip пользователя который запросил статистикуseach_ip = ip_hostpath_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 = 0for 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" ]thenparam="year="$2"&month="$3"&user="$1"&mode="$4  #тут создаем параметр который потом передадим в скриптelseparam="year="$2"&month="$3"&day="$4"&user="$1fiLOG_FILE=/var/lightsquid/my_tmp/$1$str.html  # место куда будем записывать результат выполнения скрипта{export REQUEST_METHOD=GETexport 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-8import sys #импортируем модуль sys он нам нужен чтобы читать передаваемые в скрипт параметрыip_host = sys.argv[1] #считываем передаваемый IP адрес#скрипт удаляет все строчки из файла сгенерированным lightsquid#кроме строк где содержится ip пользователя который запросил статистикуseach_ip = ip_hostpath_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 = 0for 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
К списку статей
Опубликовано: 24.03.2021 18:04:11
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Системное администрирование

Ubuntu

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru