Перейти к содержимому
Калькуляторы

ipfw, perl и mysql

Всем здраствуйте.

У нас в сети стоит шейпер, правила для него написаны с отдельном скрипте. Сказали что там траблы с груповыми pipe-ами. Например для абонентов с пакетом 128 кбит\с выделена ширина канала в 2 мб. для 512 кбит\с выделено 4 мб например. Так вот стоит задача убрать эти разграничения, чтоб все отрезали от общего канала. Проблема в том что скрипт написан на перле, а перл я нифига незнаю (а учить перл ради ради одного скрипта очень долго (!)и непродуктивно). Так вот кто знает как подойти к этой проблеме и как её исправить, буду очень благодарен !!!! Файрвол ipfw2, OC FreeBSD 5.5. Вот скрипт :

 

#!/usr/bin/perl

#

# a KoMeHTaPuu B KOI8-R

#

 

 

$unit="Kbit/s";

 

$install_dir="/fw/";

#$install_dir="/home/gh/";

$pidfile = $install_dir . 'fw.pid';

 

$ext_if='net0';

$int_if='net1';

$type='1';

 

$deny=1;

 

$start_pipe_num=2000;

 

$to_from_table=100;

 

$group_pipes_step=1000;

 

# MySQL

$user='fw-april';

$password='fghtkm';

$srv='DBI:mysql:billing_new:172.16.0.1:3306';

 

#

@mynet=("172.17.",

"172.16.");

 

#print @mynet;

 

#exit;

#

#

#

use Getopt::Long;

use DBI;

use User::pwent;

use DynaLoader;

######################################################

#

GetOptions ( "all" => \$all,

"pipe" => \$pipe,

"help" => \$help,

"debug" => \$debug );

######################################################

# for debug

if ($debug)

{

$ipfw="echo ipfw -q";

$add="echo ipfw -q add";

$del="echo ipfw -q delete";

$fwpipe="echo ipfw -q pipe";

$table="echo ipfw -q table";

$fw="/sbin/ipfw -q -f";

} else {

$ipfw="/sbin/ipfw -q";

$add="/sbin/ipfw -q add";

$del="/sbin/ipfw -q delete";

$fwpipe="/sbin/ipfw -q pipe";

$table="/sbin/ipfw -q table";

$fw="/sbin/ipfw -q -f";

}

######################################################

# ?

if (-e $pidfile) {

# PID- ,

unless (open(PIDFILE, $pidfile)) {

# , PID

print ("ERROR: old pid not read! \n");

exit(1);

}

my $oldpid=<PIDFILE>;

close PIDFILE;

# , PID

if ($oldpid > 1 && kill(0,$oldpid)) {

#

print ("ERROR: already running!");

exit(1);

} else {

# , ,

print ("WARNING: $pidfile found but fw.pl already die \n");

}

}

# PID-

open(PID, ">$pidfile") or die;

print PID $$;

close(PID);

######################################################

#

if ($help)

{

@help_text = ("

 

 

--all: reload all fw rules

--pipe: reload pipes

--help: this is text

 

");

print @help_text;

 

exit

}

######################################################

#

$deny = ($unlim_max_out_pipe - 1);

 

if ($all or $test)

{

@start_cmd= ("

sysctl -w net.inet.ip.fw.one_pass=0

 

ipfw -qf flush

ipfw -qf pipe flush

 

 

");

@stop_cmd= ("

$add 65534 deny all from any to any

");

 

system @start_cmd;

system @stop_cmd;

 

 

}

######################################################

$dbh = DBI->connect($srv, $user, $password, { RaiseError => 1, AutoCommit => 1}) or die;

 

#

$sql_groups_count="SELECT COUNT(num) FROM tariff_groups";

$sth_groups_count = $dbh->prepare($sql_groups_count);

$sth_groups_count->execute();

@groups_count=$sth_groups_count->fetchrow_array;

$groups_count=@groups_count[0];

 

 

 

 

# < >

for ($group_count=1; $group_count<=$groups_count; $group_count++) {

# --all

if ($all) {

@cmd_flush_table=("

$table $group_count flush

");

system @cmd_flush_table;

}

 

 

#

if ($all) {

$sql_to_from_net="SELECT net FROM to_from WHERE `group` = '$group_count'";

$sth_to_from_net = $dbh->prepare($sql_to_from_net);

$sth_to_from_net->execute();

$to_from=$to_from_table + $group_count;

# to_from

if ($all) {

@cmd_flush_to_from=("

$table $to_from flush

");

system @cmd_flush_to_from;

}

# < >

while (@row_to_from_net = $sth_to_from_net->fetchrow_array) {

$net=@row_to_from_net[0];

 

if ($net != "any") {

@cmd_to_from=("

$table $to_from add $net

");

system @cmd_to_from;

} else {

$any_group=$group_count;

}

} # </ >

}

 

# tariffs

$sql_tariffs="SELECT num, start, stop, pipe1, pipe2, pipe3, pipe4 FROM tariffs WHERE tariff_group = '$group_count'";

$sth_tariffs = $dbh->prepare($sql_tariffs);

$sth_tariffs->execute();

# < >

while (@row_tariffs = $sth_tariffs->fetchrow_array) {

$tariff_num=@row_tariffs[0];

$tariff_start=@row_tariffs[1];

$tariff_stop=@row_tariffs[2];

$tariff_pipe1=@row_tariffs[3];

$tariff_pipe2=@row_tariffs[4];

$tariff_pipe3=@row_tariffs[5];

$tariff_pipe4=@row_tariffs[6];

$sql_packages="SELECT num FROM packages WHERE `$group_count` = '$tariff_num'";

$sth_packages = $dbh->prepare($sql_packages);

$sth_packages->execute();

# < >

while (@row_packages = $sth_packages->fetchrow_array) {

$package_num=@row_packages[0];

#

# < >

$size = @mynet;

for ($n = 0; $n < $size; ++$n) {

if ($pipe) {

$sql_users="SELECT num, ip, old_package, mode FROM users WHERE package = '$package_num' AND con = 'ch' AND ip like '$mynet[$n]%' ORDER BY num ASC";

} else {

$sql_users="SELECT num, ip FROM users WHERE package = '$package_num' AND mode = '1' AND ip like '$mynet[$n]%' ORDER BY num ASC";

}

$sth_users = $dbh->prepare($sql_users);

$sth_users->execute();

# < >

 

while (@row_users = $sth_users->fetchrow_array) {

$user_num=@row_users[0];

$user_ip=@row_users[1];

 

if ($pipe) {

$old_package=@row_users[2];

$user_mode=@row_users[3];

 

if ($work_ip != $user_ip) {

for ($ngroup_count=1; $ngroup_count<=$groups_count; $ngroup_count++) {

#print ("$ngroup_count \n");

#

$sql_old_tariff="SELECT `$ngroup_count` FROM packages WHERE num = '$old_package'";

$sth_old_tariff = $dbh->prepare($sql_old_tariff);

$sth_old_tariff->execute();

@old_tariff = $sth_old_tariff->fetchrow_array;

$old_tariff=@old_tariff[0];

 

 

#print ("$old_tariff $sql_old_tariff \n");

if ($old_tariff != 0) {

 

@cmd_delete_user=("

$table $ngroup_count delete $user_ip

");

system @cmd_delete_user;

$work_ip = $user_ip;

}

}

}

}

 

 

if ($all or ($pipe and $user_mode==1)) {

#

@cmd_add_user=("

$table $group_count add $user_ip $tariff_num

");

system @cmd_add_user;

}

} # </ >

} # </ >

} # </ >

 

#print ("$group_count \n");

 

 

 

if ( $group_count == 1) {

$pipe_num = $start_pipe_num;

$allow_num = $start_pipe_num + ($group_pipes_step * 0.5);

# $done=1;

} else {

$pipe_num = $start_pipe_num + $group_pipes_step * ($group_count - 1);

$allow_num = $pipe_num + ($group_pipes_step * 0.5);

}

$o_pipe_num = $pipe_num + 2 * $tariff_num;

$i_pipe_num = $o_pipe_num - 1;

 

$o_allow_num = $allow_num + 2 * $tariff_num;

$i_allow_num = $o_allow_num - 1;

 

($M, $H) = (localtime)[1,2];

# $H = 7;

# $M = 3;

 

if (($tariff_start == $H and $M <= 5) or ($tariff_stop + 1 == $H and $M <= 5)) {

$pipe_i=$tariff_pipe3;

$pipe_o=$tariff_pipe4;

} else {

$pipe_i=$tariff_pipe1;

$pipe_o=$tariff_pipe1;

}

#print ("$i_pipe_num \n");

#

if ($all and !$pipe) {

print ("$i_pipe_num \n");

if (!$any_group) {

@cmd_add_pipe=("

$add $i_pipe_num pipe $i_pipe_num all from table'($to_from)' to table'($group_count, $tariff_num)' in via $ext_if

$fwpipe $i_pipe_num config mask dst-ip 0x00ffffff bw $pipe_i$unit

$add $i_allow_num allow all from table'($to_from)' to table'($group_count, $tariff_num)' in via $ext_if

$add $o_pipe_num pipe $o_pipe_num all from table'($group_count, $tariff_num)' to table'($to_from)' out via $ext_if

$fwpipe $o_pipe_num config mask src-ip 0x00ffffff bw $pipe_o$unit

$add $o_allow_num allow all from table'($group_count, $tariff_num)' to table'($to_from)' out via $ext_if

"); } else {

@cmd_add_pipe=("

$add $i_pipe_num pipe $i_pipe_num all from any to table'($group_count, $tariff_num)' in via $ext_if

$fwpipe $i_pipe_num config mask dst-ip 0x00ffffff bw $pipe_i$unit

$add $i_allow_num allow all from any to table'($group_count, $tariff_num)' in via $ext_if

$add $o_pipe_num pipe $o_pipe_num all from table'($group_count, $tariff_num)' to any out via $ext_if

$fwpipe $o_pipe_num config mask src-ip 0x00ffffff bw $pipe_o$unit

$add $o_allow_num allow all from table'($group_count, $tariff_num)' to any out via $ext_if

");

}

} elsif ($pipe and !$all) {

 

if ($tariff_pipe3 and $tariff_pipe4) {

#print ("$tariff_num $pipe_i \n");

if (($tariff_start == $H and $M <= 5) or ($tariff_stop == $H and $M <= 5)) {

#

@cmd_add_pipe=("

$fwpipe $i_pipe_num config mask dst-ip 0x00ffffff bw $pipe_i$unit

$fwpipe $o_pipe_num config mask src-ip 0x00ffffff bw $pipe_o$unit

");

}

}

 

}

system @cmd_add_pipe;

 

 

 

 

 

} # </ >

 

if ($all) {

$sql_groups_pipe="SELECT pipe1, pipe2, skipto FROM tariff_groups WHERE num = '$group_count'";

print ("!grp $group_count $any_group \n");

$sth_groups_pipe=$dbh->prepare($sql_groups_pipe);

$sth_groups_pipe->execute();

@row_groups_pipe = $sth_groups_pipe->fetchrow_array;

$end_pipe1=@row_groups_pipe[0];

$end_pipe2=@row_groups_pipe[1];

$skipto=@row_groups_pipe[2];

#print ("skipto $skipto \n");

$rule_num_end_skipto = $start_pipe_num + ($group_pipes_step * $group_count) - 1;

 

if ( $group_count == 1) {

$end_pipe = $start_pipe_num + (($group_pipes_step * 0.5) * $group_count);

 

} else {

$end_pipe = $end_pipe + $group_pipes_step;

 

}

 

$rule_o_num_end_pipe = $end_pipe;

$rule_i_num_end_pipe = $end_pipe - 1;

 

if (!$any_group) {

@cmd_add_end_pipe=("

$add $rule_o_num_end_pipe pipe $rule_o_num_end_pipe all from table'($group_count)' to table'($to_from)' out via $ext_if

$add $rule_i_num_end_pipe pipe $rule_i_num_end_pipe all from table'($to_from)' to table'($group_count)' in via $ext_if

$fwpipe $rule_i_num_end_pipe config bw $end_pipe1$unit

$fwpipe $rule_o_num_end_pipe config bw $end_pipe2$unit

"); } else {

@cmd_add_end_pipe=("

$add $rule_o_num_end_pipe pipe $rule_o_num_end_pipe all from table'($group_count)' to any out via $ext_if

$add $rule_i_num_end_pipe pipe $rule_i_num_end_pipe all from any to table'($group_count)' in via $ext_if

$fwpipe $rule_i_num_end_pipe config bw $end_pipe1$unit

$fwpipe $rule_o_num_end_pipe config bw $end_pipe2$unit

");

}

# system @cmd_add_end_pipe;

#

print ("skipto $skipto \n");

 

if ($skipto != 0) {

$end_skipto = $start_pipe_num + ($group_pipes_step * ($skipto - 1));

$rule_end_skipto = $start_pipe_num - 1 + ($group_pipes_step * $group_count);

@cmd_end_skipto=("

$add $rule_end_skipto skipto $end_skipto all from any to any

");

system @cmd_end_skipto;

 

}

 

}

 

} # </ >

 

# Σ

for ($n = 0; $n < $size; ++$n) {

$sql_null_con="UPDATE users SET con = '' WHERE ip like '$mynet[$n]%'";

$sth_null_con=$dbh->prepare($sql_null_con);

$sth_null_con->execute();

}

######################################################

unlink $pidfile;

exit(0);

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

У нас в сети стоит шейпер, правила для него написаны с отдельном скрипте. Сказали что там траблы с груповыми pipe-ами.
Фраза интересная, жаль, я ее не понял. Но если сказали, то может и решат сразу?
Проблема в том что скрипт написан на перле, а перл я нифига незнаю (а учить перл ради ради одного скрипта очень долго (!)и непродуктивно).
Ерунда. Всякий уважающий себя администратор обязан знать перл хотя бы на уровне чтения. И в приведенном Вами скрипте нет ничего сложного, другое дело, что он требует времени на разбор. Так что Вам осталось либо потратить немного времени на азы Перла, либо ждать, пока кто-то потратит свое время на разбор Вашего скрипта. Вообще Ваш вопрос есть стандартное задание, за которое на фрилансерских сайтах платят деньги. А исходя из объема скрипта, могу Вас уверить, что бесплатно свое время на него будет тратить только настоящий альтруист :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Проще пристрелить чем лечить...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

+1

проще написать на чём знаеш вывод в стдаут и приём в стдин и забить если перл осилить сложно.

 

а вообще подобный "функцонал" и шел осилит. ИМХО

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.