Помогите слегка переделать скрипт на Perl

И всё прочее, что касается HTML
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Mapk
проходил мимо
Сообщения: 6
Зарегистрирован: 2009-07-02 8:08:19

Помогите слегка переделать скрипт на Perl

Непрочитанное сообщение Mapk » 2009-07-02 8:53:33

Доброго времени суток!
Имеется скрипт на Perl многоуважаемого Лисяры из статьи ipacctd - подсчёт траффика через IPFW:

Код: Выделить всё

#!/usr/bin/perl -w

# вводим переменные
# MySQL - хост где БД
$db_host = 'localhost';
# MySQL юзер
$db_user = 'ipacctd';
# MySQL пароль
$db_password = 'ipacctd';
# MySQL база данных
$db_database = 'ipacctd';
# подрубаем модуль для работы с MySQL
use Mysql;
# время - тока чтоб год достать...
use Time::localtime;

# достаём время
# Год
$year = localtime->year() + 1900;
# Месяц (идиотский язык, чтобы достать месяц в виде
# двузначного числа приходиться изгаляться через жопу...)
# Если знаете способ лучше - подскажите, поменяю...
$month = `date '+%m'`;
$month = substr($month,0,2);

# Коннектимся к MySQL
$dbh = Mysql->Connect($db_host,$db_database,$db_user,$db_password);

# Вызываем внешние программы по сохранению траффика
system("killall -1 ipacctd && sleep 2");

#use strict;
if(open(RC_CONF,"/etc/rc.conf")){
my @data = reverse <RC_CONF>;
chomp @data;
close RC_CONF;
foreach my $str (@data)
    {
    # разбираем rc.conf
    next if $str =~ /^#/ or $str =~ /^\s*$/;
    $str =~ /^\s+/;
    $str =~ /\s+$/;
    my($var_name,$var_value) = split(/=/, $str);
    if($var_name eq 'ipacctd_rules')
        {
        $var_value =~ s#^\s*(['"]?)(.*)\1#$2#;
        foreach my $interface (split (/\s+/, $var_value))
            {
            # шуршим по интерфейсам
            # Создаём таблицу для постоянного хранения траффика
            # строим кверю к MySQL
$MySQL_query = "CREATE TABLE IF NOT EXISTS `" . $interface . "_" . $year . "`(
            `unic_id` INT(16) NOT NULL auto_increment,
            `date` DATE NOT NULL,
            `time` TIME NOT NULL,
            `unix_time` INT(12) NOT NULL,
            `from_IP` CHAR(16) NOT NULL,
            `port_from_IP` INT(8) NOT NULL,
            `to_IP` CHAR(16) NOT NULL,
            `port_to_IP` INT(8) NOT NULL,
            `protocol` CHAR(12) NOT NULL,
            `bytes` INT(16) NOT NULL,
            `paketov` INT(8) NOT NULL,
            PRIMARY KEY (`unic_id`),
            KEY `date`(`date`),
            KEY `unix_time`(`unix_time`)
            ) ENGINE=MyISAM COMMENT='Traffic for " . $interface . "-interface'";
            # Делаем запрос к БД, если неудачный - помираем с ошибкой
            $dbh->Query("$MySQL_query") or die $Mysql::db_errstr;
            # строим путь к файлу с траффиком
            $file_path = "/var/log/traffic_" . $interface . ".log";
            # открываем файло
            open TRAFFIC,"$file_path";
            # Разбираем построчно
            while (<TRAFFIC>)
                {
                # убираем лишние пробелы
                #tr/\s+/ /s;
                # Разбиваем по пробелам на переменные
                ($from_IP,$port_from_IP,$to_IP,$port_to_IP,$protocol,
                $bytes,$paketov) = split(/\s+/,$_);
                # пихаем траффик в БД

                $MySQL_query = "INSERT INTO `" . $interface . "_" . $year . "`
                (`date`,`time`,`unix_time`,`from_IP`,`port_from_IP`,`to_IP`,
                `port_to_IP`,`protocol`,`bytes`,`paketov`) VALUES (DATE(NOW()),
                TIME(NOW()),UNIX_TIMESTAMP(),'" . $from_IP . "',
                '" . $port_from_IP . "','" . $to_IP . "','" . $port_to_IP . "',
                '" . $protocol . "','" . $bytes . "','" . $paketov . "')";
                # Делаем запрос к БД, если неудачный - помираем с ошибкой
                $dbh->Query("$MySQL_query") or die $Mysql::db_errstr;
                }
            # создаём директории
            system("mkdir -p /var/traffic/" . $year . "/" . $month);
            # переносим траффик
            $otkuda = "/var/log/traffic_" . $interface . ".log";
        $kuda = "/var/traffic/" . $year . "/" . $month . "/summary." . $interface;
            system("cat $otkuda >> $kuda");
            # очищаем файло
            system("cat /dev/null > $otkuda");


            # создаём таблицу, где будет храниться траффик

            }
        }
    }
}

# выходим
1;
Скрипт в MySQL созадет соответсвующую бд по текущему году, из-за чего база со временем получается оч емкая (по кр мере для меня это так), так вот вопрос: чего изменить чтобы скриптик создавал новую базу каждый месяц и называл ее соответсвенно??....чтобы можно было спокойно удалять уже ненужные базы за старые месяца..
Познаний в Perl нет никаких, но методом пристального взгляда вроде определил, что все должно заработать, если изменить пару строк вот так:
c

Код: Выделить всё

$MySQL_query = "CREATE TABLE IF NOT EXISTS `" . $interface . "_" . $year . "`(
на

Код: Выделить всё

$MySQL_query = "CREATE TABLE IF NOT EXISTS `" . $interface . "_" . $year  ."_". $month ."`(
а также

Код: Выделить всё

 $MySQL_query = "INSERT INTO `" . $interface . "_" . $year . "`
на

Код: Выделить всё

 $MySQL_query = "INSERT INTO `" . $interface . "_" . $year . "_". $month ."`
При этом новая бд по месяцу создалась, но в нее ничего скрипт не добавляет..
Что я упустил или где еще чего подкрутить??
Заранее благодарен!

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: Помогите слегка переделать скрипт на Perl

Непрочитанное сообщение ProFTP » 2009-07-02 8:57:58

нафига создавать еще одну базу?

если нужно удалить старое, то удали через скрипт, например, все что поже чем некотрое время - значит надо удалить

ну типо так:

Код: Выделить всё

$MySQL_query = "CREATE TABLE IF NOT EXISTS `" . $interface . "_" . $year . "_".$month."`(
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Mapk
проходил мимо
Сообщения: 6
Зарегистрирован: 2009-07-02 8:08:19

Re: Помогите слегка переделать скрипт на Perl

Непрочитанное сообщение Mapk » 2009-07-02 9:16:28

ProFTP писал(а):нафига создавать еще одну базу?

если нужно удалить старое, то удали через скрипт, например, все что поже чем некотрое время - значит надо удалить
Согласен! Вариант! Подскажи (накатай :oops: ) пожалуйста скрипт тады такой или как запрос сделать в phpMyAdmin, чтобы из базы удалить все записы до такой-то даты и буду переодически подчищать))) Лучше бы конечно скриптик, чтобы дело это как-то автоматизировать :roll:
ProFTP писал(а): ну типо так:

Код: Выделить всё

$MySQL_query = "CREATE TABLE IF NOT EXISTS `" . $interface . "_" . $year . "_".$month."`(
Я чего-то не понял, что ты этим хотел скзаать :pardon: :st:

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: Помогите слегка переделать скрипт на Perl

Непрочитанное сообщение ProFTP » 2009-07-02 9:26:30

Mapk писал(а): Я чего-то не понял, что ты этим хотел скзаать :pardon: :st:
Mapk писал(а):вопрос: чего изменить чтобы скриптик создавал новую базу каждый месяц и называл ее соответсвенно??

Код: Выделить всё

$MySQL_query = "CREATE TABLE IF NOT EXISTS `" . $interface . "_" . $year . "_".$month."`(

Код: Выделить всё

$MySQL_query = "CREATE TABLE IF NOT EXISTS `" . $interface . "_" . $year ."`(
содавать новую базу, чтобы было видно какой месяц
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Mapk
проходил мимо
Сообщения: 6
Зарегистрирован: 2009-07-02 8:08:19

Re: Помогите слегка переделать скрипт на Perl

Непрочитанное сообщение Mapk » 2009-07-02 10:08:06

ProFTP, т.е. проще говоря, судя из моего первого поста, вторую строку менять не нужно и все будет работать* ? :roll:
Повторюсь, что при изменнии обоих строк чет перестает идти запись в БД :(
*По идее

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: Помогите слегка переделать скрипт на Perl

Непрочитанное сообщение ProFTP » 2009-07-02 12:39:31

подожди, надо смотреть, я предложил чтобы поменять название базы, ну нужно где-то еще навренео поменять, я не знаю как там оно работает у тебя...

базу можно использовать одну
удалить то что меньше определенного времени:

Код: Выделить всё

delete from база where unix_time > время_в_секундах
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Mapk
проходил мимо
Сообщения: 6
Зарегистрирован: 2009-07-02 8:08:19

Re: Помогите слегка переделать скрипт на Perl

Непрочитанное сообщение Mapk » 2009-07-02 13:47:48

:Yahoo!: Главную проблему решил. ProFTP, спасибо за помощь!
ProFTP писал(а): удалить то что меньше определенного времени:

Код: Выделить всё

delete from база where unix_time > время_в_секундах
Так, это для phpMyAdmin актуально ? или в скрипт запихать нужно ? В общем как использовать ? :pardon: