BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 28 мар 2024, 19:04

Часовой пояс: UTC + 5 часов [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 34 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: FreeBSD Manad, использующий таблицы
СообщениеДобавлено: 23 ноя 2010, 20:15 
Не в сети

Зарегистрирован: 16 ноя 2007, 16:11
Сообщения: 829
Карма: 49
Кто-то уже сделал?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeBSD Manad, использующий таблицы
СообщениеДобавлено: 24 ноя 2010, 10:19 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Я вот как раз сейчас этим и озадачиваюсь, хочу перевести свою сеть с pptp на прямые адреса и manad, до тех пор пока не появится isg или что-то подобное. Но сразу же встает очень острый вопрос - поддержка актуальности, а именно как восстановить актуальность таблиц в случае перезагрузки роутера?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeBSD Manad, использующий таблицы
СообщениеДобавлено: 24 ноя 2010, 12:14 
Не в сети

Зарегистрирован: 16 ноя 2007, 16:11
Сообщения: 829
Карма: 49
Нас пока устраивает та актуальность, которая есть в манаде сейчас. Нас перестает устраивать производительность ipfw на большом количестве правил.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeBSD Manad, использующий таблицы
СообщениеДобавлено: 24 ноя 2010, 12:33 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Может я что-то не дочитал, но как таковой актуальности то в манаде я и не увидел. В случае перезагрузки роутера все правила будут сброшены и возможности актуализировать нет. Или я не прав?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeBSD Manad, использующий таблицы
СообщениеДобавлено: 24 ноя 2010, 12:40 
Не в сети

Зарегистрирован: 16 ноя 2007, 16:11
Сообщения: 829
Карма: 49
borisk писал(а):
Может я что-то не дочитал, но как таковой актуальности то в манаде я и не увидел. В случае перезагрузки роутера все правила будут сброшены и возможности актуализировать нет. Или я не прав?

Нас это устраивает на текущий момент и в обозримом будущем.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeBSD Manad, использующий таблицы
СообщениеДобавлено: 25 ноя 2010, 13:39 
Не в сети

Зарегистрирован: 16 ноя 2007, 16:11
Сообщения: 829
Карма: 49
FreeBSD manad с поддержкой таблиц и с обеспечением совместимости со старым вариантом (с правилами) проходит тестовую эксплуатацию под реальной нагрузкой. Если кому-то срочно интересно, то могу выложить сюда, иначе будет через месяц выложен на вики.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeBSD Manad, использующий таблицы
СообщениеДобавлено: 25 ноя 2010, 14:43 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Интересно. Как раз сейчас пишу свой, смысл тогда изобретать велосипед :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeBSD Manad, использующий таблицы
СообщениеДобавлено: 25 ноя 2010, 14:51 
Не в сети

Зарегистрирован: 16 ноя 2007, 16:11
Сообщения: 829
Карма: 49
borisk писал(а):
Интересно. Как раз сейчас пишу свой, смысл тогда изобретать велосипед :)

За основу взят стандартный манад, который не устраивает вас своей "неактуальностью". ;)
Все равно выкладывать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeBSD Manad, использующий таблицы
СообщениеДобавлено: 25 ноя 2010, 14:53 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Выкладывайте, неактуальность, в принципе я собираюсь решить через скрипты сохранения и восстановления таблиц.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeBSD Manad, использующий таблицы
СообщениеДобавлено: 25 ноя 2010, 15:08 
Не в сети

Зарегистрирован: 16 ноя 2007, 16:11
Сообщения: 829
Карма: 49
За основу взят http://wiki.bgbilling.ru/index.php/FreeBSD_manad,_понимающий_изменения_правил_в_тарифах
Обеспечена совместимость со старым вариантом.
Коротко об алгоритме:
Используются теги [OPEN], [CLOSE], но, в отличие от Линуксового манада, эти теги обрабатывает скрип шлюза, а не манад.
При использовании данного манада без тегов [OPEN], [CLOSE] на манад, в команде remove, будут отправлены все правила, но манад, при обработке remove, понимает только команды table. Докручивание обработчика remove до уровня понимания других команд ipfw без использования [OPEN], [CLOSE] черевато.

IPFW:
Код:
34500 pipe tablearg ip from any to table(1) out
34500 pipe tablearg ip from table(2) to any in
34500 skipto 60000 ip from table(1) to any
59999 deny ip from any to any via vlan90 out


Команды:

Код:
[DEFAULT]
[OPEN]
pipe {PA} config bw ${speed}
pipe {PB} config bw ${speed}
<LOOP>
table 1 delete {A}
table 2 delete {A}
table 1 add {A} {PA}
table 2 add {A} {PB}
</LOOP>
[/OPEN]
[CLOSE]
<LOOP>
table 1 delete {A}
table 2 delete {A}
</LOOP>
[/CLOSE]
[/DEFAULT]


Скрипт:
Код:
import java.io.*;
import java.net.*;
import java.util.*;
import bitel.billing.common.module.ipn.*;
import bitel.billing.server.ipn.bean.*;
import ru.bitel.bgbilling.modules.ipn.server.bean.command.*;
 
protected void doSync()
{
        host = gate.getHost();
        port = gate.getPort();
        gid = gate.getId();
 
        if ( log.isDebugEnabled() )
        {
            log.debug( gid + " gate: " + host + ":" + port );
        }
 
 
        try
        {
                socket = new Socket( host, port );
                out = new PrintWriter( socket.getOutputStream(), true );
                isr = new InputStreamReader( socket.getInputStream() );
                in = new BufferedReader( isr );
            log.info("I test Manad");
                out.println( "testRID" );
                kods = in.readLine();

        if ( log.isDebugEnabled() )
        {
            log.debug( gid + " Test => " + kods + "\n" );
        }
            log.info( gid + " Test => " + kods + "\n" );
 
                // список открытых договоров с шлюза
                gateRules = new HashMap( 5, 5 );
                st = new StringTokenizer( kods );
                while ( st.hasMoreTokens() )
                {
                  sp=st.nextToken().split("-");
                  if(sp.length==2) gateRules.put( new Integer( sp[0] ),(sp[1]==null)?null:new Integer(sp[1]) );
                  else gateRules.put( new Integer( sp[0] ),null);
                }
 
                for( i = 0; i < statusList.size(); i++ )
                {
                        status = statusList.get(i);
                        cid = status.contractId;
 
                        // флаг того то правило есть на шлюзе
                        flag = false;
                   ruleChanged=false;
                        // правило для этого договора есть на шлюзе
                        if ( gateRules.containsKey( cid ) )
                        {
                                //      если правило есть а юзер заблокирован - удаляем правило
                                if ( status.status > 0 )
                                {
                                        rule = generateRule( status ,false);
                                        command = "remove\t" + cid.intValue() + "\t" + rule;
                                        out.println( command );
                                     if ( log.isDebugEnabled() ) {
                                     log.debug( gid + " " + command );
                                        }
                              log.info( gid + " " + command );
                                 }else{
                           // правило есть и юзер открыт - проверяем тип правила
                           rid=gateRules.get(cid);
                           if(rid!=null && status.ruleType==null) ruleChanged=true;
                           if(rid==null && status.ruleType!=null) ruleChanged=false; // совместимость со старым manad
                           if(rid!=null && status.ruleType!=null && !rid.equals(status.ruleType.getId())) ruleChanged=true;
                           if(ruleChanged){
                                     if ( log.isDebugEnabled() ) {
                                     log.debug( gid + " rule changed");
                                        }
                                 log.info( gid + " rule changed");
                           }
                           }                                               
 
                                flag = true;
                                gateRules.remove( cid );
                        }
 
                        // правила нет, а юзер открыт, правило есть, но было изменение типа правила
                        if ( (!flag &&
                                status.status == IPNContractStatus.STATUS_OPEN ) ||(ruleChanged && status.status == IPNContractStatus.STATUS_OPEN ))
                        {
                                rule = generateRule( status, true);
 
                                command = "add\t" + cid.intValue() + "\t" + rule; // в случае изменения manad затрет старые правила ipfw
                          if( status.ruleType != null ) command+=" // RULE"+status.ruleType.getId();
                  
                                out.println( command );
 
                            if ( log.isDebugEnabled() )
                {
                    log.debug( gid + " " + command );
                }
   log.info( gid + " " + command );


                        }
                }
 
                in.close();
                out.close();
                socket.close();
        }
        catch ( e )
        {
                throw new RuntimeException ( e );
        }
}
 
private generateRule( status ,open)
{
        rule = null;
 
        // пользовательское правило, без типа
        if( status.ruleType == null )
        {
                rule = status.rule.getRuleText();
        }
        // типизированное правило
        else
        {       
 
                ruleText = GateCommandUtil.getRule( status.gateType, status.ruleType );
                rule =  GateCommandUtil.generateRule( ruleText,  status.rule.getRuleText(), null, status.ruleType );                     
        }
 
 
        rule = rule.replaceAll( "\r", "" );
        rule = rule.replaceAll( "\n", "|" );
 if(open){
   ib=rule.indexOf("[OPEN]")+7;
    ie=rule.indexOf("[/OPEN]")-1;
   if(ib>-1&&ie>-1) rule=rule.substring(ib,ie);
}else{
   ib=rule.indexOf("[CLOSE]")+8;
    ie=rule.indexOf("[/CLOSE]")-1;
   if(ib>-1&&ie>-1) rule=rule.substring(ib,ie);
}
        return    rule;
}


Манад:
Код:
#!/usr/bin/perl

use POSIX;
use IO::Socket;
use IO::Select;
use Socket;
use Fcntl;
use Tie::RefHash;


$debug = 1;
$port = 4444;
$ipfw = "/sbin/ipfw";
$rule_start = 35000;
$pipe_start = 800;
$set = 10;

# База данных правил клиентов
%CLRULE = ();
%CLRULE_ID = ();

# База данных используемых номеров правил
%USERULEN = ();
%CLUSERULEN = ();

# База данных используемых номеров труб
%USEPIPEN = ();
%CLUSEPIPEN = ();

# Начать с пустыми буферами
%inbuffer   = ();
%outbuffer   = ();
%ready      = ();

tie %ready, 'Tie::RefHash';

# Прослушивать порт
$server = IO::Socket::INET->new( LocalPort => $port, Listen => 10 )
   or die "Can`t make server socket: $@\n";

nonblock( $server );

$SIG{INT} = sub { $server->close(); exit( 0 ); };

$select = IO::Select->new( $server );

$pid = getpid();

open(FILE, ">/var/run/manad.pid");
print FILE $pid;
close(FILE);

# Устанавливаем новый root каталог для процесса
# chroot( $homedir ) or die "Couldn`t chroot to $homedir: $!\n";

# Главный цикл: проверка чтения/принятия, проверка записи,
# проверка готовности к работе

while( 1 )
{
   my $client;
   my $rv;
   my $data;

   # Проверить наличие новой информации на имеющихся подключениях

   # Есть ли что-нибудь для чтения или подтверждения?   
   foreach $client ( $select->can_read( 1 ) )
   {
      if ( $client == $server )
      {
         # Принять новое подключение
         $client = $server->accept();
         $select->add( $client );
         nonblock( $client );
      }      
      else
      {
         # Прочитать данные
         $data = '';
         $rv = $client->recv( $data, POSIX::BUFSIZ, 0 );

         unless( defined( $rv ) && length $data )
         {
            # Это должен быть конец файла, поэтому закрываем клиента
            delete $inbuffer{$client};
            delete $outbuffer{$client};
            delete $ready{$client};

            $select->remove( $client );
            close $client;
            next;
         }

         $inbuffer{$client} .= $data;

         # Проверить, говорят ли данные в буфере или только что прочитанные
         # данные о наличии полного запроса, ожидающего выполнения. Если да -
         # заполнить $ready{$client} запросами, ожидающими обработки.
         while( $inbuffer{$client} =~ s/(.*\n)// ) { push( @{$ready{$client}}, $1 ) }
      }
   }
   
   # Есть ли полные запросы для обработки?
   foreach $client ( keys %ready ) { handle( $client ); }

   # Сбрасываем буферы?
   foreach $client ( $select->can_write( 1 ) )
   {
      # Пропустить этого слиента, если нам нечего сказать
      next unless $outbuffer{$client};
                block( $client );
      $rv = $client->send( $outbuffer{$client}, 0 );
      nonblock( $client );
      unless( defined $rv )
      {
         # Пожаловаться, но следовать дальше
         warn "I was told I could write? but I can`t.\n";
         next;
      }
      if ( $rv == length $outbuffer{$client} || $! == POSIX::EWOULDBLOCK )
      {
         substr( $outbuffer{$client}, 0, $rv ) = '';
         delete $outbuffer{$client} unless length $outbuffer{$client};
      }
      else
      {
         # Не удалось записать все данные и не из-за блокировки.
         # Очистить буферы и следовать дальше.
         delete $inbuffer{$client};
         delete $outbuffer{$client};
         delete $ready{$client};

         $select->remove($client);
         close($client);
         next;
      }
   }
}

# handle( $socket ) обрабатывает все необработанные запросы
# для клиента $client
sub handle
{
   # Запрос находится в $ready{$client}
   # Отправить вывод в $outbuffer{$client}
   my $client = shift;
   my $request;

   foreach $request ( @{$ready{$client}} )
   {
      print "\nrequest=".$request if ( $debug == 1 );

      if ( $request =~ /^testRID/ )
      {
         my $open_client = "";
         foreach my $kod ( keys %CLRULE )
            { $open_client .= $open_client eq "" ? $kod : " ".$kod;
            ($CLRULE_ID{$kod} ne "")?$open_client.="-".$CLRULE_ID{$kod}:"";
            }
         $outbuffer{$client} .= $open_client."\n";
      }
      elsif ( $request =~ /^test/ )
      {
         my $open_client = "";
         foreach my $kod ( keys %CLRULE )
            { $open_client .= $open_client eq "" ? $kod : " ".$kod;}
         $outbuffer{$client} .= $open_client."\n";
      }
      elsif ( $request =~ /^add\t([0-9]+)\t(.*)/ )
      {
         my ($skip,$rid)=split /RULE/,$2;
         print "\n=rule".$rid."\n" if ( $debug == 1 );
         my ($kod, $rule) = ($1, $2);
         &delete_rule( $kod ) if ( exists $CLRULE{$kod} );
         &add_rule( $kod, $rule,$rid ) if ( !exists $CLRULE{$kod} );
      }
      elsif ( $request =~ /^remove\t([0-9]+)\t(.*)/ )
      {
         &delete_rule( $1,$2 ) if ( exists $CLRULE{$1} );
      }
   }

   delete $ready{$client};
}

# nonblock( $socket ) переводит сокет в неблокирующий режим
sub nonblock
{
   my $socket = shift;
   my $flags;

   $flags = fcntl( $socket, F_GETFL, 0 )
      or die "Can`t get flags for socket: $!\n";
   fcntl( $socket, F_SETFL, $flags | O_NONBLOCK )
      or die "Can`t make socket nonblocking: $!\n";
}

sub block
{
   my $socket = shift;
   my $flags;

   $flags = fcntl( $socket, F_GETFL, 0 )
      or die "Can`t get flags for socket: $!\n";
   fcntl( $socket, F_SETFL, $flags ^ O_NONBLOCK )
      or die "Can`t make socket nonblocking: $!\n";
}

sub add_rule
{
   my $kod = $_[0];
   my $rule = $_[1];
   my $rid = $_[2];
   my %N = ();
   my %P = ();

   $CLRULE{$kod} = $rule;
   $CLRULE_ID{$kod} = $rid;

   while ( $rule =~ /\{N([AB0-9]+)\}/ )
   {
      my $n = $1;
      my $i = $rule_start - 1;
      my $j = 0;
      while( 1 )
      {
         while( 1 )
         {
            $i++;
            last if ( !exists $USERULEN{$i} );
         }
         $j++;
         last if ( $j == $n );
         last if ( $n == 0 );
      }
      $USERULEN{$i} = $kod;
      $N{$n} = $i;
      $rule =~ s/\{N$n\}/$N{$n}/g;
   }

   while ( $rule =~ /\{P([AB0-9]+)\}/ )
   {
      my $p = $1;
      my $i = $pipe_start - 1;
      my $j = 0;
      while( 1 )
      {
         while( 1 )
         {
            $i++;
            last if ( !exists $USEPIPEN{$i} );
         }
         $j++;
         last if ( $j == $p );
         last if ( $p == 0 );
      }
      $USEPIPEN{$i} = $kod;
      $P{$p} = $i;
      $rule =~ s/\{P$p\}/$P{$p}/g;
   }

   foreach my $i ( keys %N ) { $CLUSERULEN{$kod} .= exists $CLUSERULEN{$kod} && $CLUSERULEN{$kod} ne "" ? " ".$N{$i} : $N{$i}; }
   foreach my $i ( keys %P ) { $CLUSEPIPEN{$kod} .= exists $CLUSEPIPEN{$kod} && $CLUSEPIPEN{$kod} ne "" ? " ".$P{$i} : $P{$i}; }

   $rule =~ s/\|pipe/; \/sbin\/ipfw -q pipe /g;
   $rule =~ s/\|table/; \/sbin\/ipfw -q table /g;
   $rule =~ s/\|add ([0-9]+)/; \/sbin\/ipfw -q add $1 set $set /g;
        $rule =~ s/^pipe/\/sbin\/ipfw -q pipe /g;
        $rule =~ s/^table/\/sbin\/ipfw -q table /g;       
   $rule =~ s/^add ([0-9]+)/\/sbin\/ipfw -q add $1 set $set /g;
   $rule =~ s/\|/;/g;
#   print "$ipfw -q $rule\n" if ( $debug == 1 );
#   $err = `$ipfw -q $rule`;
   print "$rule\n" if ( $debug == 1 );
   $err = `$rule`;

}

sub delete_rule
{
   my $kod = $_[0];
   my $rule= $_[1];

   if ( exists $CLRULE{$kod} )
   {
      $rule =~ s/\|table/; \/sbin\/ipfw -q table /g;
          $rule =~ s/^table/\/sbin\/ipfw -q table /g;       
      $rule =~ s/\|/;/g;
#      print "$ipfw -q $rule\n" if ( $debug == 1 );
#      $err = `$ipfw -q $rule`;
      print "$rule\n" if ( $debug == 1 );
      $err = `$rule`;


      my @N = split( / /, $CLUSERULEN{$kod} );

      foreach my $i ( @N )
      {
         print "$ipfw delete $i\n" if ( $debug == 1 );
         $err = `$ipfw delete $i`;
         delete $USERULEN{$i};
      }

      my @P = split( / /, $CLUSEPIPEN{$kod} );

      foreach my $i ( @P )
      {
         print "$ipfw pipe delete $i\n" if ( $debug == 1 );
         $err = `$ipfw pipe delete $i`;
         delete $USEPIPEN{$i};
      }
      delete $CLUSERULEN{$kod};
      delete $CLUSEPIPEN{$kod};
      delete $CLRULE_ID{$kod};
      delete $CLRULE{$kod};
   }
}


Последний раз редактировалось vdd 26 ноя 2010, 13:54, всего редактировалось 3 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeBSD Manad, использующий таблицы
СообщениеДобавлено: 25 ноя 2010, 15:11 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Спасибо, поизучаю.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeBSD Manad, использующий таблицы
СообщениеДобавлено: 25 ноя 2010, 15:15 
Не в сети

Зарегистрирован: 16 ноя 2007, 16:11
Сообщения: 829
Карма: 49
На всякий случай добавил правила IPFW.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeBSD Manad, использующий таблицы
СообщениеДобавлено: 25 ноя 2010, 16:08 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Я что-то упустил в документации? Вот что будет транслироваться {PA} и {PB} ?
Хотя я вижу у себя немного другую задумку. Есть уже готовый набор pipe, c mask src-ip и mask-dst ip в который направляются соответствующие таблицы. Соответственно задача манада - только передать комманды add table и remove table с соответствующими номерами pipe, задаваемых в типе правила.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeBSD Manad, использующий таблицы
СообщениеДобавлено: 25 ноя 2010, 16:54 
Не в сети

Зарегистрирован: 16 ноя 2007, 16:11
Сообщения: 829
Карма: 49
borisk писал(а):
Я что-то упустил в документации? Вот что будет транслироваться {PA} и {PB} ?

Номера пайпов
borisk писал(а):
Хотя я вижу у себя немного другую задумку. Есть уже готовый набор pipe, c mask src-ip и mask-dst ip в который направляются соответствующие таблицы. Соответственно задача манада - только передать комманды add table и remove table с соответствующими номерами pipe, задаваемых в типе правила.

Думали об этом. Нас не устроило следующее:
1) Нужно где-то хранить и поддерживать в актуальном состоянии соответствие пайпа и скорости. У нас есть клиенты с персональными скоростями и это тоже придется учитывать;
2) У нас есть клиенты, имеющие больше одного IP.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeBSD Manad, использующий таблицы
СообщениеДобавлено: 25 ноя 2010, 17:05 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
>Номера пайпов
Ну так я и говорю, что нашел в документации только форму PN - где N цифра, а не буква, поэтому смысл PA и PB не понятен

>Больше одного ip у клиента
У меня тоже. И в этом случае, как я понял из документации на выходе мы получим правило вида
...ip1...|...ip2...|...ip3...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeBSD Manad, использующий таблицы
СообщениеДобавлено: 25 ноя 2010, 17:09 
Не в сети

Зарегистрирован: 16 ноя 2007, 16:11
Сообщения: 829
Карма: 49
borisk писал(а):
>Номера пайпов
Ну так я и говорю, что нашел в документации только форму PN - где N цифра, а не буква, поэтому смысл PA и PB не понятен

Каюсь, ввел в заблуждение. Это наша примочка: http://wiki.bgbilling.ru/index.php/Изменения_в_manad_для_работы_с_одним_pipe_на_множество_IP_адресов

borisk писал(а):
>Больше одного ip у клиента
У меня тоже. И в этом случае, как я понял из документации на выходе мы получим правило вида
...ip1...|...ip2...|...ip3...

Да, но в нашем случае все три адреса попадут в один пайп. А в вашем на каждый адрес будет склонирован отдельный пайп.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeBSD Manad, использующий таблицы
СообщениеДобавлено: 25 ноя 2010, 17:16 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
>Да, но в нашем случае все три адреса попадут в один пайп. А в вашем на каждый адрес будет склонирован отдельный пайп.

Ну да, у меня так и задумывалось. Но ход ваших мыслей я понял, спасибо. Теперь буду осмысливать что именно мне надо и как это лучше реализовать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeBSD Manad, использующий таблицы
СообщениеДобавлено: 25 ноя 2010, 17:22 
Не в сети

Зарегистрирован: 16 ноя 2007, 16:11
Сообщения: 829
Карма: 49
Может быть целесообразнее не дублировать функционал, а сосредоточится на вопросе актуальности?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeBSD Manad, использующий таблицы
СообщениеДобавлено: 25 ноя 2010, 19:20 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Вопрос актуальности я, для себя, вижу так: с периодичностью N минут таблицы сохраняются в файлы, при старте manad их подгружает. Возможна небольшая потеря актуальности. Другой вариант вообще без потерь - слегка модернизируем скрипт манада, и после каждого изменения конфигурации он сбрасывает содержимое таблиц в файлы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeBSD Manad, использующий таблицы
СообщениеДобавлено: 25 ноя 2010, 19:45 
Не в сети

Зарегистрирован: 16 ноя 2007, 16:11
Сообщения: 829
Карма: 49
borisk писал(а):
Вопрос актуальности я, для себя, вижу так: с периодичностью N минут таблицы сохраняются в файлы, при старте manad их подгружает. Возможна небольшая потеря актуальности. Другой вариант вообще без потерь - слегка модернизируем скрипт манада, и после каждого изменения конфигурации он сбрасывает содержимое таблиц в файлы.


Мы пока воздерживаемся от такой схемы по следующей причине:
Хранить и загружать при старте существующего манада нужно не только таблицы, но и все массивы.
Если хранить только таблицы, то если во время оффлайна шлюза произойдет блокировка абонента, то возникнет рассинхронизация между состоянием шлюза в биллинге и реальным состоянием доступа.
Можно, конечно, при первом получении правил с биллинга отфлушить предварительно загруженные таблицы, но как это все не выглядит надежно.

Наше видение такое: при запуске манад дергает биллинг за ниточку и биллинг выполняет внеочередную синхронизацию шлюза.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeBSD Manad, использующий таблицы
СообщениеДобавлено: 25 ноя 2010, 19:49 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
А такое возможно? Если да, то такой вариант конечно предпочтительней. Есть еще один вариант - через внешнее хранилище, например mysql. При этом скриптовый шлюз на стороне биллинга вносит туда все изменения, а manad восстанавливает их при загрузке.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeBSD Manad, использующий таблицы
СообщениеДобавлено: 25 ноя 2010, 20:00 
Не в сети

Зарегистрирован: 16 ноя 2007, 16:11
Сообщения: 829
Карма: 49
1) Можно создать свой action и вызвать его через http. В action вызвать необходимые методы для инициации синхронизации конкретного шлюза.
2) На первое время можно сэмулировать команду клиентского интерфейса "выполнить сейчас" на задаче "Проверка шлюзов IPN" в планировщике.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeBSD Manad, использующий таблицы
СообщениеДобавлено: 26 ноя 2010, 10:27 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
ну 1й вариант наверное был бы идеальным...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeBSD Manad, использующий таблицы
СообщениеДобавлено: 26 ноя 2010, 13:40 
Не в сети

Зарегистрирован: 16 ноя 2007, 16:11
Сообщения: 829
Карма: 49
В скрипте шлюза заменили ManadUtils на GateCommandUtil


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeBSD Manad, использующий таблицы
СообщениеДобавлено: 26 ноя 2010, 13:58 
Не в сети

Зарегистрирован: 16 ноя 2007, 16:11
Сообщения: 829
Карма: 49
Обнаружилось слабое место обработки open-close на стороне биллинга: все изменения адресов/сетей необходимо проводить при закрытом шлюзе. Иначе не удалятся старые адреса/сети.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeBSD Manad, использующий таблицы
СообщениеДобавлено: 26 ноя 2010, 15:52 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
vdd писал(а):
Обнаружилось слабое место обработки open-close на стороне биллинга: все изменения адресов/сетей необходимо проводить при закрытом шлюзе. Иначе не удалятся старые адреса/сети.


Да..его можно исправить с помощью скиптового шлюза .


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeBSD Manad, использующий таблицы
СообщениеДобавлено: 26 ноя 2010, 16:14 
Не в сети

Зарегистрирован: 16 ноя 2007, 16:11
Сообщения: 829
Карма: 49
stark писал(а):
vdd писал(а):
Обнаружилось слабое место обработки open-close на стороне биллинга: все изменения адресов/сетей необходимо проводить при закрытом шлюзе. Иначе не удалятся старые адреса/сети.


Да..его можно исправить с помощью скиптового шлюза .


Намекните как, хотя бы. Потому как у нас нет идей, откуда взять старые адреса.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeBSD Manad, использующий таблицы
СообщениеДобавлено: 30 ноя 2010, 11:57 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Я понял одно - действительно универсального решения не существует похоже. Я сделал вариант исключительно под свои нужды. При этом я на стороне manad храню номер договора и ассоциированные с ним правила, в скрипте выполняю проверку на расхождения - если есть, то manad удаляет старые правила и закачивает новые. Решилось сразу две проблемы - первая это актуальность (если перезагрузится manad, значит все правила потеряются и скрипт просто закачает новые), а вторая как раз об open-close.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeBSD Manad, использующий таблицы
СообщениеДобавлено: 30 ноя 2010, 14:25 
Не в сети

Зарегистрирован: 16 ноя 2007, 16:11
Сообщения: 829
Карма: 49
borisk писал(а):
Решилось сразу две проблемы - первая это актуальность (если перезагрузится manad, значит все правила потеряются и скрипт просто закачает новые),

Оригинальный манад ведет себя точно также. Только он хранит номера договоров.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeBSD Manad, использующий таблицы
СообщениеДобавлено: 01 дек 2010, 15:02 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Если хранить только номера договоров, нельзя отследить смену правил в тарифе. Ну то есть фактически на текущий момент я использовал приведенный на wiki вариант, с заточкой исключительно под свои нужды.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 34 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 5 часов [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
POWERED_BY
Русская поддержка phpBB
[ Time : 0.104s | 78 Queries | GZIP : On ]