[Системное администрирование] Работаем с lightsquid или как сделать индивидуальную статистику для пользователей
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Итак, появилась у меня задача на работе: дать каждому пользователю возможность смотреть свои логи посещения интернета. Вроде кажется и задача такая — должна уже со всех сторон на любом форуме обсудится и как минимум должно быть готовое решение, как максимум пошаговая инструкция. Но ни того ни другого я не смог найти. Поэтому пришлось изобретать собственный велосипед. Ниже приведена почти пошаговая инструкция решения данной проблемы с использованием 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
===========
Похожие новости:
- [Системное администрирование, Умный дом, Инженерные системы] Управление наружным освещением
- [Системное администрирование, IT-инфраструктура, Серверное администрирование] Восстановить контроллер домена Active Directory из пепла: вебинар по Quest Recovery Manager
- [Системное администрирование] How to Disable Password Request or Account Password in Windows 10, 8 or 7
- [Системное администрирование, Софт, Периферия, IT-компании] Microsoft исправила баги печати в более старых версиях Windows
- [Информационная безопасность, Системное администрирование, Сетевые технологии, Беспроводные технологии, Сетевое оборудование] Разработка кибер-безопасной информационно-технической системы высшего учебного заведения
- [Системное администрирование, Софт, Периферия, IT-компании] Microsoft вновь выдала патч против проблем с печатью в Windows 10
- [Системное администрирование, Сетевые технологии, Тестирование мобильных приложений, Дизайн мобильных приложений] Обзор мобильного приложения Drive
- [Системное администрирование, IT-инфраструктура, Серверное администрирование] Групповые политики (GPO) Active Directory: разбираемся почему это важно и как ими управлять в GPOAdmin
- [Системное администрирование, Софт, Периферия, IT-компании] Microsoft приостановила выкатку патча патча патча проблем с печатью Windows 10
- [Системное администрирование, Софт, Периферия, IT-компании] Microsoft выпустила еще один срочный патч для исправления проблем печати в Windows 10
Теги для поиска: #_sistemnoe_administrirovanie (Системное администрирование), #_ubuntu, #_sistemnoe_administrirovanie (
Системное администрирование
)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 04:08
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Итак, появилась у меня задача на работе: дать каждому пользователю возможность смотреть свои логи посещения интернета. Вроде кажется и задача такая — должна уже со всех сторон на любом форуме обсудится и как минимум должно быть готовое решение, как максимум пошаговая инструкция. Но ни того ни другого я не смог найти. Поэтому пришлось изобретать собственный велосипед. Ниже приведена почти пошаговая инструкция решения данной проблемы с использованием lightsquid и скриптов. Осторожно много скриптов. Что нужно
Предварительно оговорим условия:
Начинаем Нужен сам 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 =========== Похожие новости:
Системное администрирование ) |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 04:08
Часовой пояс: UTC + 5