Получилось. Сначала думал сделать в перловом скрипте.. да 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го адреса в договоре работало 