BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 06 май 2024, 17:16

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




Начать новую тему Ответить на тему  [ Сообщений: 20 ] 
Автор Сообщение
 Заголовок сообщения: Cisco2 шлюз + аналогичный Cisco2 свич
СообщениеДобавлено: 29 дек 2010, 10:50 
Не в сети
Клиент

Зарегистрирован: 17 дек 2010, 15:27
Сообщения: 147
Карма: 22
Шлюз

user_rule.editor.class=bitel.billing.module.services.ipn.editor.vlan.CiscoVlanContactRuleEditor
gate_manager.class=bitel.billing.server.ipn.vlan.CiscoVlanParentGateWorker

Код:
[DEFAULT]

[REMOVE]
    no vlan {VID}
    no interface vlan {VID}
[/REMOVE]

[OPEN]
    vlan {VID}
    interface vlan {VID}
    no shutdown
<LOOP_NET>
    ip address {IP} {MASK}
</LOOP_NET>
    exit
[/OPEN]

[CLOSE]
    shutdown  vlan {VID}
    exit
[/CLOSE]
[/DEFAULT]


На свиче вот такие команды и конфиг

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]
[OPEN]
vlan database
 vlan {VID}
  <LOOP_PORT>
    interface ethernet {PORT}
    switchport access vlan {VID}
    exit
    interface ethernet g3
    switchport trunk allowed vlan add {VID}
 </LOOP_PORT>
[/OPEN]
[CLOSE]
no vlan  {VID}
 <LOOP_PORT>
    interface ethernet {PORT}
    no switchport access vlan {VID}
    exit
    interface ethernet g3
    no switchport trunk allowed vlan add {VID}
</LOOP_PORT>
[/CLOSE]

[/DEFAULT]

свич создается потомком шлюза ..

при использовании скрипта из вики (для свича)... для длинка или cisco2 или zyxel нету обработки LOOP_PORT (видно при препросмотре правил)
подскажите как модифицировать стандартный скрипт чтобы заработал свич ..

ps железо cisco2811 + linksys srw228g4


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cisco2 шлюз + аналогичный Cisco2 свич
СообщениеДобавлено: 29 дек 2010, 12:48 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
Magistr писал(а):

при использовании скрипта из вики (для свича)... для длинка или cisco2 или zyxel нету обработки LOOP_PORT (видно при препросмотре правил)
подскажите как модифицировать стандартный скрипт чтобы заработал свич ..

ps железо cisco2811 + linksys srw228g4

какой конкретно скрипт из wiki ?
как вы забивали порты ?
при просмотре правил - не зависит от скрипта , там правила формируются по дефолтной логике , ее может подменять скрипт при отправке на оборудование


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cisco2 шлюз + аналогичный Cisco2 свич
СообщениеДобавлено: 29 дек 2010, 14:06 
Не в сети
Клиент

Зарегистрирован: 17 дек 2010, 15:27
Сообщения: 147
Карма: 22
Вот эти ...
http://wiki.bgbilling.ru/index.php/%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D1%88%D0%BB%D1%8E%D0%B7%D0%B0_%D0%BA%D0%BE%D0%BC%D0%BC%D1%83%D1%82%D0%B0%D1%82%D0%BE%D1%80%D0%B0_Dlink_(%D0%BF%D0%BE%D0%B4_Cisco2)_%D0%BD%D0%B0_Beanshell
http://wiki.bgbilling.ru/index.php/%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D0%BE%D0%B3%D0%BE_%D1%88%D0%BB%D1%8E%D0%B7%D0%B0_%D0%BA%D0%BE%D0%BC%D0%BC%D1%83%D1%82%D0%B0%D1%82%D0%BE%D1%80%D0%B0_Zyxel_(%D0%BF%D0%BE%D0%B4_Cisco2)_%D0%BD%D0%B0_BeanShell
в дебаг логе
Код:
12-29/13:59:15 DEBUG [http-8080-1] JaxWS - executing ru.bitel.bgbilling.modules.ipn.server.WSRuleTypeLogImpl.logList; time => 1 ms.
12-29/13:59:20 DEBUG [http-8080-1] server - executing bitel.billing.server.ipn.action.ActionCiscoVlanGenerateRule; time => 3 ms.
12-29/13:59:20 DEBUG [http-8080-1] server - <?xml version="1.0" encoding="UTF-8"?>
<data secret="3FC190D695B697EC70C9248E195F694F" status="ok">
<rule>
<row text="[REMOVE]"/>
<row text="    no vlan {VID}"/>
<row text="    no interface vlan {VID}"/>
<row text="[/REMOVE]"/>
<row text="[OPEN]"/>
<row text="    vlan {VID}"/>
<row text="    interface vlan {VID}"/>
<row text="    no shutdown"/>
<row text="    ip address 192.168.100.0 255.255.255.0"/>
<row text="    exit"/>
<row text="[/OPEN]"/>
<row text="[CLOSE]"/>
<row text="    shutdown  vlan {VID}"/>
<row text="    exit"/>
<row text="[/CLOSE]"/>
</rule>
</data>

12-29/13:59:20 DEBUG [http-8080-1] server - executing bitel.billing.server.ipn.action.ActionCiscoSSHSwitchGenerateRule; time => 8 ms.
12-29/13:59:20 DEBUG [http-8080-1] server - <?xml version="1.0" encoding="UTF-8"?>
<data secret="300AC32FF3D73B5E9EB1E15DCED745E2" status="ok">
<rule>
<row text="[OPEN]"/>
<row text="vlan database"/>
<row text=" vlan {VID}"/>
<row text="[/OPEN]"/>
<row text="[CLOSE]"/>
<row text="no vlan  {VID}"/>
<row text="[/CLOSE]"/>
</rule>
</data>


Порты на вкладке шлюзы .. добавлял .. после добавления шлюза ничего не менялось.
а где еще можно забить порт для договора ?

ps вилан также добавлен на вкладке ресурсы vlan


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cisco2 шлюз + аналогичный Cisco2 свич
СообщениеДобавлено: 24 янв 2011, 14:29 
Не в сети
Разработчик

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cisco2 шлюз + аналогичный Cisco2 свич
СообщениеДобавлено: 25 янв 2011, 10:34 
Не в сети
Клиент

Зарегистрирован: 17 дек 2010, 15:27
Сообщения: 147
Карма: 22
stark писал(а):
LOOP_PORT работать не будет ..Оно предназначено для работы с шлюзом zyxel(там в редакторе есть порты ) . Это надо скрипт переписывать чтобы он брал порты со вкладки "порты"

потому и был вопрос как модифицировать скрипт :(


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cisco2 шлюз + аналогичный Cisco2 свич
СообщениеДобавлено: 25 янв 2011, 12:30 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
Magistr писал(а):
stark писал(а):
LOOP_PORT работать не будет ..Оно предназначено для работы с шлюзом zyxel(там в редакторе есть порты ) . Это надо скрипт переписывать чтобы он брал порты со вкладки "порты"

потому и был вопрос как модифицировать скрипт :(


Надо Использовать
Код:
GateCommandUtil.generateRule(java.lang.String ruleText, java.util.Map<java.lang.String,java.lang.String> replacements, RuleType ruleType, java.util.List<LoopPattern> loops)


Где loops - это список обектов LoopPattern , туда надо поместить порты ..Нужно его заполнить .. Чтобы считать порты
можно использовать GatePortManager


Какой-то пример работы с loops есть
тут


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cisco2 шлюз + аналогичный Cisco2 свич
СообщениеДобавлено: 24 мар 2011, 16:12 
Не в сети
Клиент

Зарегистрирован: 17 дек 2010, 15:27
Сообщения: 147
Карма: 22
А возможно сделать такой макрос типа {IP1} выдающий первый адрес в подсети в теге <LOOP_NET>

т.е сетка 192.168.1.0/24 это {IP}=192.168.1.0 {IP1}=192.168.1.1


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cisco2 шлюз + аналогичный Cisco2 свич
СообщениеДобавлено: 28 мар 2011, 12:55 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
Magistr писал(а):
А возможно сделать такой макрос типа {IP1} выдающий первый адрес в подсети в теге <LOOP_NET>

т.е сетка 192.168.1.0/24 это {IP}=192.168.1.0 {IP1}=192.168.1.1


зачем ? Что значит первый ? почему не второй например ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cisco2 шлюз + аналогичный Cisco2 свич
СообщениеДобавлено: 29 мар 2011, 08:22 
Не в сети
Клиент

Зарегистрирован: 17 дек 2010, 15:27
Сообщения: 147
Карма: 22
stark писал(а):
Magistr писал(а):
А возможно сделать такой макрос типа {IP1} выдающий первый адрес в подсети в теге <LOOP_NET>

т.е сетка 192.168.1.0/24 это {IP}=192.168.1.0 {IP1}=192.168.1.1


зачем ? Что значит первый ? почему не второй например ?

Ну например

int vlan 200
ip address 192.168.200.1 255.255.255.192

у нас указывается адрес шлюза для вилана .. ну и vlan per client и /26 сетка на клиента .. которые юр лица обычно

мм ну да в общем случае и Nй интересует


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cisco2 шлюз + аналогичный Cisco2 свич
СообщениеДобавлено: 31 мар 2011, 17:14 
Не в сети
Разработчик

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cisco2 шлюз + аналогичный Cisco2 свич
СообщениеДобавлено: 04 апр 2011, 13:14 
Не в сети
Клиент

Зарегистрирован: 17 дек 2010, 15:27
Сообщения: 147
Карма: 22
Заполнил LoopPattern для gate_ip , возник вопрос где и что указать чтобы использовалась замена
{GATE_IP} описаная для луппаттерна

Скрипт шлюза

user_rule.editor.class=bitel.billing.module.services.ipn.editor.vlan.CiscoVlanContactRuleEditor
gate_manager.class=bitel.billing.server.ipn.vlan.CiscoVlanGateWorker

Код:
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.StringTokenizer;
 
import bitel.billing.common.module.ipn.IPNContractStatus;
import bitel.billing.server.ipn.GateWorker;
import bitel.billing.server.ipn.UserStatus;
import ru.bitel.bgbilling.modules.ipn.server.bean.command.*;
import bitel.billing.server.ipn.bean.VlanManager;
import bitel.billing.server.util.DefaultServerSetup;
import bitel.billing.server.util.Utils;
import bitel.billing.server.util.telnet.TelnetSession;
import ru.bitel.bgbilling.common.DefaultSetup;
import bitel.billing.common.IPUtils;
import bitel.billing.server.ipn.bean.GateType;
import bitel.billing.server.ipn.bean.RuleType;
import bitel.billing.server.ipn.bean.VlanManager;
import bitel.billing.server.util.Utils;
import bitel.billing.server.util.telnet.TelnetSession;
import bitel.billing.server.ipn.bean.AddressRange;
import bitel.billing.server.ipn.bean.AddressRangeManager;
import ru.bitel.bgbilling.modules.ipn.server.bean.command.LoopPattern.*;
import ru.bitel.bgbilling.modules.ipn.server.bean.command.LoopPattern;
 
protected void doSync()
{
   try
   {
      log.info( "start of cisco........................................................");
      host = gate.getHost();
      port = gate.getPort();
 
 
      DefaultServerSetup gateSetup = new DefaultServerSetup( gate.getConfig(), "\r\n" );       
 
      pswdLogin = gateSetup.getStringValue("login");
      pswdCfg = gateSetup.getStringValue( "cfg.pswd");
                timeout = gateSetup.getIntValue( "timeout", 0 );
 
 
      result = new StringBuffer();
 
 
      if( log.isDebugEnabled() )
      {
          log.debug( gate.getId() + " gate: " + host + ":" + port  + " pswdLogin: " + pswdLogin + " pswdCfg: " +        pswdCfg );
      }
 
 
 
      session = new TelnetSession( host, port);
                session.setTimeout( timeout );
      session.setLoginPromptSequence( ":" );                  
      session.connect();
 
      session.setLoginPromptSequence( ":" );
 
 
      result.append( session.doCommand( pswdLogin ) );
      session.setLoginPromptSequence( ":" );
       result.append( session.doCommand( pswdCfg ) );
 
 
      result.append( session.doCommand( "terminal length 0" ) );
      result.append( session.doCommand( "terminal width 0" ) );
 
 
 
      session.setLoginPromptSequence( ": " );
      result.append( session.doCommand( "enable" ) );
 
 
      session.setLoginPromptSequence( "#" );
      result.append( session.doCommand( pswdCfg ) );
 
 
      result.append( session.doCommand( "configure terminal" ) );
 
      log.debug( "execute commands" );
      doCommands( session, result);
 
      result.append( session.doCommand( "exit" ) );
                session.doCommandAsync( "exit" );
 
      log.info("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
      log.info( result );
      log.info("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");      
 
      log.debug( "ok" );
   } catch (Exception e)
   {
 
      throw new RuntimeException ( e );
   }
 
   log.info( "end of cisco........................................................");
}
 
protected void add()
{
 
}
 
 
private void doCommands( TelnetSession session, StringBuffer result) throws IOException
{      
   for( UserStatus status : statusList )
   {
      date = new GregorianCalendar();
      
      VlanManager manager = new VlanManager(status.mid, con);

      gateId  = gate.getId();
      log.info("gateId=" + gateId);

      vid = manager.getVlan( gateId, status.contractId );
      log.info("vid=" + vid);   

      AddressRangeManager man = new AddressRangeManager( con, status.mid );
        addressList = man.getContractAddressRange( status.contractId , date, -1 );
       AddressRange range = addressList.get(0);
       AddressRange range1 = addressList.get(1);
      //gate_ip = IPUtils.convertLongIpToString(range.getAddr1()+1);

      ArrayList gate_ipt = new ArrayList();
      gate_ipt.add(IPUtils.convertLongIpToString( range.getAddr1()+1));
      gate_ipt.add(IPUtils.convertLongIpToString( range1.getAddr1()+1));
      log.info("gate_ip=" + gate_ipt);

      
      List loops = GateCommandUtil.getAddresLoops( String.valueOf(gate_ipt) );
      
      List rep= new ArrayList();
      rep.add("\\{GATE_IP\\}");   

      LoopPattern gate_ip= new LoopPattern();
      gate_ip=loops.get(0);
      gate_ip.setLoopPatern( "LOOP_NET" );
      gate_ip.setReplacements( rep );
      log.info("rep " + gate_ip.getReplacements());

   //   log.info(String.valueOf(gate_ip.get(0)));

      //TODO - подумать что сделать справилами на добавление
 
      rules = null;
      if (status.status == IPNContractStatus.STATUS_OPEN)
      {
 
         rules = getOpenRules( status, vid, gate_ip );
 
      }          
      else if (status.status == IPNContractStatus.STATUS_REMOVED)
      {
         rules = getRemoveRules( status, vid,gate_ip );   
      }
      //if closed and etc
      else
      {
         rules = getCloseRules( status, vid,gate_ip );
 
      }
 
      if (vid > 0)
      {
         for ( String rule : rules )
         {               
            result.append(  session.doCommand( rule ) );            
         }
      }
 
   }      
 
}
 
getOpenRules( status, vid,gate_ip )
{
    return getRules( status, "\\[OPEN\\](.*)\\[/OPEN\\]", vid ,gate_ip);
}
 
getCloseRules( status, vid,gate_ip )
{
    return getRules( status, "\\[CLOSE\\](.*)\\[/CLOSE\\]", vid,gate_ip );
}
 
getRemoveRules( UserStatus status, int vid ,gate_ip)
{
    return getRules( status, "\\[REMOVE\\](.*)\\[/REMOVE\\]", vid ,gate_ip );
}
 
getRules(  status, template, vid, gate_ip )
{
   // пользовательское правило, без типа - то все оставляем как есть
   rule = status.rule.getRuleText();
   log.info("rule=" + rule);
 
   //типизированное правило
   if( status.ruleType != null )
 
   {   
       rule = generateRule( rule, status.gateType, status.ruleType, vid, gate_ip );
   }
 
   log.info("rule=" + rule);
 
 
 
   pattern = Pattern.compile( template, Pattern.DOTALL );
   m = pattern.matcher( rule );
   if (m.find())
   {
       rule = m.group( 1 );
   }      
 
   rule.replaceAll( "\r", "" );
 
 
   parts  = rule.split( "\n" );
 
   result = new ArrayList();
   for ( String part : parts )
   {
      if ( !Utils.isEmptyString( part ))
      {
         result.add( part );
      }
   }
 
   return result;
}      
 
generateRule( addresses, gateType, ruleType, int vid, gate_ip )
{      
    ruleText = GateCommandUtil.getRule( gateType, ruleType );
    replacements =  new HashMap ();
    if ( vid > 0)
    {
        replacements.put( "\\{VID\\}", String.valueOf( vid ) );
   //   replacements.put( "\\{GATE_IP\\}",  String.valueOf(gate_ip));
      
    }
    return GateCommandUtil.generateRule( ruleText, addresses, replacements, ruleType);      
}




Команды
Код:
[DEFAULT]
[OPEN]
vlan {VID}
no shutdown vlan {VID}
interface vlan {VID}
<LOOP_NET>
ip address {GATE_IP} {MASK}
</LOOP_NET>

ip access-list extended Access{VID}
<LOOP_NET>
permit ip any {IP} {MASK_WILD}
</LOOP_NET>

class-map match-all Access{VID}
match access-group name Access{VID}
policy-map PM
class Access{VID}
police ${speed} 8000 exceed-action drop

[/OPEN]

[CLOSE]
shutdown  vlan {VID}
exit
[/CLOSE]
[REMOVE]
no vlan {VID}
no interface vlan {VID}
no ip access-list extended Access{VID}
policy-map PM
no class Access{VID}
no class-map Access{VID}
[/REMOVE]
[/DEFAULT]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cisco2 шлюз + аналогичный Cisco2 свич
СообщениеДобавлено: 05 апр 2011, 16:22 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
Вам нужно только изменить функцию generateRule.
Код:
generateRule( addresses, gateType, ruleType, int vid )
{      
    ruleText = GateCommandUtil.getRule( gateType, ruleType );
   
      
   List loops = GateCommandUtil.getAddresLoops( ruleText );

    for (  LoopPattern pattern : loops )
   {
      if ( patterm.getLoopPattern().equals( "LOOP_NET" ) )
      {
         pattern.getReplacements().add( "GATE_IP" );
         for ( List list : pattern.getObjects() )
         {
            String address =  list.get( 0 );            
            long la = long IPUtils.convertStringIPtoLong( address );            
            list.add( IPUtils.convertLongIpToString( la + 1  );            
         }
         break;      
      }
      
   }

   replacements =  new HashMap ();
    if ( vid > 0)
    {
        replacements.put( "\\{VID\\}", String.valueOf( vid ) );
      
    }
    return GateCommandUtil.generateRule( ruleText, replacements, ruleType, loops );      
}



Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cisco2 шлюз + аналогичный Cisco2 свич
СообщениеДобавлено: 05 апр 2011, 16:22 
Не в сети
Разработчик

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

http://wiki.bgbilling.ru/index.php/%D0% ... ommandUtil


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cisco2 шлюз + аналогичный Cisco2 свич
СообщениеДобавлено: 06 апр 2011, 11:21 
Не в сети
Клиент

Зарегистрирован: 17 дек 2010, 15:27
Сообщения: 147
Карма: 22
хм странный затык


04-06/12:18:26 INFO [Thread-24] CiscoVlanGateWorker - Pattern ru.bitel.bgbilling.modules.ipn.server.bean.command.LoopPattern@7aca2076
04-06/12:18:26 ERROR [Thread-24] CiscoVlanGateWorker - Eval error2: Error in method invocation: Method getLoopPattern() not found in class'ru.bitel.bgbilling.modules.ipn.server.bean.command.LoopPattern'
Error in method invocation: Method getLoopPattern() not found in class'ru.bitel.bgbilling.modules.ipn.server.bean.command.LoopPattern' : at Line: 222 : in file: inline evaluation of: ``import java.io.IOException; import java.util.ArrayList; import java.util.HashMap . . . '' : pattern .getLoopPattern ( )

вот на этом коде

Код:
log.info("Pattern " + pattern);
      if ( pattern.getLoopPattern().equals( "LOOP_NET" ) )
{


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cisco2 шлюз + аналогичный Cisco2 свич
СообщениеДобавлено: 06 апр 2011, 17:53 
Не в сети
Разработчик

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


04-06/12:18:26 INFO [Thread-24] CiscoVlanGateWorker - Pattern ru.bitel.bgbilling.modules.ipn.server.bean.command.LoopPattern@7aca2076
04-06/12:18:26 ERROR [Thread-24] CiscoVlanGateWorker - Eval error2: Error in method invocation: Method getLoopPattern() not found in class'ru.bitel.bgbilling.modules.ipn.server.bean.command.LoopPattern'
Error in method invocation: Method getLoopPattern() not found in class'ru.bitel.bgbilling.modules.ipn.server.bean.command.LoopPattern' : at Line: 222 : in file: inline evaluation of: ``import java.io.IOException; import java.util.ArrayList; import java.util.HashMap . . . '' : pattern .getLoopPattern ( )

вот на этом коде

Код:
log.info("Pattern " + pattern);
      if ( pattern.getLoopPattern().equals( "LOOP_NET" ) )
{


Метод неправильно назван оказывается . getLoopPatern()


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cisco2 шлюз + аналогичный Cisco2 свич
СообщениеДобавлено: 07 июн 2011, 23:03 
Не в сети

Зарегистрирован: 19 дек 2008, 17:46
Сообщения: 749
Карма: 10
Что-то не работает скрипт на версии 5.1.
Прописали
Код:
print("1="+pattern.getReplacements().add( "GATE_IP" ));

выводит 1=true.
Почему так пишет?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cisco2 шлюз + аналогичный Cisco2 свич
СообщениеДобавлено: 08 июн 2011, 17:53 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
madmax писал(а):
Что-то не работает скрипт на версии 5.1.
Прописали
Код:
print("1="+pattern.getReplacements().add( "GATE_IP" ));

выводит 1=true.
Почему так пишет?


метод add у класса List - возвращает boolean, успешно добавлен в лист или не успешно


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cisco2 шлюз + аналогичный Cisco2 свич
СообщениеДобавлено: 08 июн 2011, 18:27 
Не в сети

Зарегистрирован: 19 дек 2008, 17:46
Сообщения: 749
Карма: 10
Тогда почему скрипт не отрабатывает на шлюзе.
Стоит такая настройка
Код:
[OPEN]
    vlan {VID}
    interface Vlan {VID}
    description Billing {GATE_IP}
    ip vrf forwarding InternetUnlim
<LOOP_NET>
    ip address  {GATE_IP} 255.255.255.252
</LOOP_NET>
    exit
[/OPEN]

В итоге скрипт отрабатывает без ошибок, но на свиче адрес так и не прописывается.
Делаю проверку
Код:
 for ( List list : pattern.getObjects() )
         {
            String address =  list.get( 0 );           
            long la = IPUtils.convertStringIPtoLong( address );   
            print ("qqq"+la);
            list.add( IPUtils.convertLongIpToString( la + 1  ));   

Но в логах ничего не выходит. даже qqq не появляется.
Получается он в коде вообще не доходит до вывода лога.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cisco2 шлюз + аналогичный Cisco2 свич
СообщениеДобавлено: 09 июн 2011, 09:16 
Не в сети
Клиент

Зарегистрирован: 17 дек 2010, 15:27
Сообщения: 147
Карма: 22
Финальная версия скрипта
плюс я доработал библиотечку дописать пару строк оказалось проще )
кстати у вас возникнет проблема например то что для второй подсетки в вилане надо указывать secondary .. и надо будет эту ситуацию разрулить..


скрипт
Код:
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.StringTokenizer;
 
import bitel.billing.common.module.ipn.IPNContractStatus;
import bitel.billing.server.ipn.GateWorker;
import bitel.billing.server.ipn.UserStatus;
import ru.bitel.bgbilling.modules.ipn.server.bean.command;
//import ru.bitel.bgbilling.modules.ipn.server.bean.command.GateCommandUtil;
import ru.bitel.bgbilling.modules.ipn.server.bean.command.LoopPattern;

import bitel.billing.server.ipn.bean.VlanManager;
import bitel.billing.server.util.DefaultServerSetup;
import bitel.billing.server.util.Utils;
import bitel.billing.server.util.telnet.TelnetSession;
import ru.bitel.bgbilling.common.DefaultSetup;
import bitel.billing.common.IPUtils;
import bitel.billing.server.ipn.bean.GateType;
import bitel.billing.server.ipn.bean.RuleType;
import ru.bitel.bgbilling.modules.ipn.common.bean.AddressRangeManager;
import ru.bitel.common.Preferences;
includeBGBS( "bgbs://ru.bitel.bgbilling.kernel.script.common.bean.ScriptLibrary/gateCommandUtiltt" );
 
protected void doSync()
{
   try
   {
      log.info( "start of cisco........................................................");
      host = gate.getHost();

      port = gate.getPort();


      DefaultServerSetup gateSetup = new DefaultServerSetup( gate.getConfig(), "\r\n" );       
 
      pswdLogin = gateSetup.getStringValue("login");
      pswdCfg = gateSetup.getStringValue( "cfg.pswd");
                timeout = gateSetup.getIntValue( "timeout", 0 );

 
      result = new StringBuffer();
 
 
      if( log.isDebugEnabled() )
      {
          log.debug( gate.getId() + " gate: " + host + ":" + port  + " pswdLogin: " + pswdLogin + " pswdCfg: " +        pswdCfg );
      }
 
 
log.info( "start of cisco......");   
      session = new TelnetSession( host, port);
                session.setTimeout( timeout );
      session.setLoginPromptSequence( ":" );                  
      session.connect();

      session.setLoginPromptSequence( ":" );
 
 log.info( "log seq......" + pswdLogin);   
      result.append( session.doCommand( pswdLogin ) );
log.info( "login" );
      session.setLoginPromptSequence( ">" );
log.info( "pass1" );
       result.append( session.doCommand( pswdCfg ) );
log.info( "pass2" );

session.setLoginPromptSequence( ">" );
      result.append( session.doCommand( "terminal length 0" ) );
      result.append( session.doCommand( "terminal width 0" ) );
log.info( "term" );
 
 
      session.setLoginPromptSequence( ":" );
      result.append( session.doCommand( "enable" ) );
 log.info( "en" );
 
      session.setLoginPromptSequence( "#" );
      result.append( session.doCommand( pswdCfg ) );
log.info( "pass" );
      session.setLoginPromptSequence( "#" );
 
      result.append( session.doCommand( "configure terminal" ) );
 log.info( "conf" );
      log.debug( "execute commands" );
      doCommands( session, result);
  log.info( "exec" );
      result.append( session.doCommand( "exit" ) );
                session.doCommandAsync( "exit" );
 
      log.info("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
      log.info( result );
      log.info("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");      
 
      log.debug( "ok" );
   } catch (Exception e)
   {
 
      throw new RuntimeException ( e );
   }
 
   log.info( "end of cisco........................................................");
}
 
protected void add()
{
 
}
 
 
private void doCommands( TelnetSession session, StringBuffer result) throws IOException
{      
   for( UserStatus status : statusList )
   {
      date = new GregorianCalendar();
      
      VlanManager manager = new VlanManager(status.mid, con);

      gateId  = gate.getId();
      log.info("gateId=" + gateId);

      vid = manager.getVlan( gateId, status.contractId );
      log.info("vid=" + vid);   

 
      //TODO - подумать что сделать справилами на добавление
 
      rules = null;
      if (status.status == IPNContractStatus.STATUS_OPEN)
      {
 
         rules = getOpenRules( status, vid );
 
      }          
      else if (status.status == IPNContractStatus.STATUS_REMOVED)
      {
         rules = getRemoveRules( status, vid );   
      }
      //if closed and etc
      else
      {
         rules = getCloseRules( status, vid);
 
      }
 
      if (vid > 0)
      {
         for ( String rule : rules )
         {               
            result.append(  session.doCommand( rule ) );            
         }
      }
 
   }      
 
}
 
getOpenRules( status, vid )
{
    return getRules( status, "\\[OPEN\\](.*)\\[/OPEN\\]", vid );
}
 
getCloseRules( status, vid )
{
    return getRules( status, "\\[CLOSE\\](.*)\\[/CLOSE\\]", vid );
}
 
getRemoveRules( UserStatus status, int vid )
{
    return getRules( status, "\\[REMOVE\\](.*)\\[/REMOVE\\]", vid );
}
 
getRules(  status, template, vid )
{
   // пользовательское правило, без типа - то все оставляем как есть
   rule = status.rule.getRuleText();
   log.info("rule=" + rule);
 
   //типизированное правило
   if( status.ruleType != null )
 
   {   
       rule = generateRule( rule, status.gateType, status.ruleType, vid);
   }
 
   log.info("rule=" + rule);
 
 
 
   pattern = Pattern.compile( template, Pattern.DOTALL );
   m = pattern.matcher( rule );
   if (m.find())
   {
       rule = m.group( 1 );
   }      
 
   rule.replaceAll( "\r", "" );
 
 
   parts  = rule.split( "\n" );
 
   result = new ArrayList();
   for ( String part : parts )
   {
      if ( !Utils.isEmptyString( part ))
      {
         result.add( part );
      }
   }
 
   return result;
}      
 

generateRule( addresses, gateType, ruleType, int vid )
{     

    ruleText = getRule( gateType, ruleType );
 
   replacements =  new HashMap ();
    if ( vid > 0)
    {
        replacements.put( "\\{VID\\}", String.valueOf( vid ) );
     
    }

  return generateRule( ruleText, addresses, replacements, ruleType);   
}



Либа
Код:
private static StringBuffer processBlock( String ruleText, LoopPattern loopPattern )
   {
      StringBuffer result = new StringBuffer();
 
      List items = new ArrayList( 10 );
      Map letterMaxNumbers = new HashMap();
 
      Pattern pattern = Pattern.compile( "\\{([A-Z]+)(\\d+)\\}" );
      Matcher m = pattern.matcher( ruleText );
 
      while( m.find() )
      {
         String letter = m.group( 1 );
         int number = Utils.parseInt( m.group( 2 ), 0 );
 
         PatternItem item = new PatternItem();
         item.number = number;
         item.letter = letter;
 
         items.add( item );
 
         Integer maxNumber = letterMaxNumbers.get( letter );
         if( maxNumber == null || maxNumber < number )
         {
            letterMaxNumbers.put( letter, number );
         }
      }
 
      final int size = loopPattern.getObjects().size();
 
      for( int i = 0; i < size; i++ )
      {
         //String address = IPUtils.convertLongIpToString( Utils.parseLong( addreses[i], 0 ) );
         String addressRule = new String( ruleText );
 
         for( PatternItem item : items )
         {
            int number = i*(letterMaxNumbers.get( item.letter ) + 1) + item.number;
            addressRule = addressRule.replaceAll(
                  "\\{" + item.letter + item.number + "\\}",
                  "{" + item.letter + number + "}" );
         }
 
         String str = addressRule;
         for ( int j = 0; j < loopPattern.getReplacements().size(); j ++)
         {            
            String key = loopPattern.getReplacements().get( j );
            String value = loopPattern.getObjects().get( i ).get( j );
            str = str.replaceAll( key, value );
         }
 
         result.append( str );
      }
      return result;
   }
   /**
    * Формирует команды для шлюза.
    * @param ruleText
    * @param addressList
    * @param replacements
    * @param ruleType
    * @return
    */
   public static final String generateRule( String ruleText,
                                    String addressList,
                                    Map replacements,
                                    RuleType ruleType )
   {
      List loops = getAddresLoops( addressList );
      return generateRule( ruleText, replacements, ruleType, loops);        
   }
 
   /**
    * строку адреса преобразует в 2 LoopPattern-а : для диапазонов и сетей 
    * @param addressList
    * @return
    */
   public static List getAddresLoops( String addressList )
   {
      String[] parts =  addressList.split( ";" );

      List replacements = new ArrayList();
      replacements.add ( "\\{A\\}" );
 
      List objects = new ArrayList();
 
      if ( parts.length > 0 && !Utils.isEmptyString( parts[0]  ) )
      {      
         String[] addrs = parts[0].split( "\\s*,\\s*" );
         if ( addrs.length > 0)
         {
            for ( int i = 0; i < addrs.length; i++)
            {
            String address = IPUtils.convertLongIpToString( Utils.parseLongString( addrs[i], 0 ) );
log.info("address " + address);
               List list = new ArrayList();
               list.add( address );
               objects.add( list );
            }
         }
      }
 
      List loops =new ArrayList();
 
      //адреса
      LoopPattern p = new LoopPattern();      
      p.setLoopPatern( "LOOP" );
      p.setReplacements( replacements );
      p.setObjects( objects );            
      loops.add( p );
 
 
      replacements = new ArrayList();
      replacements.add ( "\\{IP\\}" );
      replacements.add ( "\\{MASK\\}" );
      replacements.add ( "\\{MASK_WILD\\}" );
      replacements.add ( "\\{MASK_BIT\\}" );
      replacements.add ( "\\{GATE_IP\\}" );
      objects = new ArrayList();
 
 
      //String[] nets = new String [0];
      //String[] net_masks = new String [0];
      if ( parts.length > 1  && !Utils.isEmptyString( parts[1]  ) )
      {      
         String[] nets = parts[1].split( "\\s*,\\s*" );
 
         if ( nets.length > 0)
         {
            for ( int i = 0; i < nets.length; i++)
            {
               String[] parts2 = nets[i].split( "/" );
               if ( parts2.length == 2)
               {
                  String address = IPUtils.convertLongIpToString( Utils.parseLongString( parts2[0], 0 ) );
                  String maskBit = parts2[1];
                  long mask = ( 0xFFFFFFFFl << ( 32 - Utils.parseIntString( maskBit, 0 ) ) ) & 0xFFFFFFFFl;                  
                  long maskWild = mask ^ 0xFFFFFFFFl;
 
                  List list = new ArrayList();
                  list.add( address );
                  list.add(  IPUtils.convertLongIpToString(  mask ) );
                  list.add(  IPUtils.convertLongIpToString(  maskWild ) );
                  list.add(  maskBit );
                   list.add(  IPUtils.convertLongIpToString( IPUtils.convertStringIPtoLong(address) + 1  ));
                  objects.add( list );
log.info("list " + list);
               }
            }
         }
      }
      //сети      
      p = new LoopPattern();      
      p.setLoopPatern( "LOOP_NET" );
      p.setReplacements( replacements );
      p.setObjects( objects );                  
      loops.add( p );
 
      return loops;
   }
 
   /**
    * Формирует команды для шлюза.
    * @param ruleText
    * @param replacements
    * @param ruleType
    * @param loops
    * @return
    */
   public static final String generateRule( String ruleText,                                    
                                    Map replacements,
                                    RuleType ruleType,
                                    List loops)
   {
      StringBuffer resultBuf = null;
      for ( LoopPattern loop : loops)
      {
         resultBuf = new StringBuffer();
         String loopPattern = "(<LOOP>.*?</LOOP>)?(.*?)<LOOP>(.*?)</LOOP>";
         loopPattern = loopPattern.replaceAll( "LOOP", loop.getLoopPatern() );
         Pattern pattern = Pattern.compile( loopPattern, Pattern.DOTALL );
         Matcher m = pattern.matcher( ruleText );
         boolean find = false;
 
         while( m.find() )
         {
            find = true;
 
            String block = m.group( 3 );
            block = processBlock( block, loop ).toString();
 
            resultBuf.append( m.group( 2 ) );
            resultBuf.append( block );            
         }
 
         if (find)
         {
            //хвост(ищем жадным алгоритмом) или если вообще нет ни одного цикла
            loopPattern = "(?:<LOOP>(?:.*)</LOOP>)(.*)\\z";
            loopPattern = loopPattern.replaceAll( "LOOP", loop.getLoopPatern() );
 
            pattern = Pattern.compile( loopPattern, Pattern.DOTALL );
            m = pattern.matcher( ruleText );      
 
            if( m.find() )
            {
               resultBuf.append( m.group( 1 ) );
            }
         }
         else
         {
 
            resultBuf  = new StringBuffer( ruleText );       
         }   
 
         //пошли по второму и т.п заходу
         ruleText = resultBuf.toString();
      }
 
      String result = resultBuf.toString();
 
      result = result.replaceAll( "<ver 2\\.0/>", "" );
      //убиваем пустые строки
      result = result.replaceAll( "\r", "" );
      result = result.replaceAll( "\n\\s*\n", "\n" );      
      result = result.replaceAll( "(\n){2,}", "\n" );
      result = result.trim();
 
      String ruleData = ruleType.getData();
      ruleData.replaceAll( "\r", "\n" );
      ruleData = ruleData.trim();
 
      Preferences setup = new DefaultSetup( ruleData, "\n");
      //получаем все значения
      Map values = setup.getHashValuesWithPrefix( "" );
 
      if( replacements == null)
      {
         replacements = new HashMap();
      }
 
      for (Map.Entry entry : values.entrySet())
      {
         String key = "\\$\\{" + entry.getKey() + "\\}";
         replacements.put( key, entry.getValue() );
      }
 
      if (replacements != null)
      {
         for (Map.Entry rep : replacements.entrySet())
         {
            //result = result.replaceAll( "\\{CID\\}", String.valueOf( cid ) );   
            result = result.replaceAll( rep.getKey(), rep.getValue() );
         }
      }
 
      return result.toString();
   }
 
   private static class PatternItem
   {
      public String letter;
      public int number;
   }
 
   /**
    * Получает команды для шлюза в непереработанном виде.
    * @param gateType
    * @param ruleType
    * @return
    */
   public static String getRule( GateType gateType, RuleType ruleType )
   {
      String result  = "";
 
      String template = "\\[RULE ID=\"((?:\\d+,*)+)\"\\](.*?)\\[/RULE\\]";      
      Pattern pattern = Pattern.compile( template, Pattern.DOTALL );
 
      Matcher m = pattern.matcher( gateType.getRule() );      
      while( m.find() )
      {
         String idsStr = m.group(1);
         String rule = m.group( 2 );
         int[] ids = parseIds( idsStr );
         for (int i = 0; i < ids.length; i++)
         {
            if (ruleType.getId() == ids [i] )
            {
               return rule;   
            }
         }
      }
 
      //default
      template = "\\[DEFAULT\\](.*)\\[/DEFAULT\\]";      
      pattern = Pattern.compile( template, Pattern.DOTALL );      
      m = pattern.matcher( gateType.getRule() );      
      if( m.find() )
      {         
         String rule = m.group( 1 );
         return rule;
      }
 
      return result;
   }
 
   private static int[] parseIds( String idsStr )
   {
      String[] strs = idsStr.split( "," );
      int[] result  = new int [strs.length];
 
      for (int i = 0; i < strs.length; i++)
      {
         result[i] = Integer.parseInt( strs[i]);
      }
      return result;
   }



Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Cisco2 шлюз + аналогичный Cisco2 свич
СообщениеДобавлено: 18 июл 2011, 23:08 
Не в сети

Зарегистрирован: 19 дек 2008, 17:46
Сообщения: 749
Карма: 10
Может подскажите почему при таком запросе в принте выходит list=0.0.0.0. Хотя на шлюзе все прописано и адреса указаны.
Код:
generateRule( addresses, gateType, ruleType, int vid )
{     
    ruleText = GateCommandUtil.getRule( gateType, ruleType );
   List loops = GateCommandUtil.getAddresLoops( ruleText );
    for (  LoopPattern pattern : loops )
{
          pattern.getReplacements().add( "GATE_IP" );
         for ( List list : pattern.getObjects() )
{ print("list="+list);

}
}     
}


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

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


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

Сейчас этот форум просматривают: Bing [Bot] и гости: 1


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

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