forum.bitel.ru
http://forum.bitel.ru/

реализация безлимитного тарифа с переменной скоростью
http://forum.bitel.ru/viewtopic.php?f=7&t=324
Страница 1 из 1

Автор:  msh [ 03 авг 2007, 17:22 ]
Заголовок сообщения:  реализация безлимитного тарифа с переменной скоростью

как реализовать с помощью bgbilling безлимитный тарифный план со скоростью, зависящей от потребленного в данном отчетном периоде траффика. я так понимаю что по достижении предела потребленного траффика абоненту меняется шлюз. возникшие вопросы:
1)как отловить событие превышения порогового объема траффика? среди стандартных событий по которым запускаются скрипты нужного события я не нашел;
2)где в тарифном плане хранить информацию о порогах траффика и соответсвющих им шлюзах?

зажатие скорости выполняется PC-роутером, VPN не используется

сейчас в используемым нами биллинге использется внешний по отношению к биллингу скрипт, который переодически запускаясь считывает из базы тарифы и потребленный траффик, вычисляет по этим параметрам скорость канала. недостатком является то что скрость и лимиты тпаффика жестко прописаны в скрипте и их нельзя изменить через интерфейс биллинга.

как аналогичную функциональность сделать идеологически правильно в BGBiliing?

Автор:  Администратор [ 06 авг 2007, 11:47 ]
Заголовок сообщения: 

1) Есть событие таймера
2) Хранить можно в скрипте в привязке к тарифам

Автор:  Администратор [ 31 авг 2007, 11:51 ]
Заголовок сообщения: 

Достаточно ли будет в нашем биллинге сделать вызов скрипта? Какие параметры должны быть в него переданы и в каком формате?

Автор:  msh [ 27 окт 2007, 19:42 ]
Заголовок сообщения: 

Администратор писал(а):
Достаточно ли будет в нашем биллинге сделать вызов скрипта? Какие параметры должны быть в него переданы и в каком формате?


так скрипт и так вызывается по таймеру
алгоритм видимо должен быть такой:
цикл для всех пользователей
begin
-запоминаем текущий тип правила шлюза;
-по тарифу пользователя и потребленному траффику в текущем периоде определяем новое значение типа правила шлюза;
-если новое значение не совпадает со старым значением то
begin
--меняем тип правила шлюза,
--если шлюз открыт
begin
--закрываем шлюз;
--открываем шлюз;
end;
end;
end;

я так понимаю это можно написать на BGBS

ну а если делать правильно то надо делать в тарифе еще одно свойство тип правила шлюза (причем правило должно уметь привязываться к типу шлюза, тк могут использоваться одновременно два шлюза (например manad и IPN_RADIUS)

PS: а где посмотреть лог выполнения скрипта, который запускается по событию таймера?

Автор:  msh [ 14 апр 2008, 01:11 ]
Заголовок сообщения: 

Администратор писал(а):
1) Есть событие таймера
2) Хранить можно в скрипте в привязке к тарифам

Какой класс в BGBS хранит информацию о потребленном траффике а отчетном периоде?

Автор:  Администратор [ 15 апр 2008, 16:35 ]
Заголовок сообщения: 

Класса нет, таблица есть ipn_contract_data_<mid>_yyyyMM. У нас не для всего API есть.

Автор:  SPY [ 09 июн 2008, 02:50 ]
Заголовок сообщения: 

Заранее извиняюсь перед автором темы, что пишу тут: не хотелось плодить новых тем, название подходящее.

В настоящее время мы вводим группу новых безлимитных тарифных планов в которых абоненту выделяется полоса в канале и некоторый объем трафика, после потребления которого полоса изменяется. Стоим перед выбором как оптимальнее осуществить динамическое изменение полосы пропускания для каждого клиента. Весь трафик ходит через cроутер cisco.
Есть мысли по реализации:
Вариант 1: Сервер с биллингом превращаем в шлюз, настраиваем manad. Каким образом управлять шлюзом manad и получится ли так менять полосу?
Вариант 2: Каким-либо образом при превышении лимита потребленного трафика запускать скрипт, изменяющий конфиг роутера cisco. Это менее безопасно, но эффектифнее.

Возможно я вообще иду в неправильном направлении?

Жду комментариев и подсказок. Заранее всем благодарен!

Автор:  stark [ 09 июн 2008, 21:35 ]
Заголовок сообщения: 

SPY писал(а):
Заранее извиняюсь перед автором темы, что пишу тут: не хотелось плодить новых тем, название подходящее.

В настоящее время мы вводим группу новых безлимитных тарифных планов в которых абоненту выделяется полоса в канале и некоторый объем трафика, после потребления которого полоса изменяется. Стоим перед выбором как оптимальнее осуществить динамическое изменение полосы пропускания для каждого клиента. Весь трафик ходит через cроутер cisco.
Есть мысли по реализации:
Вариант 1: Сервер с биллингом превращаем в шлюз, настраиваем manad. Каким образом управлять шлюзом manad и получится ли так менять полосу?
Вариант 2: Каким-либо образом при превышении лимита потребленного трафика запускать скрипт, изменяющий конфиг роутера cisco. Это менее безопасно, но эффектифнее.

Возможно я вообще иду в неправильном направлении?

Жду комментариев и подсказок. Заранее всем благодарен!


В текущий момент при тарификации не вызывается ни сихронизация с manad ни какой-либо внешний скрипт . Вообще есть идея реализовать смену правил шлюзов IPN в зависимости от наработки(и других условий) при тарификации , начата работа в этом направлении и мы надеемся успеть это сделать в версии 4.5 . Тогда можно будет это делать для всех шлюзов , в том числе и для Manad

Автор:  SPY [ 09 июн 2008, 23:16 ]
Заголовок сообщения: 

Печально. Выходт, что мне не остается больше вариантов как писать свой скрипт(или программу) которая будет переодически вытаскивать из базы значение наработки по трафику и запускать те или иные ограничения?
Есть ли возможность хоть как-то автоматизировать процесс выполнения открытия\закрытия шлюза в зависимости от наработки по трафику?
Кроме всего прочего, я хотел поинтересоваться: не будет ничего страшного если при открытии шлюза будет ограничиваться полоса пропускания трафика до одного значения, а при закрытии шлюза не отрубаться клиент а ограничиваться полоса пропускания до другого значения?

Автор:  SPY [ 10 июн 2008, 11:34 ]
Заголовок сообщения: 

Так, еще есть идея реализовать замысел так:
1. Если при выполнении действия "Проверка шлюзов IPN" в планировщике происходит проверка лимитов пользователя у клиента, в зависимости о того положительный или отрицательный у него баланс, блокируется или разблокируется шлюз.
2. Необходимо сделать фиктивный тарифный план, в котором со счета пользователя за каждую еденицу потребленного трафика будет списываться некая сумма. Соответственно, когда пользователь будет иметь отрицательный баланс шлюз заблокируется.
3. Необходимо предусмотреть, чтобы после превышения барьера по потребленному трафику с пользователя не списывались эти фиктивные ден.средства, чтобы всегда одной и той же суммой делать баланс "положительным".

Остаются вопросы:
- Как ежемесячно автоматически закидывать пользователю на баланс определенную фиктивную сумму?
- Можно ли ограничивать трафик так, как я написал в пред. посте?

Автор:  SPY [ 12 июн 2008, 23:45 ]
Заголовок сообщения: 

Все еще жду ответа...

Автор:  stark [ 19 июн 2008, 16:55 ]
Заголовок сообщения: 

SPY писал(а):
Печально. Выходт, что мне не остается больше вариантов как писать свой скрипт(или программу) которая будет переодически вытаскивать из базы значение наработки по трафику и запускать те или иные ограничения?
Есть ли возможность хоть как-то автоматизировать процесс выполнения открытия\закрытия шлюза в зависимости от наработки по трафику?
Кроме всего прочего, я хотел поинтересоваться: не будет ничего страшного если при открытии шлюза будет ограничиваться полоса пропускания трафика до одного значения, а при закрытии шлюза не отрубаться клиент а ограничиваться полоса пропускания до другого значения?


Ваш скрипт должен менять не только на шлюзе скорость, но и роставлять новое правило для данного договора в базу .. иначе отработает планировщик (или оператор из интерфейса откроет/закроет шлюз ) и пропадут ваши установки скорости .. Вообще я писал уже что в 4.5 мы планируем(если успеем ) сделать возможность в тарифе ipn менять правила в зависимости от наработки, можно подождать релиз. Покак правда до концка не совсем ясно как это будет выглядить

Скрипт можно сделать и сейчас ..примерный алгорим работы msh написал выше в этой теме ..

Автор:  stark [ 19 июн 2008, 17:07 ]
Заголовок сообщения: 

SPY писал(а):
Остаются вопросы:
- Как ежемесячно автоматически закидывать пользователю на баланс


Скриптом по событию таймера

Автор:  msh [ 02 июл 2008, 02:30 ]
Заголовок сообщения: 

алгоритм видимо должен быть такой:
цикл для всех пользователей
begin
-запоминаем текущий тип правила шлюза;
-по тарифу пользователя и потребленному траффику в текущем периоде определяем новое значение типа правила шлюза;
-если новое значение не совпадает со старым значением то
begin
--меняем тип правила шлюза,
--если шлюз открыт
begin
--закрываем шлюз;
--открываем шлюз;
end;
end;
end;

событию таймера?[/quote]

вот собственно скрипт
кроме ограничения скорости при усиленном качании он также проставляет скорость пользователям в зависимости от тарифа

Код:
import bitel.billing.server.contract.bean.*;
import bitel.billing.server.script.event.*;
import bitel.billing.server.tariff.bean.*;
import bitel.billing.server.ipn.bean.*;
import java.util.*;
import java.text.*;

//номер контракта
cid = event.getContractID();

//получение названия нужной таюлици с траффиком
evdate=event.getGenerateTime();
datefrm = new SimpleDateFormat("yyyyMM");
evyear=datefrm.format(evdate.getTime()).toString();

//получение траффика пользователя в данном отчетном периоде
ps = con.prepareStatement("SELECT SUM(amount) FROM ipn_contract_data_3_"+evyear+" WHERE cid=? AND sid=1");
ps.setInt( 1, cid);
rs = ps.executeQuery();
rs.first();
traffic = rs.getLong(1)/1073741824; //в гигабайтах

//получение текущего тарифа пользователя
//ctm =  new ContractTariffManager(  con );
//currentTariffID = ctm.getContractTariff( cid, evdate).getTariffPlanID();

ctm =  new ContractTariffManager(  con );

// текущий тарифный план
currentTarifList=ctm.getContractTariffList(cid, evdate);

//получение списка тарифов для для группы тарифов пользователя
ctgm=new ContractTariffGroupManager(con);
currentGroup=ctgm.getContractTariffGroup(cid, evdate);
if ( currentGroup == null ){
   error("no tarif group");
   return;
}
currentGroupID=currentGroup.getTariffGroupID();
tgm= new TariffGroupManager(con);
tariflist=tgm.getTariffGroupByID(currentGroupID).getPlanIdList();

for( Iterator it = currentTarifList.iterator(); it.hasNext();){
   currTarif = it.next();
   if (tariflist.contains(currTarif.getTariffPlanID().toString())) {
//      print("found_planID"+currTarif.getTariffPlanID());
      chTariff=currTarif;
      break;      
   }
//   print("check_plan"+currTarif.getTariffPlanID());
}


if( chTariff == null ){
 error( "Current tariff not found" );
 return;
}

currentTariffID=chTariff.getTariffPlanID();


//получение текущего типа шлюза пользователя
ugrm = new UserGateRuleManager( con, 3 );
rules = ugrm.getUserGateRules( cid );
for( Iterator it = rules.iterator(); it.hasNext(); ){
   currule = it.next();
   if (currule.getGateID() == 1){ //gate IPN
      ruletypeID=currule.getRuleTypeId();
      break;
   }
   print("gates="+currule.getGateID());
}


//расчет скорости пользователя в зависимости от тарифа
switch ( currentTariffID ){
   case 7:
      // план Нимбо-1 3мбит/c
      if (traffic < 50){
         newruleTypeID=4;
      }else{
         newruleTypeID=12;
      }
   break;

   case 8:
      // план Нимбо-2 5мбит/c
      if (traffic < 50){
         newruleTypeID=15;
      }else{
         newruleTypeID=12;
      }
   break;

   case 9:
      // план Нимбо-3 7мбит/c
      if (traffic < 100){
         newruleTypeID=16;
      }else{
         newruleTypeID=12;
      }
   break;

   case 10:
      // план Нимбо-4 10мбит/c
      if (traffic < 100){
         newruleTypeID=8;
      }else{
         newruleTypeID=11;
      }
   break;

   case 11:
      // план Нимбо-5 15мбит/c
      if (traffic < 100){
         newruleTypeID=17;
      }else{
         newruleTypeID=11;
      }
   break;

   case 12:
      // план Нимбо-6 20мбит/c
      if (traffic < 100){
         newruleTypeID=9;
      }else{
         newruleTypeID=11;
      }
   break;


   case 15:
      //бесплатный тариф 3Мбит/c
      if (traffic < 100){
         newruleTypeID=4;
      }else{
         newruleTypeID=12;
      }
   break;




   case 4:
      // план траффик 50мбит/c
      newruleTypeID=10;
   break;

   case 3:
      // план почтовый 50мбит/c
      newruleTypeID=10;
   break;

   case 5:
      // план Серфер 50мбит/c
      newruleTypeID=10;
   break;

   default:
      // 64 кбит/с
      newruleTypeID=14;
}



print("traffic="+traffic+" tarif="+currentTariffID+" rule="+ruletypeID+"newrule="+newruleTypeID);

//если новое правило отличается от существующего то обновляем
if (newruleTypeID != ruletypeID){
   currule.setRuleTypeId(newruleTypeID);
   ugrm.updateUserGateRule( String.valueOf( currule.getID() ), currule );

   // обновление правила на манаде
   csm = new IPNContractStatusManager( con, 3 );

   status =  csm.getContractStatus( cid );
   userID=1; //admin
   // открытие и закрытие шлюза (1-шлюз закрыт)
   csm.changeStatus( cid, 1, userID.intValue(), true );
   csm.changeStatus( cid, status, userID.intValue(), true );
}

Автор:  SPY [ 12 ноя 2008, 20:45 ]
Заголовок сообщения: 

Уважаемые знатоки BeanShell, хочу реализовать скрипт, описанный блок-схемой, прикрепленной ниже. Прошу помощи, ибо я не программист.
Идея такова:
Сприпт должен постоянно проверять статус шлюза и наработку по трафику в случае, если при открытом шлюзе трафик > 2Гб шлюз закрывается, а если при закрытом шлюзе трафик < 2Гб (в начале месяца) то шлюз открывается. Правильно ли я составил блок-схему?
И несколько вопросов.
1. Если я хочу, чтобы проверка производилась непрерывно мне необходимо вставить скрипт в "автоматизация->скрипт поведения->таймер"?
2. Связан ли таймер с шедуллером? (не нашел в документации)

Вложения:
bb-bs.jpg
bb-bs.jpg [ 52.52 КБ | Просмотров: 7895 ]

Автор:  stark [ 17 ноя 2008, 19:47 ]
Заголовок сообщения: 

SPY писал(а):
И несколько вопросов.
1. Если я хочу, чтобы проверка производилась непрерывно мне необходимо вставить скрипт в "автоматизация->скрипт поведения->таймер"?

да.
SPY писал(а):
2. Связан ли таймер с шедуллером? (не нашел в документации)

[/quote]
да.

У вас какой шлюз используется ? какая версия биллинга сейчас ?

Автор:  SPY [ 18 ноя 2008, 12:21 ]
Заголовок сообщения: 

Шлюз cisco, как раз тот вариант, который так размусоливается в соседней теме :)
Версия биллинга 4.5
Цитата:
Цитата:
2. Связан ли таймер с шедуллером? (не нашел в документации)

Да

Шедуллер просто обрабатывает события таймера будучи запущенным или необходимо указывать доп. параметры к этой процедуре в настройках шедуллера?

Я предполагаю, что скрипт будет очень похож на тот, который приводил msh.... Если привести пример именно моей реализации не просто, накидайте пожалуйста хотя бы шаблон с реализацие необходимых циклов, условий и операций на beanshell...

Автор:  SPY [ 24 ноя 2008, 15:44 ]
Заголовок сообщения: 

Выставляю на суд публики слегка переделаный скрипт, который должен переодически проверять наработку по трафику для всех договоров и выполнять действия, описанные блоксхемой выше.
Код:
import bitel.billing.server.contract.bean.*;
import bitel.billing.server.script.event.*;
import bitel.billing.server.tariff.bean.*;
import bitel.billing.server.ipn.bean.*;
import java.util.*;
import java.text.*;


//номер контракта
cid = event.getContractID();

//получение названия нужной таблици с траффиком
evdate=event.getGenerateTime();
datefrm = new SimpleDateFormat("yyyyMM");
evyear=datefrm.format(evdate.getTime()).toString();

//получение траффика пользователя в данном отчетном периоде
ps = con.prepareStatement("SELECT SUM(amount) FROM ipn_contract_data_3_"+evyear+" WHERE cid=? AND sid=1");
ps.setInt( 1, cid);
rs = ps.executeQuery();
rs.first();
traffic = rs.getLong(1)/1073741824; //в гигабайтах

//получение текущего типа шлюза пользователя
ugrm = new UserGateRuleManager( con, 3 );
rules = ugrm.getUserGateRules( cid );
for( Iterator it = rules.iterator(); it.hasNext(); ){
   currule = it.next();
   if (currule.getGateID() == 1){ //gate IPN
      ruletypeID=currule.getRuleTypeId();
      break;
   }
   print("gates="+currule.getGateID());
}

currentTariffID=chTariff.getTariffPlanID(); // получение id тарифного плана, в которых описаны лимиты по наработке

csm = new IPNContractStatusManager( con, 3 );
status =  csm.getContractStatus( cid );
userID=1; //admin

switch ( currentTariffID ){

case 1:  // id=1 - тариф с наработкой 2 Гб до закрытия шлюза
      if ((traffic>2)&&(status=1)){
        csm.changeStatus( cid, 1, userID.intValue(), true ); //закрыт
    }else{
        If traffic<2{
   csm.changeStatus( cid, 2, userID.intValue(), true ); //открыт
   }else{
   csm.changeStatus( cid, 1, userID.intValue(), true ); //закрыт
   }
   }
    break;

case 2:  // id=2 - тариф с наработкой 2 Гб до закрытия шлюза
      if ((traffic>2)&&(status=2)){
        csm.changeStatus( cid, 1, userID.intValue(), true ); //закрыт
    }else{
        If traffic<2{
   csm.changeStatus( cid, 2, userID.intValue(), true ); //открыт
   }else{
   csm.changeStatus( cid, 1, userID.intValue(), true ); //закрыт
   }
   }
    break;
}

Скрипт пока не опробован, прошу проверить правильность синтаксиса beanshell и еще пара вопросов:
1. При закрытии шлюза необходимо передать в csm.changeStatus параметр "1", а при открытии? "2" или "0"?
2. В параметрах условного оператора if правильно ли я указал "&&" если имелось в виду "логическое И" (AND)

Автор:  stark [ 25 ноя 2008, 02:03 ]
Заголовок сообщения: 

1. Для статуса можете использовать константы :
bitel.billing.common.module.ipn.IPNContractStatus:

{
public static final int STATUS_OPEN = 0;
public static final int STATUS_CLOSED = 1;
public static final int STATUS_LOCK = 2;
public static final int STATUS_REMOVED = 3;
public static final int STATUS_HARD_LOCK = 4;
}
2. Да ..логическое - && . Если просто &, то это битовая операция. в случае логических выражений тоже будет работаь, но там ее не принято использовать .

3.Имя таблицы можно получить так :
bitel.billing.server.util.Utils.getModuleMonthTableName( "ipn_contract_data", month, mid );

month - объект типа Calendar.
mid - код модуля.

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/