BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 29 апр 2024, 22:36

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




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
СообщениеДобавлено: 10 ноя 2011, 18:18 
Не в сети
Клиент

Зарегистрирован: 21 май 2008, 10:54
Сообщения: 599
Откуда: 50-й рег.
Карма: 40
Добрый вечерочек...
Решил чуток поменять стандартную команду тестирования ipn-шлюза Mikrotik по telnet для 5.1
Взял за основу
[url]
http://wiki.bgbilling.ru/index.php/%D0% ... 8F_5.1_%29
[/url]
Изменил
"...ip firewall address-list print without-paging..."
на
"ip firewall address-list print without-paging where list=ACCESS_LIST"
добавил этот скриптик в тип шлюза микротик. При попытки сохранения выскакивает ошибка валидации скрипта:
"in file <unknown> Encountered "," at line 156 column 35"
т.е. где-то вот здесь:
"... Map<String, String> replacements = new HashMap<String, String>();...."
Люди добрые - подскажите- как это победить ????

_________________
"Все правые - в резерве!" (c) (translate.google.ru/#en/ru/all%20rigths%20reserved)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 11 ноя 2011, 17:30 
Не в сети
Разработчик

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

replacements = new HashMap();


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 12 ноя 2011, 08:50 
Не в сети
Клиент

Зарегистрирован: 21 май 2008, 10:54
Сообщения: 599
Откуда: 50-й рег.
Карма: 40
О да! Это я догадался уж. Но естесственно ничего не заработало.Жаль что разработчики хотя бы в доке не приводят примеры хотя бы стандартных шлюзов манад-микротик , портированных на beanshell. Весьма было бы полезно. Например для того чтобы подменить команду "test " шлюза mikrotik.
Ведь у некоторых в адрес-листах ип-адреса не только в ACCESS_LIST фигурируют, но и в пару-трешку сотен в других адресс-листах., которые могут шейпить, полиси-роутить, фильтровать , и т.д. и т.п.... А БЖБ просит микротик дешево-сердито вывалить ему всё содержимое адресс-листов, а потом там начинает долго ковыряться.По мере наращивания записей в аддресс-листах это становиться всё более-и более заметно.
А всего то надо выводить список только адресс-листов , по которым происходит управление в командах шлюза.
Просто поменять одну команду в двойных кавычках на ДРУГУЮ!!! Не меняя кода всего скрипта.
Еще раз прошу уважаемых форумчан или разработчиков в свободное от трудовых подвигов время снизойти до портирования скриптов стандартных шлюзов для Mikrotika, выложенных в вики для версии бжб-5.1 с явы на биншелл.
Или это такая секретная или трудная тема. что только в helpdesk за тикетами придётся переться...

P.S.
Вообще в последнее время политика развития связки БЖБ со шлюзами всё больше удручает. Фактически декларируется следующий постулат:"Мы пишем ядро , которое плавает в небесах над грешными кучами разнообразного оборудования, а уж связи небес с землёй пишите сами, если конечно сможете..." ACP написанное програмистами для програмистов.Я понимаю , что всё для всего не напишешь. И стандартный шлюз не напишешь. Но можно хотябы предусмотреть програмные интерфейсы для связки с другими языками , какими угодно...просто документировать - что бжб хочет получить от "драйвера" шлюза на выходе, и что хочет выложить ему на вход .
Извините...

_________________
"Все правые - в резерве!" (c) (translate.google.ru/#en/ru/all%20rigths%20reserved)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 14 ноя 2011, 18:02 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
ok-2004 писал(а):
О да! Это я догадался уж. Но естесственно ничего не заработало..


Какие-то ошибки в логах?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 15 ноя 2011, 20:06 
Не в сети
Клиент

Зарегистрирован: 21 май 2008, 10:54
Сообщения: 599
Откуда: 50-й рег.
Карма: 40
После долгово мудрения со скриптом накатал вот так:

Код:
import java.util.*;
import java.util.regex.*;
import ru.bitel.bgbilling.common.*;
import bitel.billing.common.module.ipn.*;
import bitel.billing.server.ipn.bean.*;
import bitel.billing.server.ipn.*;
import bitel.billing.server.util.ssh.*;
import bitel.billing.server.util.*;
import bitel.billing.server.util.ssh.SSHSession;
import ru.bitel.bgbilling.modules.ipn.server.bean.command.GateCommandUtil;
import bitel.billing.common.module.ipn.IPNContractStatus;

protected void doSync()
{
   host = gate.getHost();
   port = gate.getPort();
   gateSetup = new DefaultServerSetup( gate.getConfig(), "\r\n" );
   login = gateSetup.getStringValue( "login", "root" );                               
   pswd = gate.getKeyword();

   if ( log.isDebugEnabled() )
   {
      log.debug( " gate: " + host + ":" + port + " login: " + login + " pswd: " + pswd );
   }
   session = null;
   try
   {
      session = new SSHSessionExec( host, port, login, pswd );
//      address_list = session.command( "ip firewall address-list print without-paging" );
      address_list = session.command( "ip firewall address-list print without-paging where list=ACCESS_LIST" );
      new_address_list = null;

      for ( UserStatus status : statusList )
      {
         cid = status.contractId;
         ruleType = status.ruleType;
         rule_id = 0;
         if (ruleType != null)
         {
            rule_id = ruleType.getId();
         };
         rules = null;
        if (address_list.indexOf( "cid="+cid+";rule_id="+rule_id+";") != -1)
       {
            if ( status.status > 0 )
            {
               if ( status.status == IPNContractStatus.STATUS_REMOVED )
               {
                  rules = getDeleteRules( status );
               }
               else
               {
                  rules = getCloseRules( status );
               };
            };
         }
         else if ( status.status == IPNContractStatus.STATUS_OPEN )
         {
            rules = getOpenRules( status );
         };
         if (rules != null){
            for ( String rule : rules )
            {
               p = Pattern.compile("rule_id");
               m = p.matcher(rule);
               if (new_address_list == null)
               {
                  new_address_list = "";
               };
               new_address_list = new_address_list + m.replaceAll("rule_id="+rule_id) + "\n";
            };
         };
      }
      if (new_address_list != null){
         result = session.command(new_address_list);
      };
   }
   finally
   {
            if ( session != null )
            {
                session.disconnect();
            }
   }     
}
private getOpenRules( status )
{
   return getRules( status, "\\[OPEN\\](.*)\\[/OPEN\\]" );
}
private getCloseRules( status )
{
   return getRules( status, "\\[CLOSE\\](.*)\\[/CLOSE\\]" );
}
private getDeleteRules( status )
{
   return getRules( status, "\\[DELETE\\](.*)\\[/DELETE\\]" );
}   
private getRules( status, template )
{
   rule = status.rule.getRuleText();
   if ( status.ruleType != null )
   {
      rule = generateRule( rule, status.gateType, status.ruleType, status.contractId );
   }
   pattern = Pattern.compile( template, Pattern.DOTALL );
   m = pattern.matcher( rule );
   if ( m.find() )
   {
      rule = m.group( 1 );
   }
   rule.replaceAll( "\r", "" );
   return rule.split( "\n" );
}
private   generateRule( addresses, gateType, ruleType, cid )
{
   String rule;
   replacements = new HashMap();     
   replacements.put( "\\{CID\\}", String.valueOf( cid ) );

   ruleText = GateCommandUtil.getRule( gateType, ruleType );
   rule = GateCommandUtil.generateRule( ruleText, addresses, replacements, ruleType );
   return rule;
}


Конфигурация шлюза:
Код:
user_rule.editor.class=bitel.billing.module.services.ipn.editor.MikrotikContractRuleEditor
gate_manager.class=bitel.billing.server.ipn.MikrotikGateWorker
use.script=1

Команды шлюза - как в доке на микротик
Шлюз привязал к договору
При открытии шлюза - ип договора добавляется в адресс-лист:

Код:
[admin@mt] /interface ethernet> /ip firewall address-list print without-paging where list=ACCESS_LIST
Flags: X - disabled, D - dynamic
 #   LIST                                                                                                                                                                         ADDRESS                       
 0   ;;; !!1!!
     ACCESS_LIST                                                                                                                                                                  172.18.152.2         


В логах сервера появляется:
Код:
11-15/17:55:54 DEBUG [Thread-33] MikrotikGateWorker - run
11-15/17:55:54 DEBUG [Thread-33] MikrotikGateWorker - doParentSync
11-15/17:55:54  INFO [Thread-33] MikrotikGateWorker - Running script
11-15/17:55:54 DEBUG [Thread-33] MikrotikGateWorker -  gate: x.x.x.x login: admin pswd: xxxxxxxxxxxx
11-15/17:55:55 DEBUG [http-8080-2] server - executing bitel.billing.server.ipn.action.ActionSetContractStatus; time => 1173 ms.
11-15/17:55:55 DEBUG [http-8080-2] server - executing bitel.billing.server.ipn.action.ActionGateContractInfo; time => 14 ms.
11-15/17:55:55  WARN [Thread-33] ScriptInstance - x.x.x.x:22[]: using deprecated method [public final java.lang.String ru.bitel.common.Preferences.getStringValue(java.lang.String,java.lang.String)]
11-15/17:55:55  INFO [Thread-33] MikrotikGateWorker - Process time => 1131


Но при закрытии шлюза ип договора не убирается из адресс-листа!
При повторном открытии - добавляется старый ип к существующему в адресс-лист
Пробовал удалять "where list=ACCESS_LIST", теже яйца...
Подскажите пож-ста - что в коде скрипта не так ???

_________________
"Все правые - в резерве!" (c) (translate.google.ru/#en/ru/all%20rigths%20reserved)


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

Зарегистрирован: 21 май 2008, 10:54
Сообщения: 599
Откуда: 50-й рег.
Карма: 40
дерзну апнуть тему, очень надо. Посмотрите ктонить - что в коде скрипта не правильно ???

_________________
"Все правые - в резерве!" (c) (translate.google.ru/#en/ru/all%20rigths%20reserved)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 23 дек 2011, 14:31 
Не в сети
Клиент

Зарегистрирован: 21 май 2008, 10:54
Сообщения: 599
Откуда: 50-й рег.
Карма: 40
Всёж с трудом , но накостылил такую конструкцию, правда по ссш:
Код:
import java.util.*;
import java.util.regex.*;
import ru.bitel.bgbilling.common.*;
import bitel.billing.common.module.ipn.*;
import bitel.billing.server.ipn.bean.*;
import bitel.billing.server.ipn.*;
import bitel.billing.server.util.ssh.*;
import bitel.billing.server.util.*;
import bitel.billing.server.util.ssh.SSHSession;
import ru.bitel.bgbilling.modules.ipn.server.bean.command.GateCommandUtil;
import bitel.billing.common.module.ipn.IPNContractStatus;


protected void doSync()
{
   host = gate.getHost();
   port = gate.getPort();
   gateSetup = new DefaultServerSetup( gate.getConfig(), "\r\n" );
   login = gateSetup.getStringValue( "login", "root" );                               
   pswd = gate.getKeyword();
   session = null;
   try
        {
            session = new SSHSessionExec( host, port, login, pswd );
            for ( UserStatus status : statusList )
            {
                Integer cid = status.contractId;
                if ( ruleExists( cid, status, session ) )
                {
                    if ( status.status > 0 )
                    {
                        if ( status.status == IPNContractStatus.STATUS_REMOVED )
                        {
                            rules = getDeleteRules( status );
                            for ( String rule : rules )
                            {
                                session.command( rule );
                            }
                        }
                        else
                        {
                            rules = getCloseRules( status );
                            for ( String rule : rules )
                            {
                                session.command( rule );
                            }
                        }
                    }
                }
                else if ( status.status == IPNContractStatus.STATUS_OPEN )
                {
                    rules = getOpenRules( status );
                    for ( String rule : rules )
                    {
                        session.command( rule );
                    }
                }
            }
        }
   finally
   {
            if ( session != null )
            {
                session.disconnect();
            }
   }     
}
private boolean ruleExists( Integer cid, UserStatus status, SSHSessionExec session ) throws Exception
   {
      String answer = session.command( "ip firewall address-list print without-paging where list=ACCESS_LIST" );         
      return answer.indexOf( "!!" + cid + "!!" ) >= 0;      
   }
private getOpenRules( status )
{
   return getRules( status, "\\[OPEN\\](.*)\\[/OPEN\\]" );
}
private getCloseRules( status )
{
   return getRules( status, "\\[CLOSE\\](.*)\\[/CLOSE\\]" );
}
private getDeleteRules( status )
{
   return getRules( status, "\\[DELETE\\](.*)\\[/DELETE\\]" );
}   
private getRules( status, template )
{
   rule = status.rule.getRuleText();
   if ( status.ruleType != null )
   {
      rule = generateRule( rule, status.gateType, status.ruleType, status.contractId );
   }
   pattern = Pattern.compile( template, Pattern.DOTALL );
   m = pattern.matcher( rule );
   if ( m.find() )
   {
      rule = m.group( 1 );
   }
   rule.replaceAll( "\r", "" );
   return rule.split( "\n" );
}
private   generateRule( addresses, gateType, ruleType, cid )
{
   String rule;
   replacements = new HashMap();     
   replacements.put( "\\{CID\\}", String.valueOf( cid ) );

   ruleText = GateCommandUtil.getRule( gateType, ruleType );
   rule = GateCommandUtil.generateRule( ruleText, addresses, replacements, ruleType );
   return rule;
}


Странно, но даже работает.
Но в логах видно, что БЖБ5.1 не всё нравится:
Код:
IPNTestGates - Gate: 192.168.120.247 : 4567 [ ipn_gate ] - checking end..
12-23/06:15:11  WARN [pool-26-thread-1] ScriptInstance - 192.168.120.224:22[]: using deprecated method [public final java.lang.String ru.bitel.common.Preferences.getStringValue(java.lang.String,java.lang.String
)]

Ну тут я бессилен. Прошу помощи знатоков - что в этом скрипте можно подкрутить чтоб данный warning убрался ?

_________________
"Все правые - в резерве!" (c) (translate.google.ru/#en/ru/all%20rigths%20reserved)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 28 дек 2011, 13:07 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
ok-2004 писал(а):
Странно, но даже работает.
Но в логах видно, что БЖБ5.1 не всё нравится:
Код:
IPNTestGates - Gate: 192.168.120.247 : 4567 [ ipn_gate ] - checking end..
12-23/06:15:11  WARN [pool-26-thread-1] ScriptInstance - 192.168.120.224:22[]: using deprecated method [public final java.lang.String ru.bitel.common.Preferences.getStringValue(java.lang.String,java.lang.String
)]

Ну тут я бессилен. Прошу помощи знатоков - что в этом скрипте можно подкрутить чтоб данный warning убрался ?



Вот в этом куске
Код:
gateSetup = new DefaultServerSetup( gate.getConfig(), "\r\n" );
login = gateSetup.getStringValue( "login", "root" );     


используйте ru.bitel.bgbilling.server.util.DefaultServerSetup вместо bitel.billing.server.util.DefaultServerSetup
и
метод get( String key, String def ) вместо getStringValue( String key, String defaultValue )


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 28 дек 2011, 15:35 
Не в сети
Клиент

Зарегистрирован: 21 май 2008, 10:54
Сообщения: 599
Откуда: 50-й рег.
Карма: 40
большое спасибо!!

_________________
"Все правые - в резерве!" (c) (translate.google.ru/#en/ru/all%20rigths%20reserved)


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

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


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

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


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

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