BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 22 июн 2025, 04:02

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




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Команда для Manad linux с hex значением
СообщениеДобавлено: 31 мар 2009, 19:20 
Не в сети

Зарегистрирован: 26 фев 2009, 18:42
Сообщения: 46
Карма: 0
Уважаемый all кто сможет мне помочь в следующей задаче?

С биллинга при открытии шлюза в манад посылается команда типа:
Код:
tc filter add dev eth0 parent 1:0 protocol ip prio [N1] u32 match ip dst {A}  flowid 1:[N1]


А теперь смотрим случай когда шейпер построен с использованием хэш-таблиц, т.е. запрос будет таким:

Код:
tc filter add dev eth0 parent 1:0 protocol ip prio [N1] ht 2: D2: u32 match ip dst {A}  flowid 1:[N1]


здесь в фильтре появляется номер хэш таблицы в hex формате 2: D2:
2: D2: - это для примера, этот номер таблицы всегда будет соответствовать последним 2м байтам IP адреса т.е. 2.210 (D2=210)

Соответственно, я так думаю из {А} нужно выхватить последние 2 октета и преобразовать их в hex, потом снова в строку и уже потом отправить в манад... либо делать преобразование на стороне манад.


Где и как правильнее сделать преобразование?
1) т.е. Можно ли в биллинге и какими командами beanshell реализовать подобное ... и самое главное в какой момент и где? или можно как то по другому выкрутиться?

2) Если делать преобразование в manad? то в каком месте скрипта?
думаю перлом можно давольно легко сделать такую опреацию над переменной...

Спасибо


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 01 апр 2009, 19:07 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
ну 2 варианта.. либо манад подменить скриптовым шлюзом либо в перле ..можно и там и там


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 05 апр 2009, 17:23 
Не в сети

Зарегистрирован: 26 фев 2009, 18:42
Сообщения: 46
Карма: 0
Такой manad используется по умолчанию биллингом?
http://wiki.bgbilling.ru/index.php/%D0% ... _BeanShell

и еще вопрос - откуда берутся A и N переменные?
точнее понятно что в A хранится адрес по договору, но где это все можно посмотреть, может быть можно руками добавить какую-нибудь
переменную X туда же где A, которая и будет хранить hex
?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 06 апр 2009, 15:55 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
Yellowfox писал(а):
Такой manad используется по умолчанию биллингом?
http://wiki.bgbilling.ru/index.php/%D0% ... _BeanShell

да, это его аналог ..
Yellowfox писал(а):
и еще вопрос - откуда берутся A и N переменные?
точнее понятно что в A хранится адрес по договору, но где это все можно посмотреть, может быть можно руками добавить какую-нибудь
переменную X туда же где A, которая и будет хранить hex
?

вообще вся логика работы зашита в ManadUtils.generateRule - оттуда уже возращается реальные команды с подственными A и N .
Можно либо работать уже с результатом , т.е найти ip в каждой строке и понему туда вставить " 2: D2:" . Либо вам придется самим реализовать логику ManadUtils.generateRule и там уже вставлять ..


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 07 апр 2009, 04:39 
Не в сети

Зарегистрирован: 26 фев 2009, 18:42
Сообщения: 46
Карма: 0
Получилось. Сначала думал сделать в перловом скрипте.. да java поддалась куда легче.
и в одном и в другом я дилетант.

строку запроса сделал такую

Цитата:
tc filter add dev ifb0 protocol ip parent 1:1 pref 2[N1] u32 ht1{A}1ht match ip dst {A} flowid 1:1[N1]


и в скрипте шлюза дополнил функцию dosync
Код:
void doSync()
{
//Несколько переменных
String ht_rule, ht_replace, ht_str, ht_hex;
int ht_index1, ht_index2;

   host = gate.getHost();
   port = gate.getPort();
   gid = gate.getId();
 
   if ( log.isDebugEnabled() )
   {
       log.debug( gid + " gate: " + host + ":" + port );
   }
 
 
   try
   {
      socket = new Socket( host, port );
      out = new PrintWriter( socket.getOutputStream(), true );
      isr = new InputStreamReader( socket.getInputStream() );
      in = new BufferedReader( isr );
 
      out.println( "test" );
      kods = in.readLine();
 
        if ( log.isDebugEnabled() )
        {
            log.debug( gid + " Test => " + kods + "\n" );
        }
 
      // список открытых договоров с шлюза
      gateRules = new HashSet( 5, 5 );
      st = new StringTokenizer( kods );
      while ( st.hasMoreTokens() )
      {
         gateRules.add( new Integer( st.nextToken() ) );
      }
 
      for( i = 0; i < statusList.size(); i++ )
      {
         status = statusList.get(i);
         cid = status.contractId;
 
         // флаг того то правило есть на шлюзе
         flag = false;
 
         // правило для этого договора есть на шлюзе
         if ( gateRules.contains( cid ) )
         {
            //   если правило есть а юзер заблокирован - удаляем правило
            if ( status.status > 0 )
                {
               rule = getRule( status );
               command = "remove\t" + cid.intValue() + "\t" + rule;
               out.println( command );
               out.println( rule );
                    if ( log.isDebugEnabled() )
                    {
                        log.debug( gid + " " + command );
                    }
                }                  
 
            flag = true;
            gateRules.remove( cid );
         }
 
         // правила нет, а юзер открыт
         if ( !flag &&
            status.status == IPNContractStatus.STATUS_OPEN )
         {
            rule = getRule( status );
      while (rule.indexOf("ht1") > -1){         
         ht_index1 = rule.indexOf("ht1");   
         ht_index2 = rule.indexOf("1ht");
         //Вырезаем ip адрес и здесь же последние 2 октета ip адреса... добавляем точку
         ht_rule = (rule.substring(ht_index1+3, ht_index2)).substring(8)+".";
         //ht_rule = 2.210.
         ht_str = ht_rule.substring((ht_rule.indexOf("."))+1, (ht_rule.lastIndexOf(".")));
         //ht_str="210"
         ht_hex = Integer.toHexString(Integer.parseInt(ht_str));
         //ht_hex = d2
         ht_rule = "ht "+(ht_rule.replace(ht_str, ht_hex)).replace('.',':');
         //ht_rule = ht 2:d2:
         //Меняем все что между тегов ht1 и 1ht вместе с самими тегами
         ht_replace = rule.substring(ht_index1, ht_index2+3);
         rule = rule.replace(ht_replace, ht_rule);
      }
            command = "add\t" + cid.intValue() + "\t" + rule;
            out.println( command );
 
             if ( log.isDebugEnabled() )
                {
                    log.debug( gid + " " + command );
                }
         }
      }
 
      in.close();
      out.close();
      socket.close();
   }
   catch ( e )
   {
                e.printStackTrace();
      log.error( "error while gate sync :" + e.getMessage(), e );
      throw new RuntimeException ( e );
   }
}   


вот собственно все. может быть можно и красивее...главное работает
комментарии сделаны для случая когда ip = 192.168.2.210

а вот еще...в скрипте шлюза есть 2 вида правил: типизированное и пользовательское - без типа.
не могли бы разработчики пояснить в чем разница и где и когда и какие правила используются.
спасибо.

UPD. переписал код, чтобы вычисления применялись ко всем правилам, до этого только до 2го адреса в договоре работало :oops:


Последний раз редактировалось Yellowfox 09 апр 2009, 00:51, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 07 апр 2009, 15:56 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
Yellowfox писал(а):
а вот еще...в скрипте шлюза есть 2 вида правил: типизированное и пользовательское - без типа.
не могли бы разработчики пояснить в чем разница и где и когда и какие правила используются.
спасибо.


пользовательское - это вы набили команды и они послались как есть (без всяких подсвтновок {A} и т.п) для данного конретного клиента на шлюзе. ваша обработка к ним тоже не применяется (она у вас в условии else)


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

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


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

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


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

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