forum.bitel.ru http://forum.bitel.ru/ |
|
Управление ipfw tables через telnet http://forum.bitel.ru/viewtopic.php?f=7&t=2524 |
Страница 1 из 1 |
Автор: | johnplv [ 01 июл 2009, 11:03 ] |
Заголовок сообщения: | Управление ipfw tables через telnet |
встала задача по оптимизации правил в 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 такой тормозной, то ли я что-то упускаю , можно ли как-то это еще оптимизировать? поделитесь опытом плиз |
Автор: | stark [ 01 июл 2009, 12:58 ] |
Заголовок сообщения: | Re: Управление ipfw tables через telnet |
johnplv писал(а): ну и в ipfw правила добавляем для обработки трафика на основе таблиц алгоритм работы простой: шлюз открыт - добавляем ip в таблицу, шлюз закрыт - удаляем, проверку на то что ip уже есть в таблице не делаю, т.к. имхо это займет еще больше времени чем просто добавить/удалить ip в таблицу не согласен . У вас сколько договоров на одном шлюзе ? например 1000 договоров . Вы вначале запускате команду - дать весь список правил и получаете его ..не надо для каждого пользователя проверять потом уже в цикле по всем договорам на этом шлюзе вы делаете проверку в этом результате. выигрышь будет большой . В большинтсве случаев у вас не будет вообще почти ни одной команды послылаться, т.ак ситуация наверное не так жу часто меняется . А вашем случае у вас посылается всем 1000 пользователям кажыдй раз . Манад как раз проверяет и в этом плане он оптимизирован.. А посылка для каждого пользователя команд по telnet процесс трудоемкий,а проверка на порядок быстрее работать будет .. |
Автор: | Иван [ 07 окт 2009, 03:48 ] |
Заголовок сообщения: | Re: Управление ipfw tables через telnet |
Пожалуйста, будьте так любезны, распишите как этот ваш скрипт использовать. Что писать в конфигурации шлюза, нужно ли чего то доустанавливать... |
Автор: | Иван [ 07 окт 2009, 03:58 ] |
Заголовок сообщения: | Re: Управление ipfw tables через telnet |
я попробовал, создал типы правил, прописал туда ${speedIN} . в конфигурации типа шлюза указал use.script=1, завел команды типы правил и скрипт. Раскоментировал debug=true. Создал шлюз этого типа, заполнил хост, порт, кейворд , тип шлюза. В конфигурации написал login=adsf и timeout=0 Когда пытаюсь добавить шлюз в модуль выделенные каналы договора, получаю ошибку неверные параметры запроса. Однако в логах не вижу ничего. Не подскажите, где я не то делаю? |
Автор: | stark [ 07 окт 2009, 10:03 ] |
Заголовок сообщения: | Re: Управление ipfw tables через telnet |
Иван писал(а): я попробовал, создал типы правил, прописал туда ${speedIN} . в конфигурации типа шлюза указал use.script=1, завел команды типы правил и скрипт. Раскоментировал debug=true. Создал шлюз этого типа, заполнил хост, порт, кейворд , тип шлюза. В конфигурации написал login=adsf и timeout=0 Когда пытаюсь добавить шлюз в модуль выделенные каналы договора, получаю ошибку неверные параметры запроса. Однако в логах не вижу ничего. Не подскажите, где я не то делаю? ну вообще покажите все конифгеи(тип шлюза, шлюз и т.п) - там ошибка скорее всего .. или запустите клиент в режиме debug (там есть отдельный скрипт запкска для этого ) и запрос из log при добавлении шлюза покажите тут |
Автор: | Иван [ 07 окт 2009, 17:44 ] |
Заголовок сообщения: | Re: Управление ipfw tables через telnet |
Шлюз стал добавляться при прописывании в конфиг типа_шлюза Код: 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 |
Автор: | stark [ 08 окт 2009, 12:59 ] |
Заголовок сообщения: | Re: Управление ipfw tables через telnet |
Иван писал(а): Шлюз стал добавляться при прописывании в конфиг типа_шлюза Код: 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 понятно почему падало тогда |
Автор: | Иван [ 08 окт 2009, 13:41 ] |
Заголовок сообщения: | Re: Управление ipfw tables через telnet |
Ага, а скажите правильно я значения для user_rule.editor.class и gate_manager.class указал? А то я в этом месте сомневаюсь. |
Автор: | stark [ 09 окт 2009, 16:14 ] |
Заголовок сообщения: | Re: Управление ipfw tables через telnet |
Иван писал(а): Ага, а скажите правильно я значения для user_rule.editor.class и gate_manager.class указал? А то я в этом месте сомневаюсь. да |
Страница 1 из 1 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |