BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 27 апр 2024, 16:02

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




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: Управление ipfw tables через telnet
СообщениеДобавлено: 01 июл 2009, 11:03 
Не в сети

Зарегистрирован: 08 дек 2006, 11:03
Сообщения: 42
Карма: 0
встала задача по оптимизации правил в ipfw и переходу на таблицы
т.к. манад для этих целей не подходит (сильно привязан к № правил в ipfw) сделал свой скрипт на основе стандартных шлюзовых скриптов :

Код:
import java.util.*;
import bitel.billing.common.module.ipn.*;
import bitel.billing.server.ipn.bean.*;
import bitel.billing.server.util.*;
import bitel.billing.common.*;
import bitel.billing.server.ipn.UserStatus;
import java.util.regex.Pattern;
import bitel.billing.server.util.telnet.*;
import ru.bitel.bgbilling.common.DefaultSetup;

protected void doSync(){
   log.info("Starting ipfw+tables over telnet session");
   host = gate.getHost();
   port = gate.getPort();
   pswd = gate.getKeyword();
   DefaultServerSetup gateSetup = new DefaultServerSetup( gate.getConfig(), "\r\n" );
   login = gateSetup.getStringValue( "login", "root" );
   timeout = gateSetup.getIntValue( "timeout", 0 );

   debug = log.isDebugEnabled();
   //debug = true;
   if (debug){ log.debug( " gate: " + host + ":" + port + " login: " + login + " pswd: " + pswd ); }
   session = new TelnetSession( host, port);
   //session.setTimeout( timeout );
   session.setLoginPromptSequence( ":" );
   session.connect();
   session.doCommand( login );
   session.setLoginPromptSequence( ":" );
   session.doCommand( pswd );
   session.setLoginPromptSequence( "%" );

   StringBuffer cmdBuff = new StringBuffer();
   rulesCount = 0;
   for ( UserStatus status : statusList ) {
      cid = status.contractId;
      cmdBuff.setLength(0);
      if ( status.status > 0 ) {
         // удаляем
         if ( status.status == IPNContractStatus.STATUS_REMOVED ){
            rules = getDeleteRules( status );
            for ( String rule : rules ) { cmdBuff.append(";"); cmdBuff.append(rule); rulesCount++; }
         }
         // закрываем
         else {
            rules = getCloseRules( status );
            for ( String rule : rules ) { cmdBuff.append(";"); cmdBuff.append(rule); rulesCount++; }
         }
      }
      if ( status.status == IPNContractStatus.STATUS_OPEN ){
         rules = getOpenRules( status );
            for ( String rule : rules ) { cmdBuff.append(";"); cmdBuff.append(rule); rulesCount++; }
      }
      if (debug) { log.info("cid: " + status.contractId.toString() + " cmd: " + cmdBuff); }
      session.doCommand(cmdBuff.toString());
   }
   session.doCommand("echo %; exit");
   log.info("Ending ipfw+tables over telnet session, rules processed: " + rulesCount);
}

getOpenRules( status ) { return getRules( status, "\\[OPEN\\](.*)\\[/OPEN\\]" ); }

private getCloseRules( status ) { return getRules( status, "\\[CLOSE\\](.*)\\[/CLOSE\\]" ); }

private getDeleteRules( status ) { return getRules( status, "\\[DELETE\\](.*)\\[/DELETE\\]" ); }

private getRules( status, template ) {
   // пользовательское правило, без типа - то все оставляем как есть
   rule = status.rule.getRuleText();
   // типизированное правило
   if ( status.ruleType != null ) {
      rule = generateRule( rule, status.gateType, status.ruleType );
   }
   pattern = Pattern.compile( template, Pattern.DOTALL );
   m = pattern.matcher( rule );
   if ( m.find() ) {
      rule = m.group( 1 );
   }
   rule.replaceAll( "\r", "" );
   return rule.split( "\n" );
}
 
generateRule( addresses, gateType, ruleType )
{
    ruleText = ManadUtils.getRule( gateType, ruleType );
    return ManadUtils.generateRule( ruleText, addresses, null, ruleType );       
}


и соответственно команды для правил:
Код:
[DEFAULT]
[OPEN]
<LOOP>
/usr/local/bin/sudo -b /sbin/ipfw -q table ${queueIN} add {A} ${speedIN}
/usr/local/bin/sudo -b /sbin/ipfw -q table ${queueOUT} add {A} ${speedOUT}
</LOOP>
[/OPEN]

[CLOSE]
<LOOP>
/usr/local/bin/sudo -b /sbin/ipfw -q table ${queueIN} delete {A}
/usr/local/bin/sudo -b /sbin/ipfw -q table ${queueOUT} delete {A}
</LOOP>
[/CLOSE]

[DELETE]
<LOOP>
/usr/local/bin/sudo -b /sbin/ipfw -q table ${queueIN} delete {A}
/usr/local/bin/sudo -b /sbin/ipfw -q table ${queueOUT} delete {A}
</LOOP>
[/DELETE]
[/DEFAULT]


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

так вот, у меня скрипт обрабатывает около 5,5 тыс. правил
и полная синхронизация со шлюзом проходит около 10 мин, этот же скрипт через ssh работает еще дольше (раза в два),
что очень много, т.к. манад при тех же условиях работает 1-2 мин, а обсчет трафика и синхронизацию шлюзов у себя я провожу каждые 5 мин

то ли класс TelnetSession такой тормозной, то ли я что-то упускаю :(,
можно ли как-то это еще оптимизировать? поделитесь опытом плиз


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Управление ipfw tables через telnet
СообщениеДобавлено: 01 июл 2009, 12:58 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
johnplv писал(а):

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


не согласен . У вас сколько договоров на одном шлюзе ?
например 1000 договоров . Вы вначале запускате команду - дать весь список правил и получаете его ..не надо для каждого пользователя проверять

потом уже в цикле по всем договорам на этом шлюзе вы делаете проверку в этом результате. выигрышь будет большой . В большинтсве случаев у вас не будет вообще почти ни одной команды послылаться, т.ак ситуация наверное не так жу часто меняется . А вашем случае у вас посылается всем 1000 пользователям кажыдй раз . Манад как раз проверяет и в этом плане он оптимизирован.. А посылка для каждого пользователя команд по telnet процесс трудоемкий,а проверка на порядок быстрее работать будет ..


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Управление ipfw tables через telnet
СообщениеДобавлено: 07 окт 2009, 03:48 
Не в сети

Зарегистрирован: 26 ноя 2008, 01:56
Сообщения: 80
Карма: 0
Пожалуйста, будьте так любезны, распишите как этот ваш скрипт использовать.
Что писать в конфигурации шлюза, нужно ли чего то доустанавливать...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Управление ipfw tables через telnet
СообщениеДобавлено: 07 окт 2009, 03:58 
Не в сети

Зарегистрирован: 26 ноя 2008, 01:56
Сообщения: 80
Карма: 0
я попробовал, создал типы правил, прописал туда ${speedIN} .
в конфигурации типа шлюза указал use.script=1, завел команды типы правил и скрипт. Раскоментировал debug=true.
Создал шлюз этого типа, заполнил хост, порт, кейворд , тип шлюза. В конфигурации написал login=adsf и timeout=0

Когда пытаюсь добавить шлюз в модуль выделенные каналы договора, получаю ошибку неверные параметры запроса.
Однако в логах не вижу ничего.


Не подскажите, где я не то делаю?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Управление ipfw tables через telnet
СообщениеДобавлено: 07 окт 2009, 10:03 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
Иван писал(а):
я попробовал, создал типы правил, прописал туда ${speedIN} .
в конфигурации типа шлюза указал use.script=1, завел команды типы правил и скрипт. Раскоментировал debug=true.
Создал шлюз этого типа, заполнил хост, порт, кейворд , тип шлюза. В конфигурации написал login=adsf и timeout=0

Когда пытаюсь добавить шлюз в модуль выделенные каналы договора, получаю ошибку неверные параметры запроса.
Однако в логах не вижу ничего.


Не подскажите, где я не то делаю?


ну вообще покажите все конифгеи(тип шлюза, шлюз и т.п) - там ошибка скорее всего ..

или запустите клиент в режиме debug (там есть отдельный скрипт запкска для этого ) и запрос из log при добавлении шлюза покажите тут


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Управление ipfw tables через telnet
СообщениеДобавлено: 07 окт 2009, 17:44 
Не в сети

Зарегистрирован: 26 ноя 2008, 01:56
Сообщения: 80
Карма: 0
Шлюз стал добавляться при прописывании в конфиг типа_шлюза

Код:
user_rule.editor.class=bitel.billing.module.services.ipn.editor.ManadContractRuleEditor
gate_manager.class=bitel.billing.server.ipn.ManadGateWorker
use.script=1


Раньге было только use.script=1
Но что то меня терзают смутные сомнения что делаю неправильно про user_rule и gate_manager


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Управление ipfw tables через telnet
СообщениеДобавлено: 08 окт 2009, 12:59 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
Иван писал(а):
Шлюз стал добавляться при прописывании в конфиг типа_шлюза

Код:
user_rule.editor.class=bitel.billing.module.services.ipn.editor.ManadContractRuleEditor
gate_manager.class=bitel.billing.server.ipn.ManadGateWorker
use.script=1


Раньге было только use.script=1

понятно почему падало тогда


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Управление ipfw tables через telnet
СообщениеДобавлено: 08 окт 2009, 13:41 
Не в сети

Зарегистрирован: 26 ноя 2008, 01:56
Сообщения: 80
Карма: 0
Ага, а скажите правильно я значения для user_rule.editor.class и gate_manager.class указал? А то я в этом месте сомневаюсь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Управление ipfw tables через telnet
СообщениеДобавлено: 09 окт 2009, 16:14 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
Иван писал(а):
Ага, а скажите правильно я значения для user_rule.editor.class и gate_manager.class указал? А то я в этом месте сомневаюсь.

да


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

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


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

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


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

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