package org.opennaas.extensions.router.junos.commandsets.digester; import org.apache.commons.digester.Digester; import org.apache.commons.digester.RuleSetBase; import org.opennaas.extensions.router.model.EthernetPort; import org.opennaas.extensions.router.model.IPHeadersFilter; import org.opennaas.extensions.router.model.IPHeadersFilter.HdrIPVersion; import org.opennaas.extensions.router.model.LogicalTunnelPort; import org.opennaas.extensions.router.model.ManagedSystemElement.OperationalStatus; import org.opennaas.extensions.router.model.NetworkPort; import org.opennaas.extensions.router.model.NetworkPort.LinkTechnology; import org.opennaas.extensions.router.model.utils.IPUtilsHelper; public class PhysicalInterfaceParser extends DigesterEngine { class ParserRuleSet extends RuleSetBase { private String prefix = ""; protected ParserRuleSet() { } protected ParserRuleSet(String prefix) { this.prefix = prefix; } @Override public void addRuleInstances(Digester arg0) { // FIXME IT HAVE TO GET ONLY PHYSICAL INTERFACES addObjectCreate("*/interface-information/physical-interface", NetworkPort.class); addMyRule("*/interface-information/physical-interface/name", "setName", 0); addMyRule("*/interface-information/physical-interface/description", "setDescription", 0); addCallMethod("*/interface-information/physical-interface/current-physical-address", "setPermanentAddress", 0); addMyRule("*/interface-information/physical-interface/link-level-type", "setLinkTechnologyParser", 0); // addCallMethod("*/interface-information/physical-interface/mtu", "setSupportedMaximumTransmissionUnit", 0); addMyRule("*/interface-information/physical-interface/link-mode", "setFullDuplexParser", 0); addMyRule("*/interface-information/physical-interface/speed", "setMaxSpeedParser", 0); addBeanPropertySetter("*/interface-information/physical-interface/description", "description"); /* Add physical interface to the parent */ addSetNext("*/interface-information/physical-interface", "addInterface"); } } public PhysicalInterfaceParser() { this.ruleSet = new ParserRuleSet(); } /* Configure name */ public void setName(String name) { NetworkPort networkPort = (NetworkPort) peek(); String[] nameAndUnit = name.split("\\."); if (nameAndUnit.length == 1) { networkPort.setName(name); } else { networkPort.setName(nameAndUnit[0]); int portNumber = -1; try { portNumber = Integer.parseInt(nameAndUnit[1]); } catch (NumberFormatException numFormatException) { return; } networkPort.setPortNumber(portNumber); } } public void setDescription(String description) { NetworkPort networkPort = (NetworkPort) peek(); networkPort.setDescription(description); } public void addInterface(NetworkPort networkPort) { int numPort = networkPort.getPortNumber(); String nameInterface = networkPort.getName(); if (numPort != -1) { nameInterface = nameInterface + "." + numPort; } if (networkPort.getName().startsWith("lt")) { LogicalTunnelPort logicalTunnel = (LogicalTunnelPort) networkPort; if (mapElements.containsKey(nameInterface)) { LogicalTunnelPort hashLogicalPort = (LogicalTunnelPort) mapElements.get(nameInterface); // TODO implements merge method logicalTunnel.merge((LogicalTunnelPort) hashLogicalPort); mapElements.remove(nameInterface); } mapElements.put(nameInterface, logicalTunnel); } else { EthernetPort ethernetPort = (EthernetPort) networkPort; if (mapElements.containsKey(nameInterface)) { NetworkPort hashLogicalPort = (NetworkPort) mapElements.get(nameInterface); ethernetPort.merge((EthernetPort) hashLogicalPort); mapElements.remove(nameInterface); } mapElements.put(nameInterface, ethernetPort); } } /* IPHeadersFilter Parser */ public void setHdrSrcAddressParser(String srcAddress) { try { IPHeadersFilter ipHeadersFilter = (IPHeadersFilter) peek(); String[] arrayIP = srcAddress.split("/"); if (arrayIP.length > 1) { String netmask = arrayIP[1]; String longNetmask = IPUtilsHelper.parseShortToLongIpv4NetMask(netmask); ipHeadersFilter.setHdrSrcMask(IPUtilsHelper.parseStrIPToBytesIP(longNetmask)); ipHeadersFilter.setHdrIPVersion(HdrIPVersion.IPV4); } ipHeadersFilter.setHdrSrcAddress(IPUtilsHelper.parseStrIPToBytesIP(srcAddress)); } catch (Exception e) { log.error(e.getMessage()); } } /* Ethernet port Parser */ public final static String FULLDUPLEX = "Full-duplex"; public void setLinkTechnologyParser(String linkTechnology) { try { NetworkPort networkPort = (NetworkPort) peek(); networkPort.setLinkTechnology(LinkTechnology.valueOf(linkTechnology)); } catch (Exception e) { log.error(e.getMessage()); } } public void setFullDuplexParser(String fullDuplex) { try { NetworkPort networkPort = (NetworkPort) peek(); networkPort.setFullDuplex(fullDuplex.equals(FULLDUPLEX)); } catch (Exception e) { log.error(e.getMessage()); } } private static final String UNLIMITED = "Unlimited"; private long parseMaxSpeed(String strMaxSpeed) { // parse if the max speed is defined long maxSpeed = -1; if (!strMaxSpeed.equals(UNLIMITED)) { // set the speed of the interface in Mbps String[] arrayMaxSpeed = strMaxSpeed.split("m"); strMaxSpeed = arrayMaxSpeed[0]; maxSpeed = Long.parseLong(strMaxSpeed); } return maxSpeed; } public void setMaxSpeedParser(String strMaxSpeed) { try { // TODO FIX IF IT IS NOT ONLY POSSIBLE TO FIX NUMBERS NetworkPort networkPort = (NetworkPort) peek(); long maxSpeed = parseMaxSpeed(strMaxSpeed); networkPort.setMaxSpeed(maxSpeed); } catch (Exception e) { log.error(e.getMessage()); } } public static final String strDOWN = "down"; public static final String strUP = "up"; public void setEnabledStateParser(String enabledState) { try { NetworkPort networkPort = (NetworkPort) peek(); if (enabledState.equals(strDOWN)) { networkPort.setOperationalStatus(OperationalStatus.STOPPED); } else { networkPort.setOperationalStatus(OperationalStatus.OK); } } catch (Exception e) { log.error(e.getMessage()); } } public String toPrint() { String str = "" + '\n'; for (String key : mapElements.keySet()) { NetworkPort port = (NetworkPort) mapElements.get(key); str += "- NetworkPort: " + '\n'; str += port.getName() + '\n'; str += port.getPermanentAddress() + '\n'; str += String.valueOf(port.isFullDuplex()) + '\n'; str += String.valueOf(port.getMaxSpeed()) + '\n'; str += port.getDescription() + '\n'; if (mapElements.get(key) instanceof LogicalTunnelPort) { LogicalTunnelPort logicalTunnel = new LogicalTunnelPort(); str += "lt peer-unit:" + logicalTunnel.getPeer_unit(); } } return str; } }