package org.mobicents.protocols.ss7.m3ua.impl.oam; import java.util.Arrays; import java.util.List; import java.util.Map; import javolution.util.FastMap; import org.apache.log4j.Logger; import org.mobicents.protocols.api.Association; import org.mobicents.protocols.api.AssociationType; import org.mobicents.protocols.api.IpChannelType; import org.mobicents.protocols.api.Management; import org.mobicents.protocols.api.Server; import org.mobicents.ss7.management.console.ShellExecutor; public class SCTPShellExecutor implements ShellExecutor { private static final Logger logger = Logger.getLogger(SCTPShellExecutor.class); private FastMap<String, Management> sctpManagements = new FastMap<String, Management>(); private Management sctpManagement = null; public Map<String, Management> getSctpManagements() { return sctpManagements; } public void setSctpManagements(Map<String, Management> sctpManagementsTemp) { if (sctpManagementsTemp != null) { synchronized (this) { FastMap<String, Management> newsctpManagements = new FastMap<String, Management>(); newsctpManagements.putAll(sctpManagementsTemp); this.sctpManagements = newsctpManagements; } } } private void setDefaultValue() { if (this.sctpManagement == null) { Map.Entry<String, Management> sctpManagementsTmp = this.sctpManagements.entrySet().iterator().next(); this.sctpManagement = sctpManagementsTmp.getValue(); } } private String showServers(String[] args) { // sctp server show stackname <stack-name> String sctpStackName = null; if (args.length > 3) { if (!args[3].equals("stackname")) { return M3UAOAMMessages.INVALID_COMMAND; } sctpStackName = args[4]; Management sctpManagementtmp = this.sctpManagements.get(sctpStackName); if (sctpManagementtmp == null) { return String.format(M3UAOAMMessages.NO_SCTP_MANAGEMENT_BEAN_FOR_NAME, sctpStackName); } this.sctpManagement = sctpManagementtmp; } else { this.setDefaultValue(); } List<Server> servers = this.sctpManagement.getServers(); if (servers.size() == 0) { return String.format(SCTPOAMMessages.NO_SERVER_DEFINED_YET, this.sctpManagement.getName()); } StringBuffer sb = new StringBuffer(); for (Server server : servers) { sb.append(M3UAOAMMessages.NEW_LINE); sb.append("SERVER ").append(server.getIpChannelType().getType()).append(" name=").append(server.getName()) .append(" started=").append(server.isStarted()).append(" hostIp=").append(server.getHostAddress()) .append(" hostPort=").append(server.getHostport()); String[] secondaryHostAdd = server.getExtraHostAddresses(); if (secondaryHostAdd != null && secondaryHostAdd.length > 0) { sb.append(" secondaryHost="); for (int i = 0; i < secondaryHostAdd.length; i++) { sb.append(secondaryHostAdd[i]).append(" "); } } List<String> associations = server.getAssociations(); sb.append(M3UAOAMMessages.NEW_LINE); sb.append("Associations:"); for (String s : associations) { sb.append(M3UAOAMMessages.TAB); sb.append(s).append(M3UAOAMMessages.NEW_LINE); } sb.append(M3UAOAMMessages.NEW_LINE); } return sb.toString(); } private String showAssociations(String[] args) { // sctp association show stackname <stack-name> String sctpStackName = null; if (args.length > 3) { if (!args[3].equals("stackname")) { return M3UAOAMMessages.INVALID_COMMAND; } sctpStackName = args[4]; Management sctpManagementtmp = this.sctpManagements.get(sctpStackName); if (sctpManagementtmp == null) { return String.format(M3UAOAMMessages.NO_SCTP_MANAGEMENT_BEAN_FOR_NAME, sctpStackName); } this.sctpManagement = sctpManagementtmp; } else { this.setDefaultValue(); } Map<String, Association> associations = this.sctpManagement.getAssociations(); if (associations.size() == 0) { return SCTPOAMMessages.NO_ASSOCIATION_DEFINED_YET; } StringBuffer sb = new StringBuffer(); for (String s : associations.keySet()) { Association asso = associations.get(s); sb.append(M3UAOAMMessages.NEW_LINE); sb.append("ASSOCIATION ").append(asso.getIpChannelType().getType()).append(" name=").append(asso.getName()) .append(" started=").append(asso.isStarted()).append(" peerIp=").append(asso.getPeerAddress()) .append(" peerPort=").append(asso.getPeerPort()); if (asso.getAssociationType() == AssociationType.CLIENT) { sb.append(" hostIp=").append(asso.getHostAddress()).append(" hostPort=").append(asso.getHostPort()); } else { sb.append(" server=").append(asso.getServerName()); } sb.append(" type=").append(asso.getAssociationType()); String[] secondaryHostAdd = asso.getExtraHostAddresses(); if (secondaryHostAdd != null && secondaryHostAdd.length > 0) { sb.append(" secondaryHost="); for (int i = 0; i < secondaryHostAdd.length; i++) { sb.append(secondaryHostAdd[i]).append(" "); } } sb.append(M3UAOAMMessages.NEW_LINE); } return sb.toString(); } @Override public String execute(String[] args) { try { if (this.sctpManagements.size() == 0) { return M3UAOAMMessages.NO_SCTP_MANAGEMENT_BEAN; } if (args.length < 2 || args.length > 13) { // any command will have atleast 3 args return M3UAOAMMessages.INVALID_COMMAND; } if (args[1] == null) { return M3UAOAMMessages.INVALID_COMMAND; } if (args[1].equals("server")) { if (args.length < 3 ){ return M3UAOAMMessages.INVALID_COMMAND; } String command = args[2]; if (command == null) { return M3UAOAMMessages.INVALID_COMMAND; } else if (command.equals("create")) { // command is sctp server create <sever-name> <host-ip> <host-port> sockettype <socket-type> stackname // <stack-name> if (args.length < 6 || args.length > 10) { return M3UAOAMMessages.INVALID_COMMAND; } String serverName = args[3]; if (serverName == null) { return M3UAOAMMessages.INVALID_COMMAND; } String hostAddress = args[4]; if (hostAddress == null) { return M3UAOAMMessages.INVALID_COMMAND; } String[] hostAddresses = hostAddress.split(","); String primaryAddress = hostAddresses[0]; String[] secondaryAddresses = null; if (hostAddresses.length > 1) { secondaryAddresses = new String[(hostAddresses.length - 1)]; for (int i = 0; i < secondaryAddresses.length; i++) { secondaryAddresses[i] = hostAddresses[(i + 1)]; } } int hostPort = Integer.parseInt(args[5]); IpChannelType ipChnnelType = null; String sctpStackName = null; int i = 6; if (args.length > 6) { while (i < args.length) { if (args[i].equals("stackname")) { sctpStackName = args[i + 1]; Management sctpManagementtmp = this.sctpManagements.get(sctpStackName); if (sctpManagementtmp == null) { return String.format(M3UAOAMMessages.NO_SCTP_MANAGEMENT_BEAN_FOR_NAME, sctpStackName); } this.sctpManagement = sctpManagementtmp; } else if (args[i].equals("sockettype")) { ipChnnelType = IpChannelType.getInstance(args[i + 1]); } i = i + 2; }// while loop } this.setDefaultValue(); if (ipChnnelType == null) { ipChnnelType = IpChannelType.SCTP; } this.sctpManagement.addServer(serverName, primaryAddress, hostPort, ipChnnelType, secondaryAddresses); return String.format(SCTPOAMMessages.ADD_SERVER_SUCCESS, serverName, this.sctpManagement.getName()); } else if (command.equals("destroy")) { // sctp server destroy <sever-name> stackname <stack-name> if (args.length < 4) { return M3UAOAMMessages.INVALID_COMMAND; } String serverName = args[3]; if (serverName == null) { return M3UAOAMMessages.INVALID_COMMAND; } String sctpStackName = null; if (args.length > 4) { if (!args[4].equals("stackname")) { return M3UAOAMMessages.INVALID_COMMAND; } sctpStackName = args[5]; Management sctpManagementtmp = this.sctpManagements.get(sctpStackName); if (sctpManagementtmp == null) { return String.format(M3UAOAMMessages.NO_SCTP_MANAGEMENT_BEAN_FOR_NAME, sctpStackName); } this.sctpManagement = sctpManagementtmp; } else { this.setDefaultValue(); } this.sctpManagement.removeServer(serverName); return String.format(SCTPOAMMessages.REMOVE_SERVER_SUCCESS, serverName, this.sctpManagement.getName()); } else if (command.equals("start")) { // sctp server start <sever-name> stackname <stack-name> if (args.length < 4) { return M3UAOAMMessages.INVALID_COMMAND; } String serverName = args[3]; if (serverName == null) { return M3UAOAMMessages.INVALID_COMMAND; } String sctpStackName = null; if (args.length > 4) { if (!args[4].equals("stackname")) { return M3UAOAMMessages.INVALID_COMMAND; } sctpStackName = args[5]; Management sctpManagementtmp = this.sctpManagements.get(sctpStackName); if (sctpManagementtmp == null) { return String.format(M3UAOAMMessages.NO_SCTP_MANAGEMENT_BEAN_FOR_NAME, sctpStackName); } this.sctpManagement = sctpManagementtmp; } else { this.setDefaultValue(); } this.sctpManagement.startServer(serverName); return String.format(SCTPOAMMessages.START_SERVER_SUCCESS, serverName, this.sctpManagement.getName()); } else if (command.equals("stop")) { // sctp server stop <sever-name> stackname <stack-name> if (args.length < 4) { return M3UAOAMMessages.INVALID_COMMAND; } String serverName = args[3]; if (serverName == null) { return M3UAOAMMessages.INVALID_COMMAND; } String sctpStackName = null; if (args.length > 4) { if (!args[4].equals("stackname")) { return M3UAOAMMessages.INVALID_COMMAND; } sctpStackName = args[5]; Management sctpManagementtmp = this.sctpManagements.get(sctpStackName); if (sctpManagementtmp == null) { return String.format(M3UAOAMMessages.NO_SCTP_MANAGEMENT_BEAN_FOR_NAME, sctpStackName); } this.sctpManagement = sctpManagementtmp; } else { this.setDefaultValue(); } this.sctpManagement.stopServer(serverName); return String.format(SCTPOAMMessages.STOP_SERVER_SUCCESS, serverName, this.sctpManagement.getName()); } else if (command.equals("show")) { return this.showServers(args); } return M3UAOAMMessages.INVALID_COMMAND; } else if (args[1].equals("association")) { if (args.length < 3 ){ return M3UAOAMMessages.INVALID_COMMAND; } String command = args[2]; if (command == null) { return M3UAOAMMessages.INVALID_COMMAND; } else if (command.equals("create")) { // sctp association create <assoc-name> <CLIENT | SERVER> <server-name> <peerip> <peer-port> <host- ip> // <host-port> sockettype <socket-type> stackname <stack-name> if (args.length < 8 || args.length > 13) { return M3UAOAMMessages.INVALID_COMMAND; } String assocName = args[3]; if (assocName == null) { return M3UAOAMMessages.INVALID_COMMAND; } String type = args[4]; if (type == null) { return M3UAOAMMessages.INVALID_COMMAND; } else if (type.equals("CLIENT")) { if (args.length < 9) { return M3UAOAMMessages.INVALID_COMMAND; } String peerIp = args[5]; int peerPort = Integer.parseInt(args[6]); String hostIp = args[7]; String[] hostAddresses = hostIp.split(","); String primaryAddress = hostAddresses[0]; String[] secondaryAddresses = null; if (hostAddresses.length > 1) { secondaryAddresses = new String[(hostAddresses.length - 1)]; for (int i = 0; i < secondaryAddresses.length; i++) { secondaryAddresses[i] = hostAddresses[(i + 1)]; } } int hostPort = Integer.parseInt(args[8]); IpChannelType ipChnnelType = null; String sctpStackName = null; int i = 9; if (args.length > 9) { while (i < args.length) { if (args[i].equals("stackname")) { sctpStackName = args[i + 1]; Management sctpManagementtmp = this.sctpManagements.get(sctpStackName); if (sctpManagementtmp == null) { return String.format(M3UAOAMMessages.NO_SCTP_MANAGEMENT_BEAN_FOR_NAME, sctpStackName); } this.sctpManagement = sctpManagementtmp; } else if (args[i].equals("sockettype")) { ipChnnelType = IpChannelType.getInstance(args[i + 1]); } i = i + 2; }// while loop } this.setDefaultValue(); if (ipChnnelType == null) { ipChnnelType = IpChannelType.SCTP; } this.sctpManagement.addAssociation(primaryAddress, hostPort, peerIp, peerPort, assocName, ipChnnelType, secondaryAddresses); return String.format(SCTPOAMMessages.ADD_CLIENT_ASSOCIATION_SUCCESS, assocName, this.sctpManagement.getName()); } else if (type.equals("SERVER")) { String serverName = args[5]; String peerIp = args[6]; int peerPort = Integer.parseInt(args[7]); IpChannelType ipChnnelType = null; String sctpStackName = null; int i = 8; if (args.length > 8) { while (i < args.length) { if (args[i].equals("stackname")) { sctpStackName = args[i + 1]; Management sctpManagementtmp = this.sctpManagements.get(sctpStackName); if (sctpManagementtmp == null) { return String.format(M3UAOAMMessages.NO_SCTP_MANAGEMENT_BEAN_FOR_NAME, sctpStackName); } this.sctpManagement = sctpManagementtmp; } else if (args[i].equals("sockettype")) { ipChnnelType = IpChannelType.getInstance(args[i + 1]); } i = i + 2; }// while loop } if (this.sctpManagement == null) { this.setDefaultValue(); } if (ipChnnelType == null) { ipChnnelType = IpChannelType.SCTP; } this.sctpManagement.addServerAssociation(peerIp, peerPort, serverName, assocName, ipChnnelType); return String.format(SCTPOAMMessages.ADD_SERVER_ASSOCIATION_SUCCESS, assocName, this.sctpManagement.getName()); } return M3UAOAMMessages.INVALID_COMMAND; } else if (command.equals("destroy")) { // sctp association destroy <assoc-name> stackname <stack-name> if (args.length < 4) { return M3UAOAMMessages.INVALID_COMMAND; } String assocName = args[3]; if (assocName == null) { return M3UAOAMMessages.INVALID_COMMAND; } String sctpStackName = null; if (args.length > 4) { if (!args[4].equals("stackname")) { return M3UAOAMMessages.INVALID_COMMAND; } sctpStackName = args[5]; Management sctpManagementtmp = this.sctpManagements.get(sctpStackName); if (sctpManagementtmp == null) { return String.format(M3UAOAMMessages.NO_SCTP_MANAGEMENT_BEAN_FOR_NAME, sctpStackName); } this.sctpManagement = sctpManagementtmp; } else { this.setDefaultValue(); } this.sctpManagement.removeAssociation(assocName); return String.format(SCTPOAMMessages.REMOVE_ASSOCIATION_SUCCESS, assocName, this.sctpManagement.getName()); } else if (command.equals("show")) { return this.showAssociations(args); } return M3UAOAMMessages.INVALID_COMMAND; } else if (args[1].equals("set")) { return this.manageSet(args); } else if (args[1].equals("get")) { return this.manageGet(args); } return M3UAOAMMessages.INVALID_COMMAND; } catch (Exception e) { logger.error(String.format("Error while executing comand %s", Arrays.toString(args)), e); return e.toString(); } catch (Throwable t) { logger.error(String.format("Error while executing comand %s", Arrays.toString(args)), t); return t.toString(); } } private String manageSet(String[] options) throws Exception { // Minimum 4 needed. Show // sctp set <command> <value> stackname <stack-name> if (options.length < 4 || options.length > 6) { return M3UAOAMMessages.INVALID_COMMAND; } String sctpStackName = null; if (options.length > 4) { if (!options[4].equals("stackname")) { return M3UAOAMMessages.INVALID_COMMAND; } sctpStackName = options[5]; Management sctpManagementtmp = this.sctpManagements.get(sctpStackName); if (sctpManagementtmp == null) { return String.format(M3UAOAMMessages.NO_SCTP_MANAGEMENT_BEAN_FOR_NAME, sctpStackName); } this.sctpManagement = sctpManagementtmp; } else { this.setDefaultValue(); } String parName = options[2].toLowerCase(); if (parName.equals("connectdelay")) { int val = Integer.parseInt(options[3]); this.sctpManagement.setConnectDelay(val); } else if (parName.equals("cc_delaythreshold_1")) { double val = Double.parseDouble(options[3]); this.sctpManagement.setCongControl_DelayThreshold_1(val); } else if (parName.equals("cc_delaythreshold_2")) { double val = Double.parseDouble(options[3]); this.sctpManagement.setCongControl_DelayThreshold_2(val); } else if (parName.equals("cc_delaythreshold_3")) { double val = Double.parseDouble(options[3]); this.sctpManagement.setCongControl_DelayThreshold_3(val); } else if (parName.equals("cc_backtonormal_delaythreshold_1")) { double val = Double.parseDouble(options[3]); this.sctpManagement.setCongControl_BackToNormalDelayThreshold_1(val); } else if (parName.equals("cc_backtonormal_delaythreshold_2")) { double val = Double.parseDouble(options[3]); this.sctpManagement.setCongControl_BackToNormalDelayThreshold_2(val); } else if (parName.equals("cc_backtonormal_delaythreshold_3")) { double val = Double.parseDouble(options[3]); this.sctpManagement.setCongControl_BackToNormalDelayThreshold_3(val); } else { return M3UAOAMMessages.INVALID_COMMAND; } return String.format(M3UAOAMMessages.PARAMETER_SUCCESSFULLY_SET, this.sctpManagement.getName()); } private String manageGet(String[] options) throws Exception { // sctp get <command> // Minimum 2 needed. Show if (options.length < 2 || options.length > 3) { return M3UAOAMMessages.INVALID_COMMAND; } if (options.length == 3) { this.setDefaultValue(); String parName = options[2].toLowerCase(); StringBuilder sb = new StringBuilder(); sb.append("stack=").append(this.sctpManagement.getName()).append(" "); sb.append(options[2]); sb.append(" = "); if (parName.equals("connectdelay")) { sb.append(this.sctpManagement.getConnectDelay()); } else if (parName.equals("cc_delaythreshold_1")) { sb.append(this.sctpManagement.getCongControl_DelayThreshold_1()); } else if (parName.equals("cc_delaythreshold_2")) { sb.append(this.sctpManagement.getCongControl_DelayThreshold_2()); } else if (parName.equals("cc_delaythreshold_3")) { sb.append(this.sctpManagement.getCongControl_DelayThreshold_3()); } else if (parName.equals("cc_backtonormal_delaythreshold_1")) { sb.append(this.sctpManagement.getCongControl_BackToNormalDelayThreshold_1()); } else if (parName.equals("cc_backtonormal_delaythreshold_2")) { sb.append(this.sctpManagement.getCongControl_BackToNormalDelayThreshold_2()); } else if (parName.equals("cc_backtonormal_delaythreshold_3")) { sb.append(this.sctpManagement.getCongControl_BackToNormalDelayThreshold_3()); } else { return M3UAOAMMessages.INVALID_COMMAND; } return sb.toString(); } else { this.setDefaultValue(); StringBuilder sb = new StringBuilder(); for (FastMap.Entry<String, Management> e = this.sctpManagements.head(), end = this.sctpManagements.tail(); (e = e .getNext()) != end;) { Management managementImplTmp = e.getValue(); String stackname = e.getKey(); sb.append("Properties for "); sb.append(stackname); sb.append("\n"); sb.append("*******************"); sb.append("\n"); sb.append("connectdelay = "); sb.append(managementImplTmp.getConnectDelay()); sb.append("\n"); sb.append("cc_delaythreshold_1 = "); sb.append(this.sctpManagement.getCongControl_DelayThreshold_1()); sb.append("\n"); sb.append("cc_delaythreshold_2 = "); sb.append(this.sctpManagement.getCongControl_DelayThreshold_2()); sb.append("\n"); sb.append("cc_delaythreshold_3 = "); sb.append(this.sctpManagement.getCongControl_DelayThreshold_3()); sb.append("\n"); sb.append("cc_backtonormal_delaythreshold_1 = "); sb.append(this.sctpManagement.getCongControl_BackToNormalDelayThreshold_1()); sb.append("\n"); sb.append("cc_backtonormal_delaythreshold_2 = "); sb.append(this.sctpManagement.getCongControl_BackToNormalDelayThreshold_2()); sb.append("\n"); sb.append("cc_backtonormal_delaythreshold_3 = "); sb.append(this.sctpManagement.getCongControl_BackToNormalDelayThreshold_3()); sb.append("\n"); sb.append("*******************"); sb.append("\n"); sb.append("\n"); } return sb.toString(); } } /* * (non-Javadoc) * * @see org.mobicents.ss7.management.console.ShellExecutor#handles(java.lang. String) */ @Override public boolean handles(String command) { return command.startsWith("sctp"); } }