Страница 1 из 1

Perl отказывается работать с Mysql

Добавлено: 2010-02-18 23:14:17
strom
Запускаю скрипт

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

# perl -c trafcount.pl
Can't locate Mysql.pm in @INC (@INC contains: /usr/local/lib/perl5/5.8.9/BSDPAN /usr/local/lib/perl5/site_perl/5.8.9/mach /usr/local/lib/perl5/site_perl/5.8.9 /usr/local/lib/perl5/5.8.9/mach /usr/local/lib/perl5/5.8.9 .) at trafcount.pl line 13.
BEGIN failed--compilation aborted at trafcount.pl line 13.
далее ставлю p5-DBD-mysql41

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

# cd /usr/ports/databases/p5-DBD-mysql41
# make install clean
устанавливается без ругани

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

Manifying blib/man3/Bundle::DBD::mysql.3
===>  Installing for p5-DBD-mysql41-4.010
===>   p5-DBD-mysql41-4.010 depends on file: /usr/local/lib/perl5/site_perl/5.8.9/mach/DBI.pm - found
===>   p5-DBD-mysql41-4.010 depends on file: /usr/local/bin/perl5.8.9 - found
===>   p5-DBD-mysql41-4.010 depends on file: /usr/local/bin/perl5.8.9 - found
===>   Generating temporary packing list
===>  Checking if databases/p5-DBD-mysql41 already installed
Files found in blib/arch: installing files in blib/lib into architecture dependent library tree
Installing /usr/local/lib/perl5/site_perl/5.8.9/mach/auto/DBD/mysql/mysql.so
Installing /usr/local/lib/perl5/site_perl/5.8.9/mach/auto/DBD/mysql/mysql.bs
Installing /usr/local/lib/perl5/site_perl/5.8.9/mach/DBD/mysql.pm
Installing /usr/local/lib/perl5/site_perl/5.8.9/mach/DBD/mysql/GetInfo.pm
Installing /usr/local/lib/perl5/site_perl/5.8.9/mach/DBD/mysql/INSTALL.pod
Installing /usr/local/lib/perl5/site_perl/5.8.9/mach/Bundle/DBD/mysql.pm
Installing /usr/local/lib/perl5/5.8.9/man/man3/DBD::mysql.3
Installing /usr/local/lib/perl5/5.8.9/man/man3/DBD::mysql::INSTALL.3
Installing /usr/local/lib/perl5/5.8.9/man/man3/Bundle::DBD::mysql.3
===>   Compressing manual pages for p5-DBD-mysql41-4.010
===>   Registering installation for p5-DBD-mysql41-4.010
===>  Cleaning for p5-DBD-mysql41-4.010
далее и опять

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

# perl -c trafcount.pl
Can't locate Mysql.pm in @INC (@INC contains: /usr/local/lib/perl5/5.8.9/BSDPAN /usr/local/lib/perl5/site_perl/5.8.9/mach /usr/local/lib/perl5/site_perl/5.8.9 /usr/local/lib/perl5/5.8.9/mach /usr/local/lib/perl5/5.8.9 .) at trafcount.pl line 13.
BEGIN failed--compilation aborted at trafcount.pl line 13.
Пытался изменить регистр буквы c

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

use Mysql;
на

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

use mysql;

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

# perl -c trafcount.pl
trafcount.pl syntax OK
далее

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

# perl trafcount.pl
Can't locate object method "Connect" via package "Mysql" at trafcount.pl line 27.
подскажите, в чем проблема?

вот сам скрипт

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

!/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;

Re: Perl отказывается работать с Mysql

Добавлено: 2010-02-18 23:56:38
hizel
скрипт древний как гавно мамонта ибо уже пяток лет в perl используют единый DBI интерфейс для всех БД

Re: Perl отказывается работать с Mysql

Добавлено: 2010-02-19 0:30:09
thefree
Поставь с цпана mysql-3 модуль ... Мб зааедется

Re: Perl отказывается работать с Mysql

Добавлено: 2010-02-19 17:38:21
strom
покурил man на DBI интерфейс, поменял строки скрипта и получилось

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

use DBI;
$dbh = DBI->connect("DBI:mysql:$db_database:$db_host", $db_user, $db_password);
$dbh->do("$MySQL_query") or die "Не могу выполнить:sth->errstr";
пока все работает, спасибо.

Re: Perl отказывается работать с Mysql

Добавлено: 2010-02-20 0:05:58
Alex Keda
та прям как говно...
лет пять назад я его писал...