BiTel

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

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




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
СообщениеДобавлено: 03 дек 2013, 17:32 
Не в сети
Клиент

Зарегистрирован: 02 дек 2009, 12:28
Сообщения: 93
Откуда: Ленинградская обл.
Карма: 5
Добавлено: В продолжение темы: возник еще вопрос по работе этого скрипта: 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)

Где я напортачил?
ADD
Centos 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)



Последний раз редактировалось crez 06 фев 2014, 14:17, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 03 дек 2013, 17:52 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 16 сен 2010, 11:53
Сообщения: 501
Карма: 15
яву 1.7 на сервере вроде пока не рекомендуют...

_________________
Клиент: вер. 7.0.806 / 29.04.2016 13:18:28 os: Windows 7; java: Java HotSpot(TM) Client VM, v.1.8.0_66
Сервер: вер. 7.0.1035 / 29.04.2016 13:17:38 os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_92


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 03 дек 2013, 17:59 
Не в сети
Клиент

Зарегистрирован: 02 дек 2009, 12:28
Сообщения: 93
Откуда: Ленинградская обл.
Карма: 5
Как раз по ссылке из документации по установке выкачана.
Цитата:
5.2. JDK

Java - язык, на котором написан биллинг, является интерпретируемым и запускается с помощью специальной программы - Java-машины. Для нормальной работы необходимо JDK версии 1.6.0, либо выше. Последнюю версию для вашей платформы можно найти по адресу http://www.oracle.com/technetwork/java/javase/downloads. Необходимо загрузить именно Java SE JDK(Java-машина + средства разработки), а не JRE (только Java-машина), т.к. биллинг использует динамическую компиляцию кода, кроме того, средства разработки могут быть полезны при расследовании нештатных ситуаций в системе.

Обратите внимание, что для нормальной работы приложений биллинга необходима JDK производства Oracle. Соответственно, приложения биллинга, в общем случае, могут быть запущены на любой платформе, для которой выпускается JDK. Это Windows, Linux, Solaris. В официальной поставке включены скрипты запуска только для Linux (Bash скрипты, скрипты сервисов для RPM-дистрибутивов) и Windows (Batch).

JDK должна быть установлена на всех серверах с компонентами биллинга, в т.ч. на клиентских машинах. Также JDK необходим для запуска ActiveMQ.

"Для нормальной работы необходимо JDK версии 1.6.0, либо выше. Последнюю версию для вашей платформы можно найти по адресу http://www.oracle.com/technetwork/java/javase/downloads.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 03 дек 2013, 18:28 
Не в сети
Разработчик
Аватара пользователя

Зарегистрирован: 19 дек 2006, 21:04
Сообщения: 5970
Карма: 256
import ru.bitel.common.Utils;
вместо
import bitel.billing.server.util.Utils;


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 03 дек 2013, 18:56 
Не в сети
Клиент

Зарегистрирован: 02 дек 2009, 12:28
Сообщения: 93
Откуда: Ленинградская обл.
Карма: 5
Верно подмечено!
Закомментировал import bitel.billing.server.util.Utils;, команда прошла. Пока разбираюсь со следующей ошибкой...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 03 дек 2013, 19:10 
Не в сети
Клиент

Зарегистрирован: 02 дек 2009, 12:28
Сообщения: 93
Откуда: Ленинградская обл.
Карма: 5
Все заработало! Спасибо!
Рабочий скрипт для 6.0 выглядит так:
Код:
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 ru.bitel.common.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.toIntegerList( 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.parseInt( 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;
}


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 27 янв 2014, 16:54 
Не в сети
Клиент

Зарегистрирован: 02 дек 2009, 12:28
Сообщения: 93
Откуда: Ленинградская обл.
Карма: 5
Едем дальше с доработкой скрипта.
Тестируем модуль ТВ, в результате понадобилось вставить в скрипт строчки, добавляющие в комментарий порта № договора абонента.
В добавляющие и удаляющие правила добавил соответственно:
Код:
// Добавляем к порту комментарий с № договора
"config ports ${port} description ${desc}"

// Удаляем комментарий с порта
"config ports ${port} clear_description"

Осталось дело за малым - получить переменную desc. А вот с этим я и сломал голову :)
Помогите получить getContractTitle. В какое место скрипта его вставить и как.


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

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


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

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


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

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