URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6147
[ Назад ]

Исходное сообщение
"траблы с perl-ом"

Отправлено Fire_Anton , 01-Фев-07 23:58 
Есть скрипт выдающий клиентам скорость:

#!/usr/bin/perl -w

use DBI;
use Time::localtime;
use POSIX ":sys_wait_h";

my $FIRE_SQL_SERVER = "localhost";
my $FIRE_SQL_LOGIN = "******";
my $FIRE_SQL_PASSWD = "*******";
my $FIRE_DBASE = "*******";
my $FIRE_AUTH_TABLE = "users";

my ($dbh,$sth,$count);
$dbh = DBI->connect("DBI:mysql:host=$FIRE_SQL_SERVER;database=$FIRE_DBASE","$FIRE_SQL_LOGIN","$FIRE_SQL_PASSWD") or &error_connection;
$sth = $dbh->prepare("SELECT * FROM $FIRE_AUTH_TABLE");
$sth->execute ();
while(@row = $sth->fetchrow_array()) {
        if ($row[4] == 1) {
        $numipfw = (20000+$row[3]);
            exec "ipfw del $numipfw"; exit;
        exec "ipfw $numipfw add pipe 100 ip from any to $row[19] out"; exit;
        exec "ipfw $numipfw add pipe 100 ip from $row[19] to any in"; exit;
        $numipfw = $numipfw + 10000;
            exec "ipfw del $numipfw"; exit;
            }
        if ($row[4] == 2) {
        $numipfw = (20000+$row[3]);
            exec "ipfw del $numipfw"; exit;
        exec "ipfw $numipfw add pipe 100 ip from any to $row[19] out"; exit;
        exec "ipfw $numipfw add pipe 100 ip from $row[19] to any in"; exit;
        $numipfw = $numipfw + 10000;
            exec "ipfw del $numipfw"; exit;
            }
                  }
    $dbh->disconnect;


И он просто не работает. Програмерры скажите пожалусто где трабла?


Содержание

Сообщения в этом обсуждении
"траблы с perl-ом"
Отправлено arto , 02-Фев-07 08:52 
>Есть скрипт выдающий клиентам скорость:
>
>#!/usr/bin/perl -w
>
>use DBI;
>use Time::localtime;

  что это такое?

>use POSIX ":sys_wait_h";
>
>my $FIRE_SQL_SERVER = "localhost";
>my $FIRE_SQL_LOGIN = "******";
>my $FIRE_SQL_PASSWD = "*******";
>my $FIRE_DBASE = "*******";
>my $FIRE_AUTH_TABLE = "users";
>
>my ($dbh,$sth,$count);
>$dbh = DBI->connect("DBI:mysql:host=$FIRE_SQL_SERVER;database=$FIRE_DBASE","$FIRE_SQL_LOGIN","$FIRE_SQL_PASSWD") or &error_connection;

  а это что такое?

>$sth = $dbh->prepare("SELECT * FROM $FIRE_AUTH_TABLE");
>$sth->execute ();
>while(@row = $sth->fetchrow_array()) {
>        if ($row[4] == 1)
>{
>     $numipfw = (20000+$row[3]);
>            
>exec "ipfw del $numipfw"; exit;

  зачем тут exit?


>     exec "ipfw $numipfw add pipe 100 ip
>from any to $row[19] out"; exit;
>     exec "ipfw $numipfw add pipe 100 ip
>from $row[19] to any in"; exit;
>     $numipfw = $numipfw + 10000;
>            
>exec "ipfw del $numipfw"; exit;
>   }
>        if ($row[4] == 2)
>{
>     $numipfw = (20000+$row[3]);
>            
>exec "ipfw del $numipfw"; exit;
>     exec "ipfw $numipfw add pipe 100 ip
>from any to $row[19] out"; exit;
>     exec "ipfw $numipfw add pipe 100 ip
>from $row[19] to any in"; exit;
>     $numipfw = $numipfw + 10000;
>            
>exec "ipfw del $numipfw"; exit;
>   }
>            
>      }
>    $dbh->disconnect;
>
>
>И он просто не работает. Програмерры скажите пожалусто где трабла?

  что говорит?


"траблы с perl-ом"
Отправлено NuINu , 02-Фев-07 10:11 
>>Есть скрипт выдающий клиентам скорость:
>>

>>while(@row = $sth->fetchrow_array()) {
>>        if ($row[4] == 1)
>>     exec "ipfw $numipfw add pipe 100 ip
>>from $row[19] to any in"; exit;
>>     $numipfw = $numipfw + 10000;

Операции работы с базой данных в принципе написаны НЕ ВЕРНО!!! никто не поручиться что при пересборке или модификации базы данных поля сохранят туже последовательность. Поэтому если хочешь работать с массивом ты должен определить какое поле какой индекс имеет.
Я работаю с именами, если это не критично и не парюсь.

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


"траблы с perl-ом"
Отправлено Fire_Anton , 02-Фев-07 13:49 

>Операции работы с базой данных в принципе написаны НЕ ВЕРНО!!! никто не
>поручиться что при пересборке или модификации базы данных поля сохранят туже
>последовательность. Поэтому если хочешь работать с массивом ты должен определить какое
>поле какой индекс имеет.
>Я работаю с именами, если это не критично и не парюсь.
>
>И в селекте выбирай не звездочку, а то что тебе нужно, последовательность
>полей, в принципе с этим можно работать по индексам полей, но
>опять таки при изменении запроса придется всю программу переделывать, и смотреть
>где поменялся индекс где не поменялся, уж не говоря о том
>что другой программист запутается.

В чем неверность?

Подскажи как верно.

Проблемма не работает не в селекте, а в exec он не выполняется и всё. как только убираю все exec и ставлю допустим print то всё в шиколаде.



"траблы с perl-ом"
Отправлено NuINu , 05-Фев-07 15:31 

>В чем неверность?
>
>Подскажи как верно.

Я уже сказал, в селекте прописывай имена полей которые ты хочешь получить!!

>
>Проблемма не работает не в селекте, а в exec он не выполняется
>и всё. как только убираю все exec и ставлю допустим print
>то всё в шиколаде.
Касаемо ехес!!!

    exec LIST
    exec PROGRAM LIST
               The "exec" function executes a system command and
               never returns-- use "system" instead of "exec" if
               you want it to return.  It fails and returns false

А если ничего вообще не происходит значит юзер, который вызывает первый ipwd не имеет прав на изменение правил файрвола


"траблы с perl-ом"
Отправлено Fire_Anton , 02-Фев-07 13:42 
>>Есть скрипт выдающий клиентам скорость:
>>
>>#!/usr/bin/perl -w
>>
>>use DBI;
>>use Time::localtime;
>
>  что это такое?

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

>
>>use POSIX ":sys_wait_h";
>>
>>my $FIRE_SQL_SERVER = "localhost";
>>my $FIRE_SQL_LOGIN = "******";
>>my $FIRE_SQL_PASSWD = "*******";
>>my $FIRE_DBASE = "*******";
>>my $FIRE_AUTH_TABLE = "users";
>>
>>my ($dbh,$sth,$count);
>>$dbh = DBI->connect("DBI:mysql:host=$FIRE_SQL_SERVER;database=$FIRE_DBASE","$FIRE_SQL_LOGIN","$FIRE_SQL_PASSWD") or &error_connection;
>
>  а это что такое?
>
>>$sth = $dbh->prepare("SELECT * FROM $FIRE_AUTH_TABLE");
>>$sth->execute ();
>>while(@row = $sth->fetchrow_array()) {
>>        if ($row[4] == 1)
>>{
>>     $numipfw = (20000+$row[3]);
>>            
>>exec "ipfw del $numipfw"; exit;
>
>  зачем тут exit?
>
>
>>     exec "ipfw $numipfw add pipe 100 ip
>>from any to $row[19] out"; exit;
>>     exec "ipfw $numipfw add pipe 100 ip
>>from $row[19] to any in"; exit;
>>     $numipfw = $numipfw + 10000;
>>            
>>exec "ipfw del $numipfw"; exit;
>>   }
>>        if ($row[4] == 2)
>>{
>>     $numipfw = (20000+$row[3]);
>>            
>>exec "ipfw del $numipfw"; exit;
>>     exec "ipfw $numipfw add pipe 100 ip
>>from any to $row[19] out"; exit;
>>     exec "ipfw $numipfw add pipe 100 ip
>>from $row[19] to any in"; exit;
>>     $numipfw = $numipfw + 10000;
>>            
>>exec "ipfw del $numipfw"; exit;
>>   }
>>            
>>      }
>>    $dbh->disconnect;
>>
>>
>>И он просто не работает. Програмерры скажите пожалусто где трабла?
>
>  что говорит?

ни говорит ни единой ошибки. просто не выполняе правила фаервола ошибка в exec. Но где именно ошибка не знаю.


"траблы с perl-ом"
Отправлено BigHo , 02-Фев-07 14:21 

вместо exec лучше было бы использовать system, а на стадии тестирования - на printf.

"траблы с perl-ом"
Отправлено Fire_Anton , 02-Фев-07 14:27 
>
>вместо exec лучше было бы использовать system, а на стадии тестирования -
>на printf.

printf - Я же написал, что так и делал на принтф работает класно.
Можно подсказать синтаксис system в примере.