forum.bitel.ru http://forum.bitel.ru/ |
|
Команда для Manad linux с hex значением http://forum.bitel.ru/viewtopic.php?f=7&t=2102 |
Страница 1 из 1 |
Автор: | Yellowfox [ 31 мар 2009, 19:20 ] |
Заголовок сообщения: | Команда для Manad linux с hex значением |
Уважаемый 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? то в каком месте скрипта? думаю перлом можно давольно легко сделать такую опреацию над переменной... Спасибо |
Автор: | stark [ 01 апр 2009, 19:07 ] |
Заголовок сообщения: | |
ну 2 варианта.. либо манад подменить скриптовым шлюзом либо в перле ..можно и там и там |
Автор: | Yellowfox [ 05 апр 2009, 17:23 ] |
Заголовок сообщения: | |
Такой manad используется по умолчанию биллингом? http://wiki.bgbilling.ru/index.php/%D0% ... _BeanShell и еще вопрос - откуда берутся A и N переменные? точнее понятно что в A хранится адрес по договору, но где это все можно посмотреть, может быть можно руками добавить какую-нибудь переменную X туда же где A, которая и будет хранить hex ? |
Автор: | stark [ 06 апр 2009, 15:55 ] |
Заголовок сообщения: | |
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 и там уже вставлять .. |
Автор: | Yellowfox [ 07 апр 2009, 04:39 ] |
Заголовок сообщения: | |
Получилось. Сначала думал сделать в перловом скрипте.. да 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го адреса в договоре работало ![]() |
Автор: | stark [ 07 апр 2009, 15:56 ] |
Заголовок сообщения: | |
Yellowfox писал(а): а вот еще...в скрипте шлюза есть 2 вида правил: типизированное и пользовательское - без типа.
не могли бы разработчики пояснить в чем разница и где и когда и какие правила используются. спасибо. пользовательское - это вы набили команды и они послались как есть (без всяких подсвтновок {A} и т.п) для данного конретного клиента на шлюзе. ваша обработка к ним тоже не применяется (она у вас в условии else) |
Страница 1 из 1 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |