BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 29 мар 2024, 04:28

Часовой пояс: UTC + 5 часов [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
СообщениеДобавлено: 25 май 2018, 12:32 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
Привет.
У меня в модуле DialUp у логинов количество разрешённых сессий=1, поэтому самостоятельно реализована такая логика:
При обнаружении перезагрузки NAS-а все сессии на этом NAS-е помечаются как suspended, чтобы когда клиенты массово ломанутся, их не отбивало по превышению количества активных сессий.

Вопрос: есть ли такая стандартная логика в Inet, и если нет, как её красивее сделать?

Вижу в документации, есть такое:
Код:
# Синхронизировать ли сервисы при обнаружении перезагрузки, 0 - не синхронизировать (по умолчанию), 1 - синхронизировать
# (для обнаружения перезагрузки в типе устройства должен быть установлен обработчик управления устройством)
#sa.device.sync.onReboot=1


Но не уверен, что после синхронизации сервисов их активные сессии будут помечены как suspended.

Пока есть мысль подписаться на событие InetDeviceUptimeEvent и самому отслеживать ребут, но это будет примерно как я делал в DialUp, разве что по SNMP за меня будет ходить DeviceManager.

Вообще, фичреквест:
добавьте, пожалуйста, параметр "sa.device.onReboot.suspend=1" и суспендите все коннекшены на устройстве в случае его ребута.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29 май 2018, 19:44 
Не в сети
Разработчик
Аватара пользователя

Зарегистрирован: 19 дек 2006, 21:04
Сообщения: 5970
Карма: 256
Приостановки нет, но есть закрытие сессий, которые начались более чем 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приналичииактивнойсессии


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 30 май 2018, 07:55 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
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.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 30 май 2018, 10:09 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
Цитата:
Для PPPoE не хочется такое включать, т.к. некоторые настраивают на 2 устройствах зачем-то, или старый роутер где-нибудь в сеть подключат, и они будут по-очереди цепляться, вместо того, чтобы первый подключился и нормально работал, а второй всегда отшибало.

А у этих двух устройств одинаковый мак адрес?
Мы именно таким пользуемся.
Т.е. примерно следующее происходит.
- Я перезагружаю комп/роутер некорректно.
- Пытаюсь подключиться при наличии сессии в биллинге.
- первую попытку отбивает с ошибкой превышен лимит сессий и в биллинге и на брасе сессия закрывается
- вторая попытка проходит норм

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 08 июн 2018, 12:20 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
Хм, посмотрел - действительно, ломятся с того же mac-а бывает. Не знаю уж, как это физически выглядит и зачем.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 14 июн 2018, 15:48 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
Порылся в коде, нашёл интересную фичу: когда биллинг обнаруживает ребут устройства (через 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.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 14 июн 2018, 15:58 
Не в сети
Разработчик
Аватара пользователя

Зарегистрирован: 19 дек 2006, 21:04
Сообщения: 5970
Карма: 256
Я примерно это и имел ввиду здесь:
Цитата:
есть закрытие сессий, которые начались более чем 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.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 14 июн 2018, 16:04 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
Хм, посмотрю завтра, спасибо. Надо свежие либы скачать, т.к. в своих не вижу упоминаний stopAllForDeviceId


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 14 июн 2018, 16:05 
Не в сети
Разработчик
Аватара пользователя

Зарегистрирован: 19 дек 2006, 21:04
Сообщения: 5970
Карма: 256
Да, закрытие устаревших не так давно добавили.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 5 часов [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
POWERED_BY
Русская поддержка phpBB
[ Time : 0.174s | 38 Queries | GZIP : On ]