forum.bitel.ru http://forum.bitel.ru/ |
|
Suspend сессий Inet PPPoE при перезагрузке NAS-а http://forum.bitel.ru/viewtopic.php?f=44&t=12913 |
Страница 1 из 1 |
Автор: | Cromeshnic [ 25 май 2018, 12:32 ] |
Заголовок сообщения: | Suspend сессий Inet PPPoE при перезагрузке NAS-а |
Привет. У меня в модуле DialUp у логинов количество разрешённых сессий=1, поэтому самостоятельно реализована такая логика: При обнаружении перезагрузки NAS-а все сессии на этом NAS-е помечаются как suspended, чтобы когда клиенты массово ломанутся, их не отбивало по превышению количества активных сессий. Вопрос: есть ли такая стандартная логика в Inet, и если нет, как её красивее сделать? Вижу в документации, есть такое: Код: # Синхронизировать ли сервисы при обнаружении перезагрузки, 0 - не синхронизировать (по умолчанию), 1 - синхронизировать # (для обнаружения перезагрузки в типе устройства должен быть установлен обработчик управления устройством) #sa.device.sync.onReboot=1 Но не уверен, что после синхронизации сервисов их активные сессии будут помечены как suspended. Пока есть мысль подписаться на событие InetDeviceUptimeEvent и самому отслеживать ребут, но это будет примерно как я делал в DialUp, разве что по SNMP за меня будет ходить DeviceManager. Вообще, фичреквест: добавьте, пожалуйста, параметр "sa.device.onReboot.suspend=1" и суспендите все коннекшены на устройстве в случае его ребута. |
Автор: | Amir [ 29 май 2018, 19:44 ] |
Заголовок сообщения: | Re: Suspend сессий Inet PPPoE при перезагрузке NAS-а |
Приостановки нет, но есть закрытие сессий, которые начались более чем n минут от текущего времени. В клиенте биллинга - правой кнопкой на устройстве. ru.bitel.bgbilling.modules.inet.api.common.service.InetSessionService.connectionsStop(int deviceId, long timeoutMinutes) Код: int accountingRootDeviceId = InetUtils.getAccountingRootDeviceId( context.getSetup(), moduleId, deviceId ); По идее это можно вызывать в DeviceManager при обнаружении перезагрузки.Preferences params = new Preferences(); params.set( "timeout", String.valueOf( timeoutMinutes ) ); InetConnectionCommandEvent e = new InetConnectionCommandEvent( moduleId, userId, accountingRootDeviceId, deviceId, 0, 0, "stopAllForDeviceId", params.toString() ); Также есть функционал закрытия дублирующихся сессий (по Calling-Station-Id). В конфигурации типа сервиса: Код: # для типа сервиса с динамическим адресом https://docs.bitel.ru/pages/viewpage.action?pageId=119505956#id-ПроцессорInetRadiusProcessor-ДействиеприполученииAccess-Requestприналичииактивнойсессии
radius.connection.checkDuplicate=5 # для типа сервиса со статическим адресом radius.connection.checkDuplicate=9 |
Автор: | Cromeshnic [ 30 май 2018, 07:55 ] |
Заголовок сообщения: | Re: Suspend сессий Inet PPPoE при перезагрузке NAS-а |
Amir писал(а): Приостановки нет, но есть закрытие сессий, которые начались более чем n минут от текущего времени. В клиенте биллинга - правой кнопкой на устройстве. ru.bitel.bgbilling.modules.inet.api.common.service.InetSessionService.connectionsStop(int deviceId, long timeoutMinutes) Код: int accountingRootDeviceId = InetUtils.getAccountingRootDeviceId( context.getSetup(), moduleId, deviceId ); По идее это можно вызывать в DeviceManager при обнаружении перезагрузки.Preferences params = new Preferences(); params.set( "timeout", String.valueOf( timeoutMinutes ) ); InetConnectionCommandEvent e = new InetConnectionCommandEvent( moduleId, userId, accountingRootDeviceId, deviceId, 0, 0, "stopAllForDeviceId", params.toString() ); По таймауту плохо, т.к. всем абонам надо ждать, пока старые сессии отвалятся. При ребуте, думаю, да, можно. Я забыл уже, какие этапы жизни сессии в Inet, думал, тоже есть suspend - удобно. Amir писал(а): Также есть функционал закрытия дублирующихся сессий (по Calling-Station-Id). В конфигурации типа сервиса: Код: # для типа сервиса с динамическим адресом https://docs.bitel.ru/pages/viewpage.action?pageId=119505956#id-ПроцессорInetRadiusProcessor-ДействиеприполученииAccess-Requestприналичииактивнойсессииradius.connection.checkDuplicate=5 # для типа сервиса со статическим адресом radius.connection.checkDuplicate=9 Не подойдёт. Для PPPoE не хочется такое включать, т.к. некоторые настраивают на 2 устройствах зачем-то, или старый роутер где-нибудь в сеть подключат, и они будут по-очереди цепляться, вместо того, чтобы первый подключился и нормально работал, а второй всегда отшибало. Для IPoE (cisco ip subs int) я убрал ограничение на количество сессий - там сессию поднимает сам NAS и 2 живых сессии одновременно не бывает, поэтому проблем с перезагрузкой и т.п. нет. Можно, например, скриптовое сделать событие на ребут устройства. Или в обработчике управления абстрактный метод onReboot. |
Автор: | Phricker [ 30 май 2018, 10:09 ] |
Заголовок сообщения: | Re: Suspend сессий Inet PPPoE при перезагрузке NAS-а |
Цитата: Для PPPoE не хочется такое включать, т.к. некоторые настраивают на 2 устройствах зачем-то, или старый роутер где-нибудь в сеть подключат, и они будут по-очереди цепляться, вместо того, чтобы первый подключился и нормально работал, а второй всегда отшибало. А у этих двух устройств одинаковый мак адрес? Мы именно таким пользуемся. Т.е. примерно следующее происходит. - Я перезагружаю комп/роутер некорректно. - Пытаюсь подключиться при наличии сессии в биллинге. - первую попытку отбивает с ошибкой превышен лимит сессий и в биллинге и на брасе сессия закрывается - вторая попытка проходит норм |
Автор: | Cromeshnic [ 08 июн 2018, 12:20 ] |
Заголовок сообщения: | Re: Suspend сессий Inet PPPoE при перезагрузке NAS-а |
Хм, посмотрел - действительно, ломятся с того же mac-а бывает. Не знаю уж, как это физически выглядит и зачем. |
Автор: | Cromeshnic [ 14 июн 2018, 15:48 ] |
Заголовок сообщения: | Re: Suspend сессий Inet PPPoE при перезагрузке NAS-а |
Порылся в коде, нашёл интересную фичу: когда биллинг обнаруживает ребут устройства (через uptime), то пытается вызвать метод onReboot обработчика управления устройством. Добавил этот метод в свой обработчик: Код: /** * Метод вызывается автоматически биллингом при обнаружении ребута устройства. * Будем при этом сбрасывать все соединения, чтобы клиенты сразу могли начать подключаться, даже если у них установлено ограничение в 1 активную сессию */ public String onReboot(InetDeviceManageEvent e) throws Exception { int count = 0; try(Connection con = Setup.getSetup().getDBConnection()) { InetConnectionDao connDao = new InetConnectionDao(con, e.getModuleId()); int accountingRootDeviceId = InetUtils.getAccountingRootDeviceId(Setup.getSetup(), e.getModuleId(), e.getDeviceId()); for (InetConnection connection : connDao.list(Collections.singleton(e.getDeviceId()), false)) { EventProcessor.getInstance().publish(new InetConnectionCommandEvent(e.getModuleId(), 0, accountingRootDeviceId, connection.getDeviceId(), connection.getServId(), connection .getId(), "finish")); count++; } connDao.recycle(); } return "Sessions finished: "+ count; } Физически сессии не сбрасываются, только в биллинге. Протестировал - всё ок работает. Единственный нюанс - если метод uptime возвращает null, то это не считается ошибкой или ребутом, и время до следующего опроса увеличивается на +10минут (захардкожено в BG). Т.е. в методе uptime при недоступности устройства и т.п. лучше явно кидать Exception - тогда биллинг начнёт опрашивать каждую минуту (или inet.manage.uptime.error), и как только аптайм появится и будет меньше предыдущего значения, то запустит onReboot. Ps. Можно ещё усложнить логику и сбрасывать только сессии, которые стартовали раньше now()-uptime. Но так тоже ок: даже если сбросим свежую живую сессию в BG, то она поднимется из update. |
Автор: | Amir [ 14 июн 2018, 15:58 ] |
Заголовок сообщения: | Re: Suspend сессий Inet PPPoE при перезагрузке NAS-а |
Я примерно это и имел ввиду здесь: Цитата: есть закрытие сессий, которые начались более чем n минут от текущего времени. В клиенте биллинга - правой кнопкой на устройстве. ru.bitel.bgbilling.modules.inet.api.common.service.InetSessionService.connectionsStop(int deviceId, long timeoutMinutes) Код: int accountingRootDeviceId = InetUtils.getAccountingRootDeviceId( context.getSetup(), moduleId, deviceId ); По идее это можно вызывать в DeviceManager при обнаружении перезагрузки.Preferences params = new Preferences(); params.set( "timeout", String.valueOf( timeoutMinutes ) ); InetConnectionCommandEvent e = new InetConnectionCommandEvent( moduleId, userId, accountingRootDeviceId, deviceId, 0, 0, "stopAllForDeviceId", params.toString() ); Возможно вместо finish лучше бросать данное событие. finish всех сессий будет грузить базу, а закрытие должно пройти быстрее (а завершение постепенно произойдет). Использование onReboot есть в ru.bitel.bgbilling.modules.inet.dyn.device.manage.TerminalDeviceManager. |
Автор: | Cromeshnic [ 14 июн 2018, 16:04 ] |
Заголовок сообщения: | Re: Suspend сессий Inet PPPoE при перезагрузке NAS-а |
Хм, посмотрю завтра, спасибо. Надо свежие либы скачать, т.к. в своих не вижу упоминаний stopAllForDeviceId |
Автор: | Amir [ 14 июн 2018, 16:05 ] |
Заголовок сообщения: | Re: Suspend сессий Inet PPPoE при перезагрузке NAS-а |
Да, закрытие устаревших не так давно добавили. |
Страница 1 из 1 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |