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/