BiTel

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

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




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Задача проверка шлюзов и Mikrotik
СообщениеДобавлено: 08 окт 2010, 20:30 
Не в сети

Зарегистрирован: 19 дек 2008, 17:46
Сообщения: 749
Карма: 10
В общем проблема такая. Имеется Mikrotik на котором время от времени пропадают некоторые правила и задача проверка шлюзов не восстанавливает их.
После открытия шлюза на микротике создается три записи 1- акксес лист, 2-mangle для маркировки пакетов, 3-правило скорости
Так вот почему если руками на Микротике удалить 2 и 3 правило то задача Проверка шлюзов IPN не восстанавливает их.
А вот если удалить 1 правило - то после проверки шлюзов все правила появляются.
Поэтому вопрос каким образом задача проверки шлюзов понимает что на шлюзе отсутствуют нужные записи
Версия биллинга 5,0,766
Вот какие команды уходят на Микротик при открытии/закрытии шлюза
[OPEN]
:global list2 "";
:foreach i in [/ip firewall address-list find] do={:if ([:find [/ip firewall address-list get $i comment] "cid=283;"]=0) do={:set list2 ($list2 . "," . $i)}};
/ip firewall address-list remove $list2;
:global list1 "";
:foreach i in [/queue tree find] do={:if ([:find [/queue tree get $i name] "cid=283"]=0) do={:set list1 ($list1 . "," . $i)}};
/queue tree remove $list1;
:global list "";
:foreach i in [/ip firewall mangle find] do={:if ([:find [/ip firewall mangle get $i comment] "cid=283;"]=0) do={:set list ($list . "," . $i)}};
/ip firewall mangle remove $list;
ip firewall address-list add address=10.10.0.96/30 list=ACCESS_LIST comment="cid=283;rule_id;";
ip firewall address-list add address=10.10.0.96/30 list="cid=283" comment="cid=283;rule_id;";
ip firewall mangle add chain=forward action=mark-connection new-connection-mark=283-up passthrough=yes src-address-list="cid=283" comment="cid=283;rule_id;";
ip firewall mangle add chain=forward action=mark-packet new-packet-mark=283-up-pack connection-mark=283-up passthrough=yes comment="cid=283;rule_id;";
ip firewall mangle add chain=forward action=mark-connection new-connection-mark=283-down passthrough=yes dst-address-list="cid=283" comment="cid=283;rule_id;";
ip firewall mangle add chain=forward action=mark-packet new-packet-mark=283-down-pack connection-mark=283-down passthrough=yes comment="cid=283;rule_id;";
queue tree add limit-at=128000 max-limit=128000 name="cid=283-up" packet-mark=283-up-pack parent="3Up" priority=8 queue=default;
queue tree add limit-at=128000 max-limit=128000 name="cid=283-down" packet-mark=283-down-pack parent="3Down" priority=8 queue=default;
[/OPEN]
[CLOSE]
:global list2 "";
:foreach i in [/ip firewall address-list find] do={:if ([:find [/ip firewall address-list get $i comment] "cid=283;"]=0) do={:set list2 ($list2 . "," . $i)}};
/ip firewall address-list remove $list2;
:global list1 "";
:foreach i in [/queue tree find] do={:if ([:find [/queue tree get $i name] "cid=283"]=0) do={:set list1 ($list1 . "," . $i)}};
/queue tree remove $list1;
:global list "";
:foreach i in [/ip firewall mangle find] do={:if ([:find [/ip firewall mangle get $i comment] "cid=283;"]=0) do={:set list ($list . "," . $i)}};
/ip firewall mangle remove $list;
[/CLOSE]
[DELETE]
:global list2 "";
:foreach i in [/ip firewall address-list find] do={:if ([:find [/ip firewall address-list get $i comment] "cid=283;"]=0) do={:set list2 ($list2 . "," . $i)}};
/ip firewall address-list remove $list2;
:global list1 "";
:foreach i in [/queue tree find] do={:if ([:find [/queue tree get $i name] "cid=283"]=0) do={:set list1 ($list1 . "," . $i)}};
/queue tree remove $list1;
:global list "";
:foreach i in [/ip firewall mangle find] do={:if ([:find [/ip firewall mangle get $i comment] "cid=283;"]=0) do={:set list ($list . "," . $i)}};
/ip firewall mangle remove $list;
[/DELETE]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Задача проверка шлюзов и Mikrotik
СообщениеДобавлено: 09 окт 2010, 10:45 
Не в сети

Зарегистрирован: 19 дек 2008, 17:46
Сообщения: 749
Карма: 10
мы нашли причину такого поведения. дело все в скрипте на шлюзе.
Но если прописать команду проверки так address_list = session.command( "queue tree print without-paging" );
То в коде if (address_list.indexOf( "cid="+cid+";rule_id="+rule_id+";") != -1) выходит ошибка.
А почему не понимаем
Вот сам код
Код:
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;


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" );
      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){
//         print(address_list);
//         print(new_address_list);
         result = session.command(new_address_list);
//         print(result);
      };

   }
   catch( Exception e )
   {
      throw new RuntimeException( e );
   }
   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 = ManadUtils.getRule( gateType, ruleType );
   rule = ManadUtils.generateRule( ruleText, addresses, replacements, ruleType );
   return rule;
}


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

Зарегистрирован: 19 дек 2008, 17:46
Сообщения: 749
Карма: 10
Нашли проблему исчезновения записей.
В общем кому нужно ограничивать скорость на Микротике вот имеется готовое решение.
Вот исправленный скрипт
Код:
[OPEN]
:global list2 "";
:foreach i in [/ip firewall address-list find] do={:if ([:find [/ip firewall address-list get $i comment] "cid=283;"]=0) do={:set list2 ($list2 . "," . $i)}};
/ip firewall address-list remove $list2;
:global list1 "";
:foreach i in [/queue tree find] do={:if ([:find [/queue tree get $i name] "cid=283"]=0) do={:set list1 ($list1 . "," . $i)}};
/queue tree remove $list1;
:global list "";
:foreach i in [/ip firewall mangle find] do={:if ([:find [/ip firewall mangle get $i comment] "cid=283;"]=0) do={:set list ($list . "," . $i)}};
/ip firewall mangle remove $list;
ip firewall address-list add address=10.10.0.96/30 list=ACCESS_LIST comment="cid=283;rule_id;";
ip firewall address-list add address=10.10.0.96/30 list="cid=283" comment="cid=283;rule_id;";
ip firewall mangle add chain=forward action=mark-connection new-connection-mark=283-up passthrough=yes src-address-list="cid=283" comment="cid=283;rule_id;";
ip firewall mangle add chain=forward action=mark-packet new-packet-mark=283-up-pack connection-mark=283-up passthrough=yes comment="cid=283;rule_id;";
ip firewall mangle add chain=forward action=mark-connection new-connection-mark=283-down passthrough=yes dst-address-list="cid=283" comment="cid=283;rule_id;";
ip firewall mangle add chain=forward action=mark-packet new-packet-mark=283-down-pack connection-mark=283-down passthrough=yes comment="cid=283;rule_id;";
queue tree add limit-at=128000 max-limit=128000 name="cid=283-up" packet-mark=283-up-pack parent="3Up" priority=8 queue=default;
queue tree add limit-at=128000 max-limit=128000 name="cid=283-down" packet-mark=283-down-pack parent="3Down" priority=8 queue=default;
[/OPEN]
[CLOSE]
:global list2 "";
:foreach i in [/ip firewall address-list find] do={:if ([:find [/ip firewall address-list get $i comment] "cid=283;"]=0) do={:set list2 ($list2 . "," . $i)}};
/ip firewall address-list remove $list2;
:global list1 "";
:foreach i in [/queue tree find] do={:if ([:find [/queue tree get $i name] "cid=283"]=0) do={:set list1 ($list1 . "," . $i)}};
/queue tree remove $list1;
:global list "";
:foreach i in [/ip firewall mangle find] do={:if ([:find [/ip firewall mangle get $i comment] "cid=283;"]=0) do={:set list ($list . "," . $i)}};
/ip firewall mangle remove $list;
[/CLOSE]
[DELETE]
:global list2 "";
:foreach i in [/ip firewall address-list find] do={:if ([:find [/ip firewall address-list get $i comment] "cid=283;"]=0) do={:set list2 ($list2 . "," . $i)}};
/ip firewall address-list remove $list2;
:global list1 "";
:foreach i in [/queue tree find] do={:if ([:find [/queue tree get $i name] "cid=283"]=0) do={:set list1 ($list1 . "," . $i)}};
/queue tree remove $list1;
:global list "";
:foreach i in [/ip firewall mangle find] do={:if ([:find [/ip firewall mangle get $i comment] "cid=283;"]=0) do={:set list ($list . "," . $i)}};
/ip firewall mangle remove $list;
[/DELETE]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Задача проверка шлюзов и Mikrotik
СообщениеДобавлено: 20 окт 2010, 22:51 
Не в сети
Аватара пользователя

Зарегистрирован: 23 мар 2009, 23:16
Сообщения: 780
Откуда: St.Petersburg
Карма: 0
А в чем причина пропажи правил-то?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Задача проверка шлюзов и Mikrotik
СообщениеДобавлено: 21 окт 2010, 09:45 
Не в сети

Зарегистрирован: 19 дек 2008, 17:46
Сообщения: 749
Карма: 10
В Микротике queue tree не разрешает создавать Коментарии - поэтому мы искали записи по только названию CID без использования rule_id. Но если например у одного договора сид 200 а у другого 2000 то при удалении 200 сида скриптом удалялся и 2000.
Сейчас сделали поиск так сид=200-
Кажется я кривой скрипт выложил вот верный

Код:
[DEFAULT]
[OPEN]
:global list2 "";
:foreach i in [/queue tree find]  do={:if ([:find [/queue tree get $i name] "cid={CID}-"]=0) do={:set list2 ($list2 . "," . $i)}};
/queue tree remove $list2;
:global list1 "";
:foreach i in [/ip firewall mangle find]  do={:if ([:find [/ip firewall mangle get $i comment] "cid={CID};"]=0) do={:set list1 ($list1 . "," . $i)}};
/ip firewall mangle remove $list1;
:global list "";
:foreach i in [/ip firewall address-list find]  do={:if ([:find [/ip firewall address-list get $i comment] "cid={CID};"]=0) do={:set list ($list . "," . $i)}};
/ip firewall address-list remove $list;
<LOOP_NET>
ip firewall address-list add address={NET} list=ACCESS_LIST comment="cid={CID};rule_id;";
ip firewall address-list add address={NET} list="cid={CID}" comment="cid={CID};rule_id;";
</LOOP_NET>
ip firewall mangle add chain=forward action=mark-connection new-connection-mark={CID}-up passthrough=yes src-address-list="cid={CID}" comment="cid={CID};rule_id;";
ip firewall mangle add chain=forward action=mark-packet new-packet-mark={CID}-up-pack connection-mark={CID}-up passthrough=yes comment="cid={CID};rule_id;";
ip firewall mangle add chain=forward action=mark-connection new-connection-mark={CID}-down passthrough=yes dst-address-list="cid={CID}" comment="cid={CID};rule_id;";
ip firewall mangle add chain=forward action=mark-packet new-packet-mark={CID}-down-pack connection-mark={CID}-down passthrough=yes comment="cid={CID};rule_id;";
queue tree add limit-at=${speed} max-limit=${speed} name="cid={CID}-up" packet-mark={CID}-up-pack parent="${tree_up}" priority=8 queue=default;
queue tree add limit-at=${speed} max-limit=${speed} name="cid={CID}-down" packet-mark={CID}-down-pack parent="${tree_down}" priority=8 queue=default;

[/OPEN]

[CLOSE]
:global list2 "";
:foreach i in [/queue tree find]  do={:if ([:find [/queue tree get $i name] "cid={CID}-"]=0) do={:set list2 ($list2 . "," . $i)}};
/queue tree remove $list2;
:global list1 "";
:foreach i in [/ip firewall mangle find]  do={:if ([:find [/ip firewall mangle get $i comment] "cid={CID};"]=0) do={:set list1 ($list1 . "," . $i)}};
/ip firewall mangle remove $list1;
:global list "";
:foreach i in [/ip firewall address-list find]  do={:if ([:find [/ip firewall address-list get $i comment] "cid={CID};"]=0) do={:set list ($list . "," . $i)}};
/ip firewall address-list remove $list;
[/CLOSE]

[DELETE]
:global list2 "";
:foreach i in [/queue tree find]  do={:if ([:find [/queue tree get $i name] "cid={CID}-"]=0) do={:set list2 ($list2 . "," . $i)}};
/queue tree remove $list2;
:global list1 "";
:foreach i in [/ip firewall mangle find]  do={:if ([:find [/ip firewall mangle get $i comment] "cid={CID};"]=0) do={:set list1 ($list1 . "," . $i)}};
/ip firewall mangle remove $list1;
:global list "";
:foreach i in [/ip firewall address-list find]  do={:if ([:find [/ip firewall address-list get $i comment] "cid={CID};"]=0) do={:set list ($list . "," . $i)}};
/ip firewall address-list remove $list;
[/DELETE]
[/DEFAULT]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Задача проверка шлюзов и Mikrotik
СообщениеДобавлено: 21 окт 2010, 12:26 
Не в сети
Аватара пользователя

Зарегистрирован: 23 мар 2009, 23:16
Сообщения: 780
Откуда: St.Petersburg
Карма: 0
Ага, понятно.
Пару дополнений. Скрипт для 5.1 не пойдет - там изменения в макроподстановках для LOOP_NET.
Удаление можно укоростить без использования переменных. К примеру:
Код:
:foreach i in [/queue tree find]  do={:if ([:find [/queue tree get $i name] "cid={CID}-"]=0) do={[/queue tree remove $i]}};


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Задача проверка шлюзов и Mikrotik
СообщениеДобавлено: 15 ноя 2012, 23:07 
Не в сети

Зарегистрирован: 13 ноя 2012, 00:58
Сообщения: 1
Карма: 0
Пытался реализовать этот скрипт на связке BGB 5.0 и Mikrotik 5.21. не выходит. Есть другой скрипт, серез него реализовано только добавление в adress list и simpe queue. Хотелось бы с маркировкой пакетов и проверкой осстояния. требуется реализация измения скорости в зависимости от времени. кто нибудь может помочь?


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

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


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

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


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

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