Добавлено: В продолжение темы: возник еще вопрос по работе этого скрипта:
viewtopic.php?f=19&t=8742#p72914При переходе 5.1 -> 6.0 столкнулись с проблемой неработоспособности шлюза.
В 5.1 все работало, при апгрейде до 6.0 скрипт перестал работать.
Скрипт, работающий в 5.1:
Код:
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import bitel.billing.common.IPUtils;
import bitel.billing.common.module.ipn.IPNContractStatus;
import bitel.billing.server.ipn.UserStatus;
import bitel.billing.server.ipn.bean.ManadUtils;
import bitel.billing.server.ipn.bean.VlanManager;
import bitel.billing.server.ipn.dlink.UserPortStatus;
import ru.bitel.common.Preferences;
import bitel.billing.server.util.Utils;
import bitel.billing.server.util.telnet.TelnetSession;
import bitel.billing.server.ipn.GateWorker;
protected void doSync()
{
try
{
String host = gate.getHost();
int port = gate.getPort();
Preferences gateSetup = new Preferences( gate.getConfig(), "\r\n" );
String pswd = gate.getKeyword();
String login = gateSetup.get("login","admin");
int timeout = gateSetup.getInt( "timeout", 10000 );
int socketTimeout = gateSetup.getInt( "socket.timeout", 10000 );
StringBuffer result = new StringBuffer();
if( log.isDebugEnabled() )
{
log.debug( gate.getId() + " gate: " + host + ":" + port + " login: " + login + " pswd: " + pswd );
}
TelnetSession session = new TelnetSession( host, port);
session.setTimeout( timeout );
session.setSocketTimeTimeout( socketTimeout );
//session.setLoginPromptSequence( ":" );
session.setEndString( ":" );
log.debug( "before connect" );
session.connect();
log.debug( "after connect" );
result.append( session.doCommand( login ) );
log.debug( "after command" );
//session.setLoginPromptSequence( "#" );
session.setEndString( ":" );
result.append( session.doCommand( pswd ) );
log.debug( "before pswd" );
log.debug( "execute commands" );
doCommands( session, result, gateSetup);
//TODO commands here
//session.setLoginPromptSequence( "****" );
session.setEndString( "****" );
result.append( session.doCommand( "logout" ) );
log.debug( result.toString() );
log.debug( "ok" );
} catch (Exception e)
{
throw new RuntimeException ( e );
}
}
private void doCommands( TelnetSession session, StringBuffer result, Preferences gateSetup)
throws IOException
{
String openAddress = gateSetup.get( "open.address", "255.255.255.255" ) ;
log.debug( "openAddress = " + openAddress );
uplinks = Utils.stringToIntegerList( gateSetup.get( "uplink", "25,26,27,28" ) );
int vidlan = gateSetup.getInt( "vid.lan", 0 );
int vidwan = gateSetup.getInt( "vid.wan", 0 );
int vid = 0;
log.debug( "vid.lan = " + vidlan );
log.debug( "vid.wan = " + vidwan );
if ( vidlan==0 || vidwan==0 ) {
log.debug( "Не указаны параметры vid.lan, vid.wan. Без них шлюз работать не может." );
return 1;
}
List ports = getUserList( statusList );
String [] openRules = new String [] {
// Профиль 2 - Разрешаем клиенту ARP только с его IP
// разрешающие правила добавляются с номером порта клиента
// ip абонента в hex1 и hex2
"config access_profile profile_id 2 add access_id ${port} packet_content offset_chunk_2 0x806 mask 0xFFFF offset_chunk_3 0x${hex1} mask 0xFFFF offset_chunk_4 0x${hex2}0000 mask 0xFFFF0000 port ${port} permit",
// Профиль 3 - Разрешаем клиенту трафик с его IP
// разрешающие правила добавляются с номером порта клиента
// происходит привязка порта абонента к его IP
"config access_profile profile_id 3 add access_id ${port} ip source_ip ${ip} port ${port} permit",
// Включаем порт абонента
"config vlan vlanid ${vid} add untagged ${port}",
// Включаем ТВ на порту абонента
"config igmp_snooping multicast_vlan IPTV add member_port ${port}"
};
String [] closeRules = new String [] {
// Отключаем ТВ
"config igmp_snooping multicast_vlan IPTV delete member_port ${port}"
};
String [] deleteRules = new String [] {
// Профиль 2 - удаляем разрешения ARP
// правила удаляются с номером порта клиента
"config access_profile profile_id 2 delete access_id ${port}",
// Профиль 3 - удаляем разрешение на IP трафик с порта
"config access_profile profile_id 3 delete access_id ${port}",
// Удаляем порт абонента
"config vlan vlanid ${vid} delete ${port}"
};
for( UserPortStatus port : ports )
{
log.debug("port.ipAddr=" + port.ipAddr);
String ipaddress = port.ipAddr;
// проверка принадлежности порта к vlan
Pattern p = Pattern.compile("^193.*");
Matcher m = p.matcher( ipaddress );
Pattern p2 = Pattern.compile("^176.*");
Matcher m2 = p2.matcher( ipaddress );
if (m.find() || m2.find()) {
vid = vidwan;
} else {
vid = vidlan;
}
log.debug("vid=" + vid);
// ----------------------- HEX CONVERT ------------------------
StringTokenizer st=new StringTokenizer(ipaddress,".");
String o1,o2,o3,o4 = "";
String hex1, hex2 = "";
if( st.countTokens()==4 ) {
while( st.hasMoreTokens() ) {
o1 = st.nextToken();
o2 = st.nextToken();
o3 = st.nextToken();
o4 = st.nextToken();
}
i = Integer.parseInt(o1);
j = Integer.parseInt(o2);
k = Integer.parseInt(o3);
l = Integer.parseInt(o4);
o1 = Integer.toHexString(0x100 | i).substring(1);
o2 = Integer.toHexString(0x100 | j).substring(1);
o3 = Integer.toHexString(0x100 | k).substring(1);
o4 = Integer.toHexString(0x100 | l).substring(1);
hex1 = o1+o2;
hex2 = o3+o4;
print("hex ip=" + hex1 + " " + hex2);
}
// ------------------------------------------------------------
log.debug("status=" + port.status.status);
log.debug("-------------------");
log.debug("is opened="+IPNContractStatus.STATUS_OPEN);
log.debug("is closed="+IPNContractStatus.STATUS_CLOSED);
log.debug("is removed="+IPNContractStatus.STATUS_REMOVED);
log.debug("-------------------");
// удаляюшие правила
if ( port.status.status == IPNContractStatus.STATUS_REMOVED )
{
log.debug("-----------------REMOVE RULES -----------------");
for (String rule : closeRules) {
rule = setValues( rule, port.port, port.ipAddr, openAddress, vid, hex1, hex2 );
log.debug("rule=" + rule);
result.append( session.doCommand( rule ) );
}
for (String rule : deleteRules) {
rule = setValues( rule, port.port, port.ipAddr, openAddress, vid, hex1, hex2 );
log.debug("rule=" + rule);
result.append( session.doCommand( rule ) );
}
}
else
if ( port.status.status == IPNContractStatus.STATUS_OPEN )
{
log.debug("-----------------OPEN RULES -----------------");
// очищаем порт (на всякий случай) из LAN
for (String rule : deleteRules) {
rule = setValues( rule, port.port, port.ipAddr, openAddress, vidlan, hex1, hex2 );
log.debug("rule=" + rule);
result.append( session.doCommand( rule ) );
}
// очищаем порт (на всякий случай) из WAN
for (String rule : deleteRules) {
rule = setValues( rule, port.port, port.ipAddr, openAddress, vidwan, hex1, hex2 );
log.debug("rule=" + rule);
result.append( session.doCommand( rule ) );
}
// открывающие правила
for (String rule : openRules) {
rule = setValues( rule, port.port, port.ipAddr, openAddress, vid, hex1, hex2 );
log.debug("rule=" + rule);
result.append( session.doCommand( rule ) );
}
}
else //close
{
log.debug("-----------------CLOSE RULES BY DEFAUL -----------------");
for (String rule : closeRules) {
rule = setValues( rule, port.port, port.ipAddr, openAddress, vid, hex1, hex2 );
log.debug("rule=" + rule);
result.append( session.doCommand( rule ) );
}
}
}
}
private String setValues( String rule, int port, String ip, String openAddress, int vid, String hex1, hex2 )
{
rule = rule.replaceAll( "\\$\\{port\\}", String.valueOf( port ) );
rule = rule.replaceAll( "\\$\\{ip\\}" , ip );
rule = rule.replaceAll( "\\$\\{openAdress\\}", openAddress );
rule = rule.replaceAll( "\\$\\{vid\\}", String.valueOf( vid ) );
rule = rule.replaceAll( "\\$\\{hex1\\}" , hex1 );
rule = rule.replaceAll( "\\$\\{hex2\\}" , hex2 );
return rule;
}
protected void doParentSync()
{
}
public List getUserList( List statusList )
{
List userList = new ArrayList();
for( UserStatus status : statusList )
{
String rule = status.rule.getRuleText();
StringTokenizer st = new StringTokenizer( rule, ";" );
while( st.hasMoreTokens() )
{
String token = st.nextToken().trim();
data = token.split( ":" );
if( data.length == 2 )
{
UserPortStatus portStatus = new UserPortStatus();
portStatus.port = Utils.parseIntString( data[0] );
portStatus.ipAddr = data[1];
portStatus.status = status;
userList.add( portStatus );
}
else if ( data.length == 3 )
{
UserPortStatus portStatus = new UserPortStatus();
portStatus.port = Utils.parseIntString( data[0] );
portStatus.macAddr = data[1].toUpperCase().replaceAll( "\\-", " " );
portStatus.ipAddr = data[2];
portStatus.status = status;
userList.add( portStatus );
}
}
}
return userList;
}
После апгрейда до 6.0 стал выдавать ошибку:
Код:
12-03/15:19:13 INFO [Thread-20] DlinkGateWorker - Running script
12-03/15:19:14 ERROR [Thread-20] DlinkGateWorker - Eval error2: Attempt to resolve method: stringToIntegerList() on undefined variable or class name: Utils
Attempt to resolve method: stringToIntegerList() on undefined variable or class name: Utils : at Line: 100 : in file: inline evaluation of: ``import java.io.IOException; import java.util.ArrayList; import java.util.HashMap . . . '' : Utils .stringToIntegerList ( gateSetup .get ( "uplink" , "25,26,27,28" ) )
Called from method: doCommands : at Line: 65 : in file: inline evaluation of: ``import java.io.IOException; import java.util.ArrayList; import java.util.HashMap . . . '' : doCommands ( session , result , gateSetup )
at bsh.UtilEvalError.toEvalError(UtilEvalError.java:85)
at bsh.UtilEvalError.toEvalError(UtilEvalError.java:90)
at bsh.BSHMethodInvocation.eval(BSHMethodInvocation.java:99)
at bsh.BSHPrimaryExpression.eval(BSHPrimaryExpression.java:102)
at bsh.BSHPrimaryExpression.eval(BSHPrimaryExpression.java:47)
at bsh.BSHAssignment.eval(BSHAssignment.java:77)
at bsh.BSHBlock.evalBlock(BSHBlock.java:131)
at bsh.BSHBlock.eval(BSHBlock.java:81)
at bsh.BshMethod.invokeImpl(BshMethod.java:362)
at bsh.BshMethod.invoke(BshMethod.java:258)
at bsh.BshMethod.invoke(BshMethod.java:186)
at bsh.Name.invokeLocalMethod(Name.java:917)
at bsh.Name.invokeMethod(Name.java:804)
at bsh.BSHMethodInvocation.eval(BSHMethodInvocation.java:75)
at bsh.BSHPrimaryExpression.eval(BSHPrimaryExpression.java:102)
at bsh.BSHPrimaryExpression.eval(BSHPrimaryExpression.java:47)
at bsh.BSHBlock.evalBlock(BSHBlock.java:131)
at bsh.BSHBlock.eval(BSHBlock.java:81)
at bsh.BSHBlock.eval(BSHBlock.java:47)
at bsh.BSHTryStatement.eval(BSHTryStatement.java:86)
at bsh.BSHBlock.evalBlock(BSHBlock.java:131)
at bsh.BSHBlock.eval(BSHBlock.java:81)
at bsh.BshMethod.invokeImpl(BshMethod.java:362)
at bsh.BshMethod.invoke(BshMethod.java:258)
at bsh.BshMethod.invoke(BshMethod.java:161)
at bitel.billing.server.ipn.GateWorker$Scripter.invokeMethod(GateWorker.java:310)
at bitel.billing.server.ipn.GateWorker$Scripter.runScriptSync(GateWorker.java:266)
at bitel.billing.server.ipn.GateWorker.runSync(GateWorker.java:137)
at bitel.billing.server.ipn.GateWorker.run(GateWorker.java:95)
В
соседней теме выяснили, что изменилось написание команды:
Код:
uplinks = Utils.stringToIntegerList( gateSetup.get( "uplink", "25,26,27,28" ) );
Теперь, согласно
документации, команда должна выглядеть так:
Цитата:
toIntegerList
public static final java.util.List<java.lang.Integer> toIntegerList(java.lang.String valuesStr)
Похожа на toList(String). Разбивает строку на список целочисленных компоненов, разбитых по запятым. Пробелы тримаются. Если между запятыми не числа, распарсятся в нули.
Parameters:
valuesStr - исходная строка
Returns:
List список целых, всегда есть и не null, если входящая строка пустая, то будет пустым. Если между запятыми не числа, распарсится в нули.
See Also:
toString(Collection), toIntegerSet(String)
Меняю:
Код:
uplinks = Utils.toIntegerList( gateSetup.get( "uplink", "25,26,27,28" ) );
Добавляю в шапку:
Код:
import ru.bitel.common.Utils;
На выходе снова получаю ошибку:
Код:
12-03/15:30:10 INFO [Thread-34] DlinkGateWorker - Running script
12-03/15:30:10 ERROR [Thread-34] DlinkGateWorker - Eval error2: Attempt to resolve method: toIntegerList() on undefined variable or class name: Utils
Attempt to resolve method: toIntegerList() on undefined variable or class name: Utils : at Line: 101 : in file: inline evaluation of: ``import java.io.IOException; import java.util.ArrayList; import java.util.HashMap . . . '' : Utils .toIntegerList ( gateSetup .get ( "uplink" , "25,26,27,28" ) )
Called from method: doCommands : at Line: 66 : in file: inline evaluation of: ``import java.io.IOException; import java.util.ArrayList; import java.util.HashMap . . . '' : doCommands ( session , result , gateSetup )
at bsh.UtilEvalError.toEvalError(UtilEvalError.java:85)
at bsh.UtilEvalError.toEvalError(UtilEvalError.java:90)
at bsh.BSHMethodInvocation.eval(BSHMethodInvocation.java:99)
at bsh.BSHPrimaryExpression.eval(BSHPrimaryExpression.java:102)
at bsh.BSHPrimaryExpression.eval(BSHPrimaryExpression.java:47)
at bsh.BSHAssignment.eval(BSHAssignment.java:77)
at bsh.BSHBlock.evalBlock(BSHBlock.java:131)
at bsh.BSHBlock.eval(BSHBlock.java:81)
at bsh.BshMethod.invokeImpl(BshMethod.java:362)
at bsh.BshMethod.invoke(BshMethod.java:258)
at bsh.BshMethod.invoke(BshMethod.java:186)
at bsh.Name.invokeLocalMethod(Name.java:917)
at bsh.Name.invokeMethod(Name.java:804)
at bsh.BSHMethodInvocation.eval(BSHMethodInvocation.java:75)
at bsh.BSHPrimaryExpression.eval(BSHPrimaryExpression.java:102)
at bsh.BSHPrimaryExpression.eval(BSHPrimaryExpression.java:47)
at bsh.BSHBlock.evalBlock(BSHBlock.java:131)
at bsh.BSHBlock.eval(BSHBlock.java:81)
at bsh.BSHBlock.eval(BSHBlock.java:47)
at bsh.BSHTryStatement.eval(BSHTryStatement.java:86)
at bsh.BSHBlock.evalBlock(BSHBlock.java:131)
at bsh.BSHBlock.eval(BSHBlock.java:81)
at bsh.BshMethod.invokeImpl(BshMethod.java:362)
at bsh.BshMethod.invoke(BshMethod.java:258)
at bsh.BshMethod.invoke(BshMethod.java:161)
at bitel.billing.server.ipn.GateWorker$Scripter.invokeMethod(GateWorker.java:310)
at bitel.billing.server.ipn.GateWorker$Scripter.runScriptSync(GateWorker.java:266)
at bitel.billing.server.ipn.GateWorker.runSync(GateWorker.java:137)
at bitel.billing.server.ipn.GateWorker.run(GateWorker.java:95)
Где я напортачил?
ADDCentos 6.4
Код:
[root@home2 BGBillingServer]# uname -a
Linux home2.link-spb.ru 2.6.32-358.23.2.el6.x86_64 #1 SMP Wed Oct 16 18:37:12 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
[root@home2 BGBillingServer]# mysql --version
mysql Ver 14.14 Distrib 5.1.69, for redhat-linux-gnu (x86_64) using readline 5.1
[root@home2 BGBillingServer]# java -version
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)