forum.bitel.ru http://forum.bitel.ru/ |
|
Не вызывается connectionModify при включении сервиса http://forum.bitel.ru/viewtopic.php?f=44&t=7103 |
Страница 1 из 1 |
Автор: | vkulakov [ 13 авг 2012, 20:44 ] |
Заголовок сообщения: | Не вызывается connectionModify при включении сервиса |
Если отключить сервис на договоре при активной сессии, то происходит отправка CoA-запросов на Cisco, после чего активные опции у сессии отключаются и включаются фейковые, которые перечислены в параметре sa.radius.service.disable. При этом в логах видно, что происходит вызов метода connectionModify. Если же попытаться включить сервис на договоре, то в логах виден только вызов метода serviceModify без connectionModify. Соответственно, на сессию не вешаются "нормальные" опции сервиса и, грубо говоря, интернета абонент не получает. Это так и задумано, или всё-таки это ошибка? По логике сервис должен как включаться, так и выключаться нормально (с изменениями на cisco). Или это регулируется какими-то опциями? P. S. Речь идёт про Cisco ISG. Сессия во время экспериментов не разрывается. |
Автор: | Amir [ 14 авг 2012, 15:33 ] |
Заголовок сообщения: | Re: Не вызывается connectionModify при включении сервиса |
Цитата: после чего активные опции у сессии отключаются и включаются фейковые, которые перечислены в параметре sa.radius.service.disable Т.е. стартует сервисная сессия с именем сервиса, который есть в sa.radius.service.disable?ISGProtocolHandler прописан, как обработчик процессора протокола? Он должен в логах написать Код: State is disable (from start disable service) State is enable (from stop disable service) Код: // если указан сервис, при котором доступ ограничен - проверяем, не его ли это аккаунтинг,
// и, если это так, переключаем состояние соединения if( disableServiceNames != null && disableServiceNames.contains( serviceName ) ) { // start или update if( acctStatusType == 1 || acctStatusType == 3 ) { logger.debug( "State is disable (from start disable service)" ); request.setOption( InetRadiusProcessor.DEVICE_STATE, InetServ.STATE_DISABLE ); } else { logger.debug( "State is enable (from stop disable service)" ); request.setOption( InetRadiusProcessor.DEVICE_STATE, InetServ.STATE_ENABLE ); } } |
Автор: | vkulakov [ 14 авг 2012, 17:06 ] |
Заголовок сообщения: | Re: Не вызывается connectionModify при включении сервиса |
Сейчас обнаружил следующее: В файле ISGPPPoEServiceActivator есть строчка Код: List<String> disableServiceNames = Utils.toList( deviceConfig.get( "sa.radius.service.disable", deviceConfig.get( "radius.serviceName.disable", "" ) ) );// INET_FAKE А в файле ISGProtocolHandler - Код: List<String> disableServiceNames = Utils.toList( deviceConfig.get( "radius.serviceName.disable", "" ) );// INET_FAKE В конфиге у меня Код: sa.radius.service.disable=PORTAL,REDIRECT В результате при вызове функции preprocessAccountingRequest disableServiceNames всегда null! Эт чё за хрень? В общем в логах я принципиально не увижу State is disable/State is enable. Должна быть опция radius.service.disable? Сейчас буду менять. Amir писал(а): Цитата: после чего активные опции у сессии отключаются и включаются фейковые, которые перечислены в параметре sa.radius.service.disable Т.е. стартует сервисная сессия с именем сервиса, который есть в sa.radius.service.disable?Да, при ручном отключении сервиса в клиенте стартуют сессии, перечисленные в опции sa.radius.service.disable ISGProtocolHandler назначен обработчиком процессора протокола. |
Автор: | Amir [ 14 авг 2012, 17:32 ] |
Заголовок сообщения: | Re: Не вызывается connectionModify при включении сервиса |
Да, я перепутал, должен быть radius.serviceName.disable=. Именно по этому параметру определяется текущее состояние, а не по sa.radius.service.disable (по этому параметру выдаются сервисы в состоянии отключен, но определение текущего состояния - отдельная задача, т.к. вариантов может быть несколько). Исправил в соседней ветке. |
Автор: | vkulakov [ 14 авг 2012, 17:45 ] |
Заголовок сообщения: | Re: Не вызывается connectionModify при включении сервиса |
Поправил конфиг. Теперь при ручном отключении сервиса в биллинге в логах вижу State is disable. Только не понятно, какое это имеет отношение к проблеме? State is disable/enable я могу увидеть только в том случае, если начинается/заканчивается аккаунтинг для disabled-сессий. Но проблема в том, что при отключении сервиса вызывается connectionModify и стартуют disabled-сессии, а при обратном включении сервиса connectionModify не вызывается, соответственно, CoA-запрос не посылается и disabled-сессии не останавливаются. Т. е. State is enable я принципиально не могу увидеть. Как сделать, чтобы при включении сервиса вызывался метод connectionModify? |
Автор: | Amir [ 14 авг 2012, 17:52 ] |
Заголовок сообщения: | Re: Не вызывается connectionModify при включении сервиса |
Основная проблема была в том, что Accounting не знал, что сессия в disable режиме, т.е. когда вы включали сервис, Accounting думал, что сессия уже и так включена, поэтому ничего с ней не делал. В договоре у сессии состояние отключена? Может быть не дождались? За включение отключенных сессий отвечает Код: # Трекер (обработка сессий без наработки):
# пауза между заданиями трекинга accounting.worker.1.tracking.1.delay=20 # максимальное количество проверенных соединений за задание accounting.worker.1.tracking.1.batchSize=100 |
Автор: | Amir [ 14 авг 2012, 18:04 ] |
Заголовок сообщения: | Re: Не вызывается connectionModify при включении сервиса |
И radius.disable.pattern.attributes= не указан в конфиге? В текущем случае он точно не нужен, будет только мешать. |
Автор: | vkulakov [ 14 авг 2012, 19:16 ] |
Заголовок сообщения: | Re: Не вызывается connectionModify при включении сервиса |
Параметр radius.disable.pattern.attributes не нашёл, зато нашёл radius.disable.attributes, который безжалостно закомментировал. Также добавил следующий параметр: Код: # Нужно ли посылать CoA при переводе из disable в enable (при withoutBreak=false) sa.radius.connection.coa.onEnable=1 После включения onEnable всё заработало как положено. |
Автор: | vkulakov [ 14 авг 2012, 19:20 ] |
Заголовок сообщения: | Re: Не вызывается connectionModify при включении сервиса |
Ещё заметил ошибку в классе ISGServiceActivator: Код: if( e.getOldState() == InetServ.STATE_DISABLE ) { if( !withoutBreak ) { // убрать из DHCP, чтобы выдало NaK EventProcessor.getInstance().request( new InetConnectionManager.ConnectionRemoveEvent( connection ) ); if( !coaOnEnable ) { return null; } } // устанавливаем флаг, что нужно будет поменять состояние соединения в базе if( needConnectionStateModify ) { e.setConnectionStateModified( true ); } // отключаем disable сервис и включаем активные опции --> return sendCommands( connection, optionsToServiceNames( removeOptions, disableServiceNames ), optionsToServiceNames( addOptions, null ) ); } Похоже, что должно быть так: Код: if( e.getOldState() == InetServ.STATE_DISABLE )
{ if( !withoutBreak ) { // убрать из DHCP, чтобы выдало NaK EventProcessor.getInstance().request( new InetConnectionManager.ConnectionRemoveEvent( connection ) ); if( !coaOnEnable ) { return null; } } // устанавливаем флаг, что нужно будет поменять состояние соединения в базе if( needConnectionStateModify ) { e.setConnectionStateModified( true ); } // отключаем disable сервис и включаем активные опции --> return sendCommands( connection, optionsToServiceNames( null, disableServiceNames ), optionsToServiceNames( e.getNewOptions(), null ) ); } |
Страница 1 из 1 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |