BiTel

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

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




Начать новую тему Ответить на тему  [ Сообщений: 20 ] 
Автор Сообщение
 Заголовок сообщения: создание скриптового шлюза Zyxel
СообщениеДобавлено: 03 мар 2010, 19:29 
по wiki
http://wiki.bgbilling.ru/index.php/Реализация_стандартного_шлюза_коммутатора_Zyxel_(под_Cisco2)_на_BeanShell
Создал скриптовый тип шлюза, создал шлюз данного типа, но есть 2 проблемы
1. Когда в договоре заходишь в параметры шлюза, на вкладке switch в командах шлюза не меняется параметр {PORT} внутри тега <LOOP>, в стандартном шлюзе проблем таких нет.
2. Когда меняешь состояние шлюза, шлюз недоступен, хотя со стандартным шлюзом работает, а логах выдает ошибку, что класс Gate не найден. В скрипт шлюза добавил
import bitel.billing.server.ipn.bean.*, где и находится класс по доке.
сервер вер. 4.6 сборка 666 от 19.02.2010 16:48:52
ipn вер. 4.6 сборка 241 от 26.01.2010 12:37:04

Код:
03-03/18:18:46  INFO [Thread-12] CiscoSSHSwitchGateWorker - Running script
03-03/18:18:46 ERROR [Thread-12] CiscoSSHSwitchGateWorker - Eval error2: Sourced file: inline evaluation of: ``protected void doSync()  {     }  protected voi
d parentSync( Gate child, GateWor . . . '' : Class: Gate not found in namespace
Sourced file: inline evaluation of: ``protected void doSync()  {     }  protected void parentSync( Gate child, GateWor . . . '' : Class: Gate not found in nam
espace : at Line: 5 : in file: inline evaluation of: ``protected void doSync()  {     }  protected void parentSync( Gate child, GateWor . . . '' : Gate

        at bsh.BSHAmbiguousName.toClass(Unknown Source)
        at bsh.BSHType.getType(Unknown Source)
        at bsh.BSHFormalParameter.eval(Unknown Source)
        at bsh.BSHFormalParameters.eval(Unknown Source)
        at bsh.BSHMethodDeclaration.evalNodes(Unknown Source)
        at bsh.BSHMethodDeclaration.eval(Unknown Source)
        at bsh.Interpreter.eval(Unknown Source)
        at bsh.Interpreter.eval(Unknown Source)
        at bsh.Interpreter.eval(Unknown Source)
        at bitel.billing.server.ipn.GateWorker$Scripter.runScriptSync(GateWorker.java:217)
        at bitel.billing.server.ipn.GateWorker.doParentSync(GateWorker.java:152)
        at bitel.billing.server.ipn.GateWorker.run(GateWorker.java:84)
03-03/18:18:46 ERROR [Thread-12] LoggingPrintStream - java.lang.RuntimeException: Sourced file: inline evaluation of: ``protected void doSync()  {     }  prot
ected void parentSync( Gate child, GateWor . . . '' : Class: Gate not found in namespace : at Line: 5 : in file: inline evaluation of: ``protected void doSync
()  {     }  protected void parentSync( Gate child, GateWor . . . '' : Gate

03-03/18:18:46 ERROR [Thread-12] LoggingPrintStream -   at bitel.billing.server.ipn.GateWorker$Scripter.runScriptSync(GateWorker.java:231)
03-03/18:18:46 ERROR [Thread-12] LoggingPrintStream -   at bitel.billing.server.ipn.GateWorker.doParentSync(GateWorker.java:152)
03-03/18:18:46 ERROR [Thread-12] LoggingPrintStream -   at bitel.billing.server.ipn.GateWorker.run(GateWorker.java:84)
03-03/18:18:46 ERROR [Thread-12] LoggingPrintStream - Caused by: Sourced file: inline evaluation of: ``protected void doSync()  {     }  protected void parent
Sync( Gate child, GateWor . . . '' : Class: Gate not found in namespace : at Line: 5 : in file: inline evaluation of: ``protected void doSync()  {     }  prot
ected void parentSync( Gate child, GateWor . . . '' : Gate

03-03/18:18:46 ERROR [Thread-12] LoggingPrintStream -   at bsh.BSHAmbiguousName.toClass(Unknown Source)
03-03/18:18:46 ERROR [Thread-12] LoggingPrintStream -   at bsh.BSHType.getType(Unknown Source)
03-03/18:18:46 ERROR [Thread-12] LoggingPrintStream -   at bsh.BSHFormalParameter.eval(Unknown Source)
03-03/18:18:46 ERROR [Thread-12] LoggingPrintStream -   at bsh.BSHFormalParameters.eval(Unknown Source)
03-03/18:18:46 ERROR [Thread-12] LoggingPrintStream -   at bsh.BSHMethodDeclaration.evalNodes(Unknown Source)
03-03/18:18:46 ERROR [Thread-12] LoggingPrintStream -   at bsh.BSHMethodDeclaration.eval(Unknown Source)
03-03/18:18:46 ERROR [Thread-12] LoggingPrintStream -   at bsh.Interpreter.eval(Unknown Source)
03-03/18:18:46 ERROR [Thread-12] LoggingPrintStream -   at bsh.Interpreter.eval(Unknown Source)
03-03/18:18:46 ERROR [Thread-12] LoggingPrintStream -   at bsh.Interpreter.eval(Unknown Source)
03-03/18:18:46 ERROR [Thread-12] LoggingPrintStream -   at bitel.billing.server.ipn.GateWorker$Scripter.runScriptSync(GateWorker.java:217)
03-03/18:18:46 ERROR [Thread-12] LoggingPrintStream -   ... 2 more
03-03/18:18:46 ERROR [Thread-12] CiscoSSHSwitchGateWorker - Gate unaccesible - 10.176.76.110
03-03/18:18:46 ERROR [Thread-12] CiscoSSHSwitchGateWorker - -------------------------
03-03/18:18:46 ERROR [Thread-12] CiscoSSHSwitchGateWorker - error: Sourced file: inline evaluation of: ``protected void doSync()  {     }  protected void pare
ntSync( Gate child, GateWor . . . '' : Class: Gate not found in namespace : at Line: 5 : in file: inline evaluation of: ``protected void doSync()  {     }  pr
otected void parentSync( Gate child, GateWor . . . '' : Gate
java.lang.RuntimeException: Sourced file: inline evaluation of: ``protected void doSync()  {     }  protected void parentSync( Gate child, GateWor . . . '' :
Class: Gate not found in namespace : at Line: 5 : in file: inline evaluation of: ``protected void doSync()  {     }  protected void parentSync( Gate child, Ga
teWor . . . '' : Gate

        at bitel.billing.server.ipn.GateWorker$Scripter.runScriptSync(GateWorker.java:231)
        at bitel.billing.server.ipn.GateWorker.doParentSync(GateWorker.java:152)
        at bitel.billing.server.ipn.GateWorker.run(GateWorker.java:84)
Caused by: Sourced file: inline evaluation of: ``protected void doSync()  {     }  protected void parentSync( Gate child, GateWor . . . '' : Class: Gate not f
ound in namespace : at Line: 5 : in file: inline evaluation of: ``protected void doSync()  {     }  protected void parentSync( Gate child, GateWor . . . '' :
Gate

        at bsh.BSHAmbiguousName.toClass(Unknown Source)
        at bsh.BSHType.getType(Unknown Source)
        at bsh.BSHFormalParameter.eval(Unknown Source)
        at bsh.BSHFormalParameters.eval(Unknown Source)
        at bsh.BSHMethodDeclaration.evalNodes(Unknown Source)
        at bsh.BSHMethodDeclaration.eval(Unknown Source)
        at bsh.Interpreter.eval(Unknown Source)
        at bsh.Interpreter.eval(Unknown Source)
        at bsh.Interpreter.eval(Unknown Source)
        at bitel.billing.server.ipn.GateWorker$Scripter.runScriptSync(GateWorker.java:217)
        ... 2 more


Вернуться к началу
  
 
 Заголовок сообщения: Re: создание скриптового шлюза Zyxel
СообщениеДобавлено: 04 мар 2010, 15:23 
Не в сети
Разработчик

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: создание скриптового шлюза Zyxel
СообщениеДобавлено: 09 мар 2010, 11:27 
Скрипт взял по ссылке
Код:
import java.util.*;
import java.util.regex.*;
import java.util.regex.Pattern;
 
import bitel.billing.common.module.ipn.IPNContractStatus;
import bitel.billing.server.ipn.GateWorker;
import bitel.billing.server.ipn.UserStatus;
import bitel.billing.server.util.DefaultServerSetup;
import bitel.billing.server.util.ssh.SSHSession;
import bitel.billing.server.ipn.UserStatus;
import ru.bitel.bgbilling.common.DefaultSetup;
import bitel.billing.server.ipn.bean.*
//import bitel.billing.server.ipn.bean.ManadUtils;
//import bitel.billing.server.ipn.bean.VlanManager;
//import bitel.billing.server.ipn.bean.GateType;
//import bitel.billing.server.ipn.bean.LoopPattern;
//import bitel.billing.server.ipn.bean.RuleType;
 
protected void doSync()
{      
   log.info( "start of SSH_SWITCH........................................................");
    host = gate.getHost();
    port = gate.getPort();
 
    gateSetup = new DefaultSetup( gate.getConfig(), "\r\n" );       
 
    login = gateSetup.getStringValue( "login", "root" );
    timeout = gateSetup.getIntValue( "timeout", 2000 );
 
    pswd = gate.getKeyword();
 
    if( log.isDebugEnabled() )
    {
        log.info( " gate: " + host + ":" + port + " login: " + login + " pswd: " + pswd );
    }
 
    session = null;
 
    result = new StringBuffer();
 
    try
    {
        session = new SSHSession(  host, port, login, pswd );
        session.setTimeout( timeout );
        session.connect();
        result.append( session.command( "configure" ) );
      VlanManager manager = new VlanManager(mid, con);
      log.info( "running commands");
       for( UserStatus status : statusList )
      {
         //берем vlan у родительской циски
         int vid = manager.getVlan( gate.getParentId(), status.contractId );
         if ( status.status == IPNContractStatus.STATUS_OPEN )
         {
            rules  = getOpenRules( status, vid );
            for ( String rule : rules )
            {
               result.append( session.command( rule ) );   
            }
         }
         else
         {
            rules = getCloseRules( status, vid );
            for ( String rule : rules )
            {
               result.append( session.command( rule ) );   
            }
         }
      }       
       result.append( session.command( "exit" ) );
       log.info("!!!!!!!!!!!!!!SSH Switch!!!!!!!!!!!!!!!!!!");
       log.info( result );
        log.info("!!!!!!!!!!!!!!!SSH Switch!!!!!!!!!!!!!!!!!");
     }
    catch ( Exception e )
    {
       log.error("",  e );           
       throw new RuntimeException ( e );
    }
    finally
    {
        if( session != null )
        {
            session.disconnect();
        }
       log.info( "end of SSH_SWITCH........................................................");
    }   
}
 
getOpenRules( UserStatus status, int vid )
{
    return getRules( status, "\\[OPEN\\]((.|\n)*)\\[/OPEN\\]", vid );
}
 
getCloseRules( UserStatus status, int vid )
{      
    return getRules( status, "\\[CLOSE\\]((.|\n)*)\\[/CLOSE\\]", vid );
}
 
getRules(  status, template, vid )
{
        // пользовательское правило, без типа - то все оставляем как есть
   rule = status.rule.getRuleText();
        //порты идут до #, а адреса идут после 
   parts [] = rule.split( "#" );
   portsStr = "";
   addresesStr = "";
   if ( parts.length > 0 )
   {
       portsStr = parts[0];
   }
 
   if ( parts.length > 1 )
   {
      addresesStr = parts[1];
   }
 
   //типизированное правило
   if( status.ruleType != null )   
   {                      
            rule = generateRule( addresesStr, portsStr, vid, status.gateType, status.ruleType );
   }
        pattern = Pattern.compile( template );
   m = pattern.matcher( rule );
   if (m.find())
   {
       rule = m.group( 1 );
   }      
   rule.replaceAll( "\r", "" );
   parts  = rule.split( "\n" );
 
   return parts;
}      
 
generateRule(  addreses, ports, vid, gateType, ruleType  )
   {      
           ports_ = getPorts( ports );      
 
      ruleText = ManadUtils.getRule( gateType, ruleType );
      replacements =  new HashMap();
      if ( vid > 0)
      {
         replacements.put( "\\{VID\\}", String.valueOf( vid ) );            
      }   
      loops = ManadUtils.getAddresLoops( addreses );
      //адреса
      p = new LoopPattern();      
      p.setLoopPatern( "LOOP_PORT" );
      p.setReplace( "\\{PORT\\}" );
      p.setObjects( ports_ );      
      loops.add( p );
      return ManadUtils.generateRule( ruleText, replacements, ruleType, loops );      
   }
 
getPorts( ports )
   {
      portList = new ArrayList<String>();
      parts  = ports.split( ";" );
       for (String part : parts )
      {
         parts2  = part.split( ":" );
         if ( parts2.length <  2)
         {
            continue;
         }
         port = parts2 [1];
         portList.add( port );
      }
 
      ports_[] = new String [portList.size()];
      for (int i = 0; i < ports_.length; i++)
      {
         ports_[i] = portList.get( i );
      }
      return ports_;
   }

В скрипте есть класс Gate
host = gate.getHost();
port = gate.getPort();
gateSetup = new DefaultSetup( gate.getConfig(), "\r\n" );

А ошибка указывает на эту строку import bitel.billing.server.ipn.GateWorker;, вот почему не находит, не понятно.


Вернуться к началу
  
 
 Заголовок сообщения: Re: создание скриптового шлюза Zyxel
СообщениеДобавлено: 09 мар 2010, 12:16 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
в конце строки import bitel.billing.server.ipn.bean.* нет ";"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: создание скриптового шлюза Zyxel
СообщениеДобавлено: 09 мар 2010, 18:01 
Разобрался с ошибкой Gate, ошибка была из-за настроек шлюза Cisco2, по доке, для автономного управления шлюзом Zyxel, нужно создать постой шлюз Cisco2.
В скрипте написал
Код:
protected void doSync()
{
 
}
protected void parentSync( Gate child, GateWorker childWorker)
{
}

что оказалось не верным, нужно только
Код:
protected void doSync()
{
 
}


Вернуться к началу
  
 
 Заголовок сообщения: Re: создание скриптового шлюза Zyxel
СообщениеДобавлено: 12 мар 2010, 10:53 
К сожалению, сдвигов по первому пункту нет.
В конфигурации типа шлюза прописано
Код:
user_rule.editor.class=bitel.billing.module.services.ipn.editor.vlan.CiscoSSHSwitchRuleEditor
gate_manager.class=bitel.billing.server.ipn.vlan.CiscoSSHSwitchGateWorker
use.script=1

В командах
Код:
[DEFAULT]
[REMOVE]
  <LOOP>
     interface port-channel {PORT}
     inactive
     exit
   </LOOP>
[/REMOVE]
[OPEN]
  <LOOP>
    interface port-channel {PORT}
    no inactive
    bandwidth-limit egress
    bandwidth-limit egress ${speed}
    exit
 </LOOP>
exit
[/OPEN]
[CLOSE]
  <LOOP>
     interface port-channel {PORT}
     inactive
     exit
  </LOOP>
[/CLOSE]
[/DEFAULT]

А в договоре {PORT} не подменяется


Вложения:
switch_bs.JPG
switch_bs.JPG [ 38.59 КБ | Просмотров: 6958 ]
Вернуться к началу
  
 
 Заголовок сообщения: Re: создание скриптового шлюза Zyxel
СообщениеДобавлено: 12 мар 2010, 14:03 
В скрипте пишу
Код:
log.info("!!!!!!!!!!!!!!SSH Switch!!!!!!!!!!!!!!!!!!");

Но нигде логов нету, может кто подскажет, где искать. Может не выводится и нужно настроить. И доку не могу найти по этому классу log


Вернуться к началу
  
 
 Заголовок сообщения: Re: создание скриптового шлюза Zyxel
СообщениеДобавлено: 12 мар 2010, 16:52 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
mrustik писал(а):
<LOOP>
interface port-channel {PORT}
inactive
exit
</LOOP>


ну там должно быть <LOOP_PORT>, а не <LOOP>


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: создание скриптового шлюза Zyxel
СообщениеДобавлено: 12 мар 2010, 16:54 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
mrustik писал(а):
В скрипте пишу
Код:
log.info("!!!!!!!!!!!!!!SSH Switch!!!!!!!!!!!!!!!!!!");

Но нигде логов нету, может кто подскажет, где искать. Может не выводится и нужно настроить. И доку не могу найти по этому классу log

он тут упоминается
http://bgbilling.ru/v5.0/doc/ch05s11s14.html
должно работать ..У вас логи вообще в системе пишутся ? log4j.xml не меняли ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: создание скриптового шлюза Zyxel
СообщениеДобавлено: 12 мар 2010, 17:42 
логи пишутся, в файле ничего не менял. А то, что хочу я не пишутся.


Вернуться к началу
  
 
 Заголовок сообщения: Re: создание скриптового шлюза Zyxel
СообщениеДобавлено: 12 мар 2010, 20:07 
В командах типа шлюза прописано
Код:
[DEFAULT]
[REMOVE]
  <LOOP>
     interface port-channel {PORT}
     inactive
     exit
   </LOOP>
[/REMOVE]
 
[OPEN]
  <LOOP>
    interface port-channel {PORT}
    no inactive
    bandwidth-limit egress
    bandwidth-limit egress ${speed}
    exit
 </LOOP>
exit
[/OPEN]
 
[CLOSE]
  <LOOP>
     interface port-channel {PORT}
     inactive
     exit
  </LOOP>
[/CLOSE]
 
[/DEFAULT]

но при изменении состоянии шлюза и в договоре нет порта
в скрипте
Код:
    // пользовательское правило, без типа - то все оставляем как есть
   rule = status.rule.getRuleText();
    //порты идут до #, а адреса идут после 
   String [] parts = rule.split( "#" );
   portsStr = "";
   addresesStr = "";
   if ( parts.length > 0 )
   {
       portsStr = parts[0];
   }
   if ( parts.length > 1 )
   {
       log.info( addresesStr );
   }

Значение portsStr после выполнение пустое. Почему в status.rule.getRuleText(); передается только Ip-адрес


Вернуться к началу
  
 
 Заголовок сообщения: Re: создание скриптового шлюза Zyxel
СообщениеДобавлено: 12 мар 2010, 20:29 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
а <LOOP> на <LOOP_PORT> как описано в документации вы по идеологическим соображениям менять не хотите? . Стандартный шлюз с эти тоже не работает .


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: создание скриптового шлюза Zyxel
СообщениеДобавлено: 12 мар 2010, 20:30 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
mrustik писал(а):
Значение portsStr после выполнение пустое. Почему в status.rule.getRuleText(); передается только Ip-адрес

а вы покажите скриншот где вы завели порты


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: создание скриптового шлюза Zyxel
СообщениеДобавлено: 12 мар 2010, 20:32 
Не в сети
Разработчик

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: создание скриптового шлюза Zyxel
СообщениеДобавлено: 12 мар 2010, 21:11 
Разобрался с портами, зачем ставить порты в 2-х местах, или это для избыточности возможностей, поставил в привязке, и все заработало.
Шлюз работает, есть в коде ошибки, которые пришлось исправить. Причем некоторые допущены намеренно. :wink:


Вернуться к началу
  
 
 Заголовок сообщения: Re: создание скриптового шлюза Zyxel
СообщениеДобавлено: 15 мар 2010, 13:47 
Не в сети
Разработчик

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

Шлюз работает, есть в коде ошибки, которые пришлось исправить. Причем некоторые допущены намеренно. :wink:


Ну поправьте wiki . А какие ошибки то ? может вы что-то неправильно поняли


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: создание скриптового шлюза Zyxel
СообщениеДобавлено: 15 мар 2010, 17:31 
Подправил Wiki.
1. может намеренная ошибка, не знаю, но в закладке команд а макросе <LOOP_PORT> О или(и) Р в русском алфавите, поэтому ничего не менялось ни при просмотре, ни при запуска скрипта шлюза.
2. строка
Код:
parts [] = rule.split( "#" );
должна выглядеть
Код:
String [] parts = rule.split( "#" );

строка
Код:
ports_ [] = new String [portList.size()];
должна выглядеть
Код:
String [] ports_ = new String [portList.size()];


Вернуться к началу
  
 
 Заголовок сообщения: Re: создание скриптового шлюза Zyxel
СообщениеДобавлено: 15 мар 2010, 17:38 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
спасибо .. Это получилось после копирвания кода из явы .
Там в оригинал было скорее всего
Код:
 String parts [] = parts rule.split( "#" );


Но этого beanshell не понимает . Но исправил криво и сам код в beansell уже не проверял .. Нужно либо ваш вариант , либо просто:

Код:
parts = parts rule.split( "#" );
 


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: создание скриптового шлюза Zyxel
СообщениеДобавлено: 16 мар 2010, 10:15 
100% рабочий код
Код:
getPorts( ports )
{
      portList = new ArrayList();
      parts  = ports.split( ";" );
       for (String part : parts )
      {
         parts2  = part.split( ":" );
         if ( parts2.length <  2)
         {
            continue;
         }
         port = parts2 [1];
         portList.add( port );
      }
      String [] ports_ = new String [portList.size()];
      for (int i = 0; i < ports_.length; i++)
      {
         ports_[i] = portList.get( i );
      }
      return ports_;
}

строчка
Код:
String [] ports_ = new String [portList.size()];

рабочая


Вернуться к началу
  
 
 Заголовок сообщения: Re: создание скриптового шлюза Zyxel
СообщениеДобавлено: 16 мар 2010, 12:20 
Не в сети
Разработчик

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

parts = ports.split( ";" );

String [] ports_ = new String [portList.size()];

Т.е нужно либо вообще тип убирать, либо писать String [] . java-ский вариант String ports [] не работает .


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

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


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

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


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

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