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 );

        Preferences params = new Preferences();
        params.set( "timeout", String.valueOf( timeoutMinutes ) );

        InetConnectionCommandEvent e = new InetConnectionCommandEvent( moduleId, userId, accountingRootDeviceId, deviceId, 0, 0, "stopAllForDeviceId", params.toString() );
По идее это можно вызывать в DeviceManager при обнаружении перезагрузки.


Также есть функционал закрытия дублирующихся сессий (по Calling-Station-Id). В конфигурации типа сервиса:
Код:
# для типа сервиса с динамическим адресом
radius.connection.checkDuplicate=5
# для типа сервиса со статическим адресом
radius.connection.checkDuplicate=9
https://docs.bitel.ru/pages/viewpage.action?pageId=119505956#id-ПроцессорInetRadiusProcessor-ДействиеприполученииAccess-Requestприналичииактивнойсессии

Автор:  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 );

        Preferences params = new Preferences();
        params.set( "timeout", String.valueOf( timeoutMinutes ) );

        InetConnectionCommandEvent e = new InetConnectionCommandEvent( moduleId, userId, accountingRootDeviceId, deviceId, 0, 0, "stopAllForDeviceId", params.toString() );
По идее это можно вызывать в DeviceManager при обнаружении перезагрузки.



По таймауту плохо, т.к. всем абонам надо ждать, пока старые сессии отвалятся.
При ребуте, думаю, да, можно. Я забыл уже, какие этапы жизни сессии в Inet, думал, тоже есть suspend - удобно.

Amir писал(а):
Также есть функционал закрытия дублирующихся сессий (по Calling-Station-Id). В конфигурации типа сервиса:
Код:
# для типа сервиса с динамическим адресом
radius.connection.checkDuplicate=5
# для типа сервиса со статическим адресом
radius.connection.checkDuplicate=9
https://docs.bitel.ru/pages/viewpage.action?pageId=119505956#id-ПроцессорInetRadiusProcessor-ДействиеприполученииAccess-Requestприналичииактивнойсессии


Не подойдёт.
Для 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 );

        Preferences params = new Preferences();
        params.set( "timeout", String.valueOf( timeoutMinutes ) );

        InetConnectionCommandEvent e = new InetConnectionCommandEvent( moduleId, userId, accountingRootDeviceId, deviceId, 0, 0, "stopAllForDeviceId", params.toString() );
По идее это можно вызывать в DeviceManager при обнаружении перезагрузки.

Возможно вместо 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/