forum.bitel.ru http://forum.bitel.ru/ |
|
mikrotik и ipn http://forum.bitel.ru/viewtopic.php?f=7&t=8127 |
Страница 1 из 1 |
Автор: | skyb [ 06 июн 2013, 10:58 ] |
Заголовок сообщения: | mikrotik и ipn |
Приветствую всех, а ниукого нет рабочего скрипта, на примере этого Код: 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 и при следующем запросе адреса абоненту будет выдан уже другой.ч
|
Страница 1 из 1 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |