BiTel

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

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




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: mikrotik и ipn
СообщениеДобавлено: 06 июн 2013, 10:58 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 03 авг 2009, 18:42
Сообщения: 7166
Откуда: Благовещенск
Карма: 241
Приветствую всех, а ниукого нет рабочего скрипта, на примере этого

Код:
import java.util.*;
import java.util.regex.*;
import java.text.*;
import java.sql.*;

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" );
   String login = gateSetup.get( "login", "root" );
   String 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" );

      for ( UserStatus status : statusList )
      {
         new_address_list = null;
         cid = status.contractId;
         getNewRule(status);
         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 );
                  log.info("DeleteRules cid="+cid+" rule_id="+rule_id);
               }
               else
               {
                  // закрываем
                  rules = getCloseRules( status );
                  log.info("CloseRules cid="+cid+" rule_id="+rule_id);
               };
            };
         }
         else if ( status.status == IPNContractStatus.STATUS_OPEN )
         {
            //открываем
            rules = getOpenRules( status );
            log.info("OpenRules cid="+cid+" rule_id="+rule_id);
         };

         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\\]" );
print("yes");
}
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;
}
private getNewRule(status)
{
   if (status.ruleType == null){
      return;
   };
   H = new Hashtable();
   H.put("operation", "get_ipn_rule_id");
   H.put("cid", status.contractId);
   H.put("mid", status.mid);
   H.put("sid", 5);
   H.put("time", new GregorianCalendar());
   ParseTarif(H);
   rule_id = H.get("rule_id");
   if (rule_id != null)
   {
      rule_type_manager = new RuleTypeManager(con,status.mid);
      status.ruleType = rule_type_manager.getType(Integer.parseInt(rule_id));
   };
}
private ParseTarif(H)
{
   H.put("is_found", false);
   cid = H.get("cid");
   if (cid == null)
   {
      return;
   };
   time = H.get("time");
   if (time == null)
   {
      return;
   };
   formatter = new SimpleDateFormat("yyyy-MM-dd");
   tarif_date = formatter.format(time.getTime()).toString();

   query = "SELECT contract_tree_link.tree_id "+
   "FROM contract_tree_link "+
   "WHERE "+
   "(contract_tree_link.date1 is NULL OR contract_tree_link.date1<='"+tarif_date+"') AND "+
   "(contract_tree_link.date2 is NULL OR contract_tree_link.date2>='"+tarif_date+"') AND "+
   "contract_tree_link.cid='"+cid+"' "+
   "UNION "+
   "SELECT tariff_tree_link.tree_id "+
   "FROM contract_tariff "+
   "  INNER JOIN tariff_tree_link "+
   "  ON (contract_tariff.tpid=tariff_tree_link.tpid) "+
   "WHERE (contract_tariff.date1 is NULL OR contract_tariff.date1<='"+tarif_date+"') AND "+
   "(contract_tariff.date2 is NULL OR contract_tariff.date2>='"+tarif_date+"') AND "+
   "contract_tariff.cid='"+cid+"'";
   re = con.prepareStatement(query);
   rs = re.executeQuery();
   while (rs.next())
   {
      tree_id = rs.getString(1);
      ParseMTree(tree_id,H);
   };
}
private ParseMTree(tree_id,H)
{   
   is_found = H.get("is_found");
   if (is_found == null)
   {
      return;
   };
   if (is_found)
   {
      return;
   };
   mid = H.get("mid");
   if (mid == null)
   {
      return;
   };
   query = "SELECT mtree_node.id "+
   "FROM module_tariff_tree "+
   "  INNER JOIN mtree_node "+
   "  ON (module_tariff_tree.id=mtree_node.mtree_id) "+
   "WHERE mtree_node.type='root' AND module_tariff_tree.tree_id='"+tree_id+"' AND module_tariff_tree.mid='"+mid+"'";
   re = con.prepareStatement(query);
   rs = re.executeQuery();
   while (rs.next())
   {
      node_id = rs.getString(1);
      ParseNode(node_id,H);
   };
}
private ParseNode(node_id,H)
{
   is_found = H.get("is_found");
   if (is_found == null)
   {
      return;
   };
   if (is_found)
   {
      return;
   };
   sid = H.get("sid");
   if (sid == null)
   {
      return;
   };
   operation = H.get("operation");
   if (operation == null)
   {
      return;
   };
   time = H.get("time");
   if (time == null)
   {
      return;
   };
   query = "SELECT id, type, data FROM mtree_node WHERE parent_node='"+node_id+"'";
   re = con.prepareStatement(query);
   rs = re.executeQuery();
   while (rs.next())
   {
      id = rs.getString(1);
      type = rs.getString(2);
      data = rs.getString(3);
      if (type.equals("service") && sid != Integer.parseInt(data))
      {
         continue;
      };
      if (type.equals("ipn_rule") && operation.equals("get_ipn_rule_id"))
      {
         datas = data.split ("&");
         H.put("rule_id",datas[1]);
         H.put("is_found",true);
      };
      if (type.equals("period"))
      {
         datas = data.split ("%");
         date1 = null;
         date2 = null;
         for (i=0; i<datas.length; i++)
         {
            date_arr = datas[i].split("&");
            if (date_arr.length != 2)
            {
               continue;
            };
            formatter = new SimpleDateFormat("dd.MM.yyyy");
            date = formatter.parse(date_arr[1]);
            if (date_arr[0].equals("date1"))
            {
               date1 = date;
            };
            if (date_arr[0].equals("date2"))
            {
               date2 = date;
            };
         };
         if (date1 != null && date1.compareTo(time.getTime()) != -1){
            continue;
         };
         if (date2 != null && date2.compareTo(time.getTime()) != 1){
            continue;
         };
      };
      ParseNode(id,H);
   };
};

Который плюс ещё ковсему будет брать влан с договора и подставлять в команды

Код:
/interface vlan
add interface=bridge1 name=vlan_4 vlan-id=4
/ip pool
add name=dhcp_pool4 ranges=10.50.20.4
/ip dhcp-server
add address-pool=dhcp_pool4 disabled=no interface=vlan_4 lease-time=10m name=dhcp_4
/ip address
add address=10.50.20.1/24 interface=vlan_4
/ip dhcp-server network
add address=10.50.20.0/24 dns-server=10.50.20.1 gateway=10.50.20.1
/ip route
add distance=1 dst-address=10.50.20.3/32 gateway=vlan_4


А для изменения данных

Код:
/ip pool set [find name=dhcp_pool4] ranges=10.50.20.2
где вместо 4 будет подставлять номер влана, например dhcp_pool100 и при следующем запросе адреса абоненту будет выдан уже другой.ч

_________________
Код:
  Клиент: вер. 6.2.714 / 25.05.2015 17:27:15
    os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_45
  Сервер: вер. 6.2.881 / 22.05.2015 17:56:55
    os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_45
Помощь по администрированию bgbilling в jabber конференции или Группа в telegram
Стиль программирования - пьяный мастерстер
Разработка мобильных приложений


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

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


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

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


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

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