/*- * ============LICENSE_START======================================================= * ONAP - SO * ================================================================================ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============LICENSE_END========================================================= */ package org.onap.so.bpmn.common.scripts import java.text.SimpleDateFormat import org.apache.commons.codec.binary.Base64 import org.apache.commons.lang3.StringEscapeUtils import org.onap.so.bpmn.core.BPMNLogger import org.onap.so.bpmn.core.xml.XmlTool import org.onap.so.logger.MessageEnum import org.onap.so.logger.MsoLogger import org.onap.so.utils.CryptoUtils import org.slf4j.MDC import org.w3c.dom.Element import groovy.util.slurpersupport.NodeChild import groovy.xml.XmlUtil class MsoUtils { private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, MsoUtils.class); def initializeEndPoints(execution){ // use this placeholder to initialize end points, if called independently, this need to be set execution.setVariable("AAIEndPoint","http://localhost:28080/SoapUIMocks") } /** * Returns the unescaped contents of element * * @param xmlInput * @param element * @return */ def getNodeText(xmlInput,element){ def rtn=null if(xmlInput!=null){ def xml= new XmlSlurper().parseText(xmlInput) rtn= xml.'**'.find{node->node.name()==element} if (rtn != null){ rtn=rtn.text() } } return rtn } def getMultNodes(xmlInput, element){ def nodes=null if(xmlInput!=null){ def xml= new XmlSlurper().parseText(xmlInput) nodes = xml.'**'.findAll{ node-> node.name() == element }*.text() } return nodes } /** * Note: this uses XmlParser instead of XmlSlurper, thus it is not as * efficient because it instantiates the whole DOM tree. * @param xmlInput * @param element * @return a list of Nodes, or {@code null} if xmlInput is {@code null} */ def getMultNodeObjects(xmlInput, element){ def nodes=null if(xmlInput!=null){ def xml= new XmlParser().parseText(xmlInput) nodes = xml.'**'.findAll{ node-> node.name() == element } } return nodes } def getNodeXml(xmlInput,element){ return getNodeXml(xmlInput, element, true) } def getNodeXml(xmlInput,element,incPreamble){ def fxml= new XmlSlurper().parseText(xmlInput) NodeChild nodeToSerialize = fxml.'**'.find {it.name() == element} if(nodeToSerialize==null){ return "" } def nodeAsText = XmlUtil.serialize(nodeToSerialize) if (!incPreamble) { nodeAsText = removeXmlPreamble(nodeAsText) } return unescapeNodeContents(nodeToSerialize, nodeAsText) } def unescapeNodeContents(NodeChild node, String text) { if (!node.childNodes().hasNext()) { return StringEscapeUtils.unescapeXml(text) } else { return text } } def nodeExists(xmlInput,element){ try { def fxml= new XmlSlurper().parseText(xmlInput) def nodeToSerialize = fxml.'**'.find {it.name() == element} return nodeToSerialize!=null } catch(Exception e) { return false } } /***** Utilities when using XmlParser *****/ /** * Convert a Node into a String by deserializing it and formatting it. * * @param node Node to be converted. * @return the Node as a String. */ def String nodeToString(Node node) { def String nodeAsString = groovy.xml.XmlUtil.serialize(node) nodeAsString = removeXmlPreamble(nodeAsString) return formatXml(nodeAsString) } /** * Get the specified child Node of the specified parent. If there are * multiple children of the same name, only the first one is returned. * If there are no children with the specified name, 'null' is returned. * * @param parent Parent Node in which to find a child. * @param childNodeName Name of the child Node to get. * @return the (first) child Node with the specified name or 'null' * if a child Node with the specified name does not exist. */ def Node getChildNode(Node parent, String childNodeName) { def NodeList nodeList = getIdenticalChildren(parent, childNodeName) if (nodeList.size() == 0) { return null } else { return nodeList.get(0) } } /** * Get the textual value of the specified child Node of the specified parent. * If there are no children with the specified name, 'null' is returned. * * @param parent Parent Node in which to find a child. * @param childNodeName Name of the child Node whose value to get. * @return the textual value of child Node with the specified name or 'null' * if a child Node with the specified name does not exist. */ def String getChildNodeText(Node parent, String childNodeName) { def Node childNode = getChildNode(parent, childNodeName) if (childNode == null) { return null } else { return childNode.text() } } /** * Get all of the child nodes from the specified parent that have the * specified name. The returned NodeList could be empty. * * @param parent Parent Node in which to find children. * @param childNodeName Name of the children to get. * @return a NodeList of all the children from the parent with the specified * name. The list could be empty. */ def NodeList getIdenticalChildren(Node parent, String childNodeName) { return (NodeList) parent.get(childNodeName) } /***** End of Utilities when using XmlParser *****/ /** these are covered under the common function above**/ def getSubscriberName(xmlInput,element){ def rtn=null if(xmlInput!=null){ def xml= new XmlSlurper().parseText(xmlInput) rtn= xml.'**'.find{node->node.name()==element}.text() } return rtn } def getTenantInformation(xmlInput,element){ def xml= new XmlSlurper().parseText(xmlInput) def nodeToSerialize = xml.'**'.find {it.name() == 'service-information'} def nodeAsText = XmlUtil.serialize(nodeToSerialize) return nodeAsText } def getServiceInstanceId(xmlInput,element){ def xml= new XmlSlurper().parseText(xmlInput) return ( xml.'**'.find{node->node.name()==element}.text() ) } //for aai tenant url def searchResourceLink(xmlInput, resourceType){ def fxml= new XmlSlurper().parseText(xmlInput) def element = fxml.'**'.find {it.'resource-type' == resourceType} return (element == null) ? null : element.'resource-link'.text() } def searchMetaData(xmlInput, searchName, searchValue){ def fxml= new XmlSlurper().parseText(xmlInput) def ret = fxml.'**'.find {it.metaname.text() == searchName && it.metaval.text() == searchValue} if(ret != null){ return ret.parent().parent() } return ret } def searchMetaDataNode(fxml, searchName, searchValue){ def ret = fxml.'**'.find {it.metaname.text() == searchName && it.metaval.text() == searchValue} if(ret != null){ return ret.parent().parent() } return ret } // for Trinity L3 add/delete bonding def getPBGFList(isDebugLogEnabled, xmlInput){ log("DEBUG", "getPBGFList: xmlInput " + xmlInput,isDebugLogEnabled) ArrayList myNodes = new ArrayList() if(nodeExists(xmlInput,"nbnc-response-information")){ def respInfo=getNodeXml(xmlInput,"nbnc-response-information", false) if(respInfo!=null){ def fxml= new XmlSlurper().parseText(respInfo) fxml.'virtual-datacenter-list'.each { vdc -> //we only want to add two BGF per VDC, BGF1 and BGF2 def routerList = vdc.'router-list'.first() routerList.each{ myList -> def physNodes = myList.'**'.findAll {it.'border-element-tangibility'.text() =~ /PHYSICAL/} def nodeToAdd physNodes.each{ if(nodeToAdd==null){ nodeToAdd = it }else{ def beid = nodeToAdd.'border-element-id'.text() + " " + nodeToAdd.'border-element-type'.text() + " and " + it.'border-element-id'.text() + " " + it.'border-element-type'.text() def mytag = nodeToAdd.'border-element-id' mytag[0].replaceBody(beid) } } def mytag = nodeToAdd.'vlan-id' def ind = mytag.text().indexOf('.') if(ind >= 0){ def vlan = mytag.text().substring(0,ind) mytag[0].replaceBody(vlan) } myNodes.add(XmlUtil.serialize(nodeToAdd)) } } } return myNodes }else{ return null } } def getPBGFList(xmlInput){ getPBGFList("false", xmlInput) } def getMetaVal(node, name){ try{ return node.'**'.find {it.metaname.text() == name}.metaval.text() }catch(Exception e){ return null } } def log(logmode,logtxt,isDebugLogEnabled="false"){ if ("INFO"==logmode) { msoLogger.info(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, logtxt, "BPMN", MsoLogger.getServiceName()); } else if ("WARN"==logmode) { // to see the warning text displayed in the log entry, the text must also be passed as arg0 (2nd argument) to invoke the correct MsoLogger warn() method msoLogger.warn (MessageEnum.BPMN_GENERAL_WARNING, logtxt, "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, logtxt); } else if ("ERROR"==logmode) { // to see the error text displayed in the log entry, the text must also be passed as arg0 (2nd argument) to invoke the correct MsoLogger error() method msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, logtxt, "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, logtxt); } else { BPMNLogger.debug(isDebugLogEnabled, logtxt); } } def logContext(requestId, serviceInstanceId){ msoLogger.setLogContext(requestId, serviceInstanceId); } def logMetrics(elapsedTime, logtxt){ msoLogger.recordMetricEvent (elapsedTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, logtxt, "BPMN", MsoLogger.getServiceName(), null); } def logAudit(logtxt){ long startTime = System.currentTimeMillis(); msoLogger.recordAuditEvent (startTime, MsoLogger.StatusCode.COMPLETE, MsoLogger.ResponseCode.Suc, logtxt); } // headers: header - name-value def getHeaderNameValue(xmlInput, nameAttribute){ def rtn=null if(xmlInput!=null){ def xml= new XmlSlurper().parseText(xmlInput) rtn= xml.'**'.find {header->header.'@name'.text() == nameAttribute}.'@value' } return rtn } /** * Gets the children of the specified element. */ public String getChildNodes(xmlInput, element) { def xml= new XmlSlurper().parseText(xmlInput) def thisElement = xml.'**'.find {it.name() == element} StringBuilder out = new StringBuilder() if (thisElement != null) { thisElement.children().each() { String nodeAsText = removeXmlPreamble(XmlUtil.serialize(it)) if (out.length() > 0) { out.append(System.lineSeparator()) } out.append(nodeAsText) } } return out.toString(); } /** * Encodes a value so it can be used inside an XML text element. * * Will double encode * @param s the string to encode * @return the encoded string */ public static String xmlEscape(Object value) { return XmlTool.encode(value) } /** * Removes the preamble, if present, from an XML document. * Also, for historical reasons, this also trims leading and trailing * whitespace from the resulting document. TODO: remove the trimming * and fix unit tests that depend on EXACT xml format. * @param xml the XML document * @return a possibly modified document */ public String removeXmlPreamble(def xml) { if (xml == null) { return null } return XmlTool.removePreamble(xml).trim() } /** * Removes namespaces and namespace declarations from an XML document. * @param xml the XML document * @return a possibly modified document */ public String removeXmlNamespaces(def xml) { return XmlTool.removeNamespaces(xml); } /** * Use formatXml instead. Note: this method inserts an XML preamble. */ @Deprecated def formatXML(xmlInput) { def parseXml = null def formatXml = null if (xmlInput !=null) { parseXml = new XmlParser().parseText(xmlInput) formatXml = XmlUtil.serialize(parseXml) } } /** * Reformats an XML document. The result will not contain an XML preamble * or a trailing newline. * @param xml the XML document * @return a reformatted document */ public String formatXml(def xml) { return XmlTool.normalize(xml); } // build single elements def buildElements(xmlInput, elementList, parentName) { String var = "" def xmlBuild = "" if (parentName != "") { xmlBuild += "" } if (xmlInput != null) { for (element in elementList) { def xml= new XmlSlurper().parseText(xmlInput) var = xml.'**'.find {it.name() == element} if (var != null) { xmlBuild += ""+var.toString()+"" } } } if (parentName != "") { xmlBuild += "" } return xmlBuild } // build the Unbounded elements def buildElementsUnbounded(xmlInput, elementList, parentName) { def varParents = "" def var = "" def xmlBuildUnbounded = "" if (xmlInput != null) { def xml= new XmlSlurper().parseText(xmlInput) varParents = xml.'**'.findAll {it.name() == parentName} //println " Unbounded ${parentName} - varParent.Size() - " + varParents.size() for (i in 0..varParents.size()-1) { if (parentName != "") { xmlBuildUnbounded += "" } for (element in elementList) { var = varParents[i].'*'.find {it.name() == element} if (var != null) { xmlBuildUnbounded += ""+var.toString()+"" //println " i = " + i + ", element: " + element + " = " + var.toString() } } if (parentName != "") { xmlBuildUnbounded += "" } } } return xmlBuildUnbounded } // Build l2-homing-information def buildL2HomingInformation(xmlInput) { def elementsL2HomingList = ["evc-name", "topology", "preferred-aic-clli","aic-version"] def rebuildL2Home = '' if (xmlInput != null) { rebuildL2Home = buildElements(xmlInput, elementsL2HomingList, "l2-homing-information") } return rebuildL2Home } // Build internet-evc-access-information def buildInternetEvcAccessInformation(xmlInput) { def elementsInternetEvcAccessInformationList = ["internet-evc-speed-value", "internet-evc-speed-units", "ip-version"] def rebuildInternetEvcAccess = '' if (xmlInput != null) { rebuildInternetEvcAccess = buildElements(xmlInput, elementsInternetEvcAccessInformationList, "internet-evc-access-information") } return rebuildInternetEvcAccess } // Build ucpe-vms-service-information def buildUcpeVmsServiceInformation(xmlInput) { def rebuildUcpeVmsServiceInformation = '' if (xmlInput != null) { def ucpeVmsServiceInformation = getNodeXml(xmlInput, "ucpe-vms-service-information").drop(38).trim() rebuildUcpeVmsServiceInformation = "" // transport-service-information rebuildUcpeVmsServiceInformation += "" def transportServiceInformation = getNodeXml(ucpeVmsServiceInformation, "transport-service-information").drop(38).trim() def elementsTransportServiceInformationList = ["transport-service-type"] rebuildUcpeVmsServiceInformation += buildElements(transportServiceInformation, elementsTransportServiceInformationList, "") try { // optional def accessCircuitInfoList = ["access-circuit-id", "dual-mode"] rebuildUcpeVmsServiceInformation += buildElementsUnbounded(transportServiceInformation, accessCircuitInfoList, "access-circuit-info") } catch (Exception e) { log("ERROR", " Optional - Exception ACCESS-CIRCUIT-INFO - 'access-circuit-info' ") } rebuildUcpeVmsServiceInformation += "" // ucpe-information def elementsUcpeInformationList = ["ucpe-host-name", "ucpe-activation-code", "out-of-band-management-modem" ] rebuildUcpeVmsServiceInformation += buildElements(ucpeVmsServiceInformation, elementsUcpeInformationList, "ucpe-information") // vnf-list rebuildUcpeVmsServiceInformation += "" def vnfListList = ["vnf-instance-id", "vnf-sequence-number", "vnf-type", "vnf-vendor", "vnf-model", "vnf-id", "prov-status", "operational-state", "orchestration-status", "equipment-role" ] rebuildUcpeVmsServiceInformation += buildElementsUnbounded(ucpeVmsServiceInformation, vnfListList, "vnf-information") rebuildUcpeVmsServiceInformation += "" rebuildUcpeVmsServiceInformation += "" } log("DEBUG", " rebuildUcpeVmsServiceInformation - " + rebuildUcpeVmsServiceInformation) return rebuildUcpeVmsServiceInformation } // Build internet-service-change-details def buildInternetServiceChangeDetails(xmlInput) { def rebuildInternetServiceChangeDetails = "" if (xmlInput != null) { try { // optional def internetServiceChangeDetails = getNodeXml(xmlInput, "internet-service-change-details").drop(38).trim() rebuildInternetServiceChangeDetails = "" rebuildInternetServiceChangeDetails += buildElements(internetServiceChangeDetails, ["internet-evc-speed-value"], "") rebuildInternetServiceChangeDetails += buildElements(internetServiceChangeDetails, ["internet-evc-speed-units"], "") rebuildInternetServiceChangeDetails += buildElements(internetServiceChangeDetails, ["v4-vr-lan-address"], "") rebuildInternetServiceChangeDetails += buildElements(internetServiceChangeDetails, ["v4-vr-lan-prefix-length"], "") try { // optional def tProvidedV4LanPublicPrefixesChangesList = ["request-index", "v4-next-hop-address", "v4-lan-public-prefix", "v4-lan-public-prefix-length"] rebuildInternetServiceChangeDetails += buildElementsUnbounded(internetServiceChangeDetails, tProvidedV4LanPublicPrefixesChangesList, "t-provided-v4-lan-public-prefixes") } catch (Exception e) { log("ERROR"," Optional - Exception in INTERNET-SERVICE-CHANGE-DETAILS 't-provided-v4-lan-public-prefixes ") } try { // optional def tProvidedV6LanPublicPrefixesChangesList = ["request-index", "v6-next-hop-address", "v6-lan-public-prefix", "v6-lan-public-prefix-length"] rebuildInternetServiceChangeDetails += buildElementsUnbounded(internetServiceChangeDetails, tProvidedV6LanPublicPrefixesChangesList, "t-provided-v6-lan-public-prefixes") } catch (Exception e) { log("ERROR"," Optional - Exception INTERNET-SERVICE-CHANGE-DETAILS 't-provided-v6-lan-public-prefixes ") } rebuildInternetServiceChangeDetails += "" } catch (Exception e) { log("ERROR", " Optional - Exception INTERNET-SERVICE-CHANGE-DETAILS 'internet-service-change-details' ") } } return rebuildInternetServiceChangeDetails } // Build vr-lan def buildVrLan(xmlInput) { def rebuildVrLan = '' if (xmlInput != null) { rebuildVrLan = "" def vrLan = getNodeXml(xmlInput, "vr-lan").drop(38).trim() rebuildVrLan += buildElements(vrLan, ["routing-protocol"], "") // vr-lan-interface def rebuildVrLanInterface = "" def vrLanInterface = getNodeXml(vrLan, "vr-lan-interface").drop(38).trim() rebuildVrLanInterface += buildVrLanInterfacePartial(vrLanInterface) // dhcp def dhcp = getNodeXml(vrLan, "dhcp").drop(38).trim() def rebuildDhcp = buildDhcp(dhcp) rebuildVrLanInterface += rebuildDhcp // pat def pat = getNodeXml(vrLan, "pat").drop(38).trim() def rebuildPat = buildPat(pat) rebuildVrLanInterface += rebuildPat // nat def rebuildNat = "" try { // optional def nat = getNodeXml(vrLan, "nat").drop(38).trim() rebuildNat = buildNat(nat) } catch (Exception e) { log("ERROR", " Optional - Exception 'nat' ") } rebuildVrLanInterface += rebuildNat // firewall-lite def firewallLite = getNodeXml(vrLan, "firewall-lite").drop(38).trim() def rebuildFirewallLite = buildFirewallLite(firewallLite) rebuildVrLanInterface += rebuildFirewallLite // static-routes def rebuildStaticRoutes = "" try { // optional def staticRoutes = getNodeXml(vrLan, "static-routes").drop(38).trim() rebuildStaticRoutes = buildStaticRoutes(staticRoutes) } catch (Exception e) { log("ERROR", " Optional - Exception 'static-routes' ") } rebuildVrLanInterface += rebuildStaticRoutes rebuildVrLan += rebuildVrLanInterface rebuildVrLan += "" rebuildVrLan += "" } log("DEBUG", " rebuildVrLan - " + rebuildVrLan) return rebuildVrLan } // Build vr-lan-interface def buildVrLanInterfacePartial(xmlInput) { def rebuildingVrLanInterface = '' if (xmlInput != null) { def vrLanInterfaceList = ["vr-designation", "v4-vr-lan-prefix", "v4-vr-lan-address", "v4-vr-lan-prefix-length", "v6-vr-lan-prefix", "v6-vr-lan-address", "v6-vr-lan-prefix-length", "v4-vce-loopback-address", "v6-vce-wan-address"] rebuildingVrLanInterface += buildElements(xmlInput, vrLanInterfaceList, "") rebuildingVrLanInterface += "" try { // optional def tProvidedV4LanPublicPrefixes = getNodeXml(xmlInput, "v4-public-lan-prefixes").drop(38).trim() def tProvidedV4LanPublicPrefixesList = ["request-index", "v4-next-hop-address", "v4-lan-public-prefix", "v4-lan-public-prefix-length" ] rebuildingVrLanInterface += buildElementsUnbounded(xmlInput, tProvidedV4LanPublicPrefixesList, "t-provided-v4-lan-public-prefixes") } catch (Exception ex) { log("ERROR", " Optional - Exception VR-LAN INTERFACE 'v4-public-lan-prefixes' ") } rebuildingVrLanInterface += "" rebuildingVrLanInterface += "" try { // optional def tProvidedV6LanPublicPrefixes = getNodeXml(xmlInput, "v6-public-lan-prefixes").drop(38).trim() def tProvidedV6LanPublicPrefixesList = ["request-index", "v6-next-hop-address", "v6-lan-public-prefix", "v6-lan-public-prefix-length" ] rebuildingVrLanInterface += buildElementsUnbounded(xmlInput, tProvidedV6LanPublicPrefixesList, "t-provided-v6-lan-public-prefixes") } catch (Exception e) { log("ERROR", " Optional - Exception VR-LAN INTERFACE 'v6-public-lan-prefixes' ") } rebuildingVrLanInterface += "" } log("DEBUG", " rebuildingVrLanInterface - " + rebuildingVrLanInterface) return rebuildingVrLanInterface } // Build dhcp def buildDhcp(xmlInput) { def rebuildingDhcp = '' if (xmlInput != null) { def dhcpData = new XmlSlurper().parseText(xmlInput) rebuildingDhcp = "" def dhcpList1 = ["v4-dhcp-server-enabled", "v6-dhcp-server-enabled", "use-v4-default-pool", "v4-dhcp-default-pool-prefix", "v4-dhcp-default-pool-prefix-length"] rebuildingDhcp += buildElements(xmlInput, dhcpList1, "") try { // optional def excludedV4DhcpAddressesFromDefaultPoolList = ["excluded-v4-address"] rebuildingDhcp += buildElementsUnbounded(xmlInput, excludedV4DhcpAddressesFromDefaultPoolList, "excluded-v4-dhcp-addresses-from-default-pool") } catch (Exception e) { log("ERROR", " Optional - Exception DHCP 'excluded-v4-dhcp-addresses-from-default-pool' ") } try { // optional def v4DhcpPools = dhcpData.'**'.findAll {it.name() == "v4-dhcp-pools"} def v4DhcpPoolsSize = v4DhcpPools.size() // println " v4DhcpPoolsSize = " + v4DhcpPools.size() for (i in 0..v4DhcpPoolsSize-1) { def v4DhcpPool = v4DhcpPools[i] def v4DhcpPoolXml = XmlUtil.serialize(v4DhcpPool) rebuildingDhcp += "" def v4DhcpPoolsList1 = ["v4-dhcp-pool-prefix", "v4-dhcp-pool-prefix-length" ] rebuildingDhcp += buildElements(v4DhcpPoolXml, v4DhcpPoolsList1, "") try { // optional def excludedV4AddressesList = ["excluded-v4-address"] rebuildingDhcp += buildElementsUnbounded(v4DhcpPoolXml, excludedV4AddressesList, "excluded-v4-addresses") } catch (Exception e) { log("ERROR", " Optional - Exception DHCP 'excluded-v4-addresses' ") } def v4DhcpPoolsList2 = ["v4-dhcp-relay-gateway-address", "v4-dhcp-relay-next-hop-address"] rebuildingDhcp += buildElements(v4DhcpPoolXml, v4DhcpPoolsList2, "") rebuildingDhcp += "" } } catch (Exception e) { log("ERROR"," Optional - Exception DHCP 'v4-dhcp-pools' ") } def dhcpList2 = ["use-v6-default-pool", "v6-dhcp-default-pool-prefix", "v6-dhcp-default-pool-prefix-length"] rebuildingDhcp += buildElements(xmlInput, dhcpList2, "") try { // optional def excludedV6DhcpAddressesFromDdefaultPoolList = ["excluded-v6-address"] rebuildingDhcp += buildElementsUnbounded(xmlInput, excludedV6DhcpAddressesFromDdefaultPoolList, "excluded-v6-dhcp-addresses-from-default-pool") } catch (Exception e) { log("ERROR", " Optional - Exception DHCP 'excluded-v6-dhcp-addresses-from-default-pool' ") } try { // optional def v6DhcpPools = dhcpData.'**'.findAll {it.name() == "v6-dhcp-pools"} def v6DhcpPoolsSize = v6DhcpPools.size() //println " v6DhcpPoolsSize = " + v6DhcpPools.size() for (i in 0..v6DhcpPoolsSize-1) { def v6DhcpPool = v6DhcpPools[i] def v6DhcpPoolXml = XmlUtil.serialize(v6DhcpPool) rebuildingDhcp += "" def v6DhcpPoolsList1 = ["v6-dhcp-pool-prefix", "v6-dhcp-pool-prefix-length"] rebuildingDhcp += buildElements(v6DhcpPoolXml, v6DhcpPoolsList1, "") try { // optional def excludedV6AddressesList = ["excluded-v6-address"] rebuildingDhcp += buildElementsUnbounded(v6DhcpPoolXml, excludedV6AddressesList, "excluded-v6-addresses") } catch (Exception e) { log("ERROR", " Optional - Exception DHCP 'excluded-v6-addresses' ") } def v6DhcpPoolsList2 = ["v6-dhcp-relay-gateway-address", "v6-dhcp-relay-next-hop-address"] rebuildingDhcp += buildElements(v6DhcpPoolXml, v6DhcpPoolsList2, "") rebuildingDhcp += "" } } catch (Exception e) { log("ERROR", " Optional - Exception DHCP 'v6-dhcp-pools' ") } rebuildingDhcp += "" } log("DEBUG", " rebuildingDhcp - " + rebuildingDhcp) return rebuildingDhcp } // Build pat def buildPat(xmlInput) { def rebuildingPat = '' if (xmlInput != null) { rebuildingPat = "" def patList = ["v4-pat-enabled", "use-v4-default-pool", "v4-pat-default-pool-prefix", "v4-pat-default-pool-prefix-length"] rebuildingPat += buildElements(xmlInput, patList, "") try { // optional def v4PatPools = getNodeXml(xmlInput, "v4-pat-pools").drop(38).trim() def v4PatPoolsList = ["v4-pat-pool-prefix", "v4-pat-pool-prefix-length", "v4-pat-pool-next-hop-address"] rebuildingPat += buildElementsUnbounded(xmlInput, v4PatPoolsList, "v4-pat-pools") } catch (Exception e) { log("ERROR", " Optional - Exception 'v4-pat-pool-next-hop-address' ") } rebuildingPat += "" } log("DEBUG", " rebuildingPat - " + rebuildingPat) return rebuildingPat } // Build nat def buildNat(xmlInput) { def rebuildingNat = '' if (xmlInput != null) { rebuildingNat = "" rebuildingNat += buildElements(xmlInput, ["v4-nat-enabled"], "") try { // optional def v4NatMappingEntries = getNodeXml(xmlInput, "v4-nat-mapping-entries").drop(38).trim() def v4NatMappingEntriesList = ["v4-nat-internal", "v4-nat-next-hop-address", "v4-nat-external"] rebuildingNat += buildElementsUnbounded(xmlInput, v4NatMappingEntriesList, "v4-nat-mapping-entries") } catch (Exception e) { log("ERROR", " Optional - Exception 'v4-nat-external' ") } rebuildingNat += "" } log("DEBUG", " rebuildingNat - " + rebuildingNat) return rebuildingNat } // Build firewall-lite def buildFirewallLite(xmlInput) { def rebuildingFirewallLite = '' if (xmlInput != null) { def firewallLiteData = new XmlSlurper().parseText(xmlInput) rebuildingFirewallLite = "" def firewallLiteList = ["stateful-firewall-lite-v4-enabled", "stateful-firewall-lite-v6-enabled"] rebuildingFirewallLite += buildElements(xmlInput, firewallLiteList, "") try { // optional def v4FirewallPacketFilters = firewallLiteData.'**'.findAll {it.name() == "v4-firewall-packet-filters"} def v4FirewallPacketFiltersSize = v4FirewallPacketFilters.size() //println " v4FirewallPacketFiltersSize = " + v4FirewallPacketFilters.size() for (i in 0..v4FirewallPacketFiltersSize-1) { def v4FirewallPacketFilter = v4FirewallPacketFilters[i] def v4FirewallPacketFilterXml = XmlUtil.serialize(v4FirewallPacketFilter) rebuildingFirewallLite += "" def v4FirewallPacketFiltersList = ["v4-firewall-prefix", "v4-firewall-prefix-length", "allow-icmp-ping"] rebuildingFirewallLite += buildElements(v4FirewallPacketFilterXml, v4FirewallPacketFiltersList, "") try { // optional def udpPortsList = ["port-number"] rebuildingFirewallLite += buildElementsUnbounded(v4FirewallPacketFilterXml, udpPortsList, "udp-ports") } catch (Exception e) { log("ERROR", " Optional - Exception FIREWALL-LITE v4 'udp-ports' ") } try { // optional def tcpPortsList = ["port-number"] rebuildingFirewallLite += buildElementsUnbounded(v4FirewallPacketFilterXml, tcpPortsList, "tcp-ports") } catch (Exception e) { log("ERROR", " Optional - Exception FIREWALL-LITE v4 'tcp-ports' ") } rebuildingFirewallLite += "" } } catch (Exception e) { log("ERROR", " Optional - Exception FIREWALL-LITE 'v4-firewall-packet-filters' ") } try { // optional def v6FirewallPacketFilters = firewallLiteData.'**'.findAll {it.name() == "v6-firewall-packet-filters"} def v6FirewallPacketFiltersSize = v6FirewallPacketFilters.size() //println " v6FirewallPacketFiltersSize = " + v6FirewallPacketFilters.size() for (i in 0..v6FirewallPacketFiltersSize-1) { def v6FirewallPacketFilter = v6FirewallPacketFilters[i] def v6FirewallPacketFilterXml = XmlUtil.serialize(v6FirewallPacketFilter) rebuildingFirewallLite += "" def v6FirewallPacketFiltersList = ["v6-firewall-prefix", "v6-firewall-prefix-length", "allow-icmp-ping"] rebuildingFirewallLite += buildElements(v6FirewallPacketFilterXml, v6FirewallPacketFiltersList, "") try { // optional def udpPortsList = ["port-number"] rebuildingFirewallLite += buildElementsUnbounded(v6FirewallPacketFilterXml, udpPortsList, "udp-ports") } catch (Exception e) { log("ERROR", " Optional - Exception FIREWALL-LITE v6 'udp-ports' ") } try { // optional def tcpPortsList = ["port-number"] rebuildingFirewallLite += buildElementsUnbounded(v6FirewallPacketFilterXml, tcpPortsList, "tcp-ports") } catch (Exception e) { log("ERROR", " Optional - Exception FIREWALL-LITE v6 'tcp-ports' ") } rebuildingFirewallLite += "" } } catch (Exception e) { log("ERROR", " Optional - Exception FIREWALL-LITE 'v6-firewall-packet-filters' ") } rebuildingFirewallLite+= "" } log("DEBUG", " rebuildingFirewallLite - " + rebuildingFirewallLite) return rebuildingFirewallLite } def buildStaticRoutes(xmlInput) { def rebuildingStaticRoutes = '' if (xmlInput != null) { rebuildingStaticRoutes = "" def v4StaticRouteslist = ["v4-static-route-prefix","v4-static-route-prefix-length", "v4-next-hop-address"] rebuildingStaticRoutes += buildElementsUnbounded(xmlInput, v4StaticRouteslist, "v4-static-routes") def v6StaticRouteslist = ["v6-static-route-prefix","v6-static-route-prefix-length", "v6-next-hop-address"] rebuildingStaticRoutes += buildElementsUnbounded(xmlInput, v6StaticRouteslist, "v6-static-routes") rebuildingStaticRoutes += "" } log("DEBUG", " rebuildingStaticRoutes - " + rebuildingStaticRoutes) return rebuildingStaticRoutes } public String generateCurrentTimeInUtc(){ final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); sdf.setTimeZone(TimeZone.getTimeZone("UTC")); final String utcTime = sdf.format(new Date()); return utcTime; } public String generateCurrentTimeInGMT(){ final SimpleDateFormat sdf = new SimpleDateFormat("E, d MMM yyyy h:m:s z"); sdf.setTimeZone(TimeZone.getTimeZone("GMT")); final String utcTime = sdf.format(new Date()); return utcTime; } /** * @param encryptedAuth: encrypted credentials from urn properties * @param msoKey: key to use to decrypt from urn properties * @return base 64 encoded basic auth credentials */ def getBasicAuth(encryptedAuth, msoKey){ if ((encryptedAuth == null || encryptedAuth.isEmpty()) || (msoKey == null || msoKey.isEmpty())) return null try { def auth = decrypt(encryptedAuth, msoKey) byte[] encoded = Base64.encodeBase64(auth.getBytes()) String encodedString = new String(encoded) encodedString = "Basic " + encodedString return encodedString } catch (Exception ex) { log("ERROR", "Unable to encode basic auth") throw ex } } def encrypt(toEncrypt, msokey){ try { String result = CryptoUtils.encrypt(toEncrypt, msokey); return result } catch (Exception e) { log("ERROR", "Failed to encrypt credentials") } } def decrypt(toDecrypt, msokey){ try { String result = CryptoUtils.decrypt(toDecrypt, msokey); return result } catch (Exception e) { log("ERROR", "Failed to decrypt credentials") throw e } } /** * Return URL with qualified host name (if any) or urn mapping * @param String url from urn mapping * @return String url with qualified host name */ public String getQualifiedHostNameForCallback(String urnCallbackUrl) { def callbackUrlToUse = urnCallbackUrl try{ //swap host name with qualified host name from the jboss properties def qualifiedHostName = System.getProperty("jboss.qualified.host.name") if(qualifiedHostName!=null){ log("DEBUG", "qualifiedHostName:\n" + qualifiedHostName) callbackUrlToUse = callbackUrlToUse.replaceAll("(http://)(.*)(:28080*)", {orig, first, torepl, last -> "${first}${qualifiedHostName}${last}"}) } }catch(Exception e){ log("DEBUG", "unable to grab qualified host name, using what's in urn properties for callbackurl. Exception was: " + e.printStackTrace()) } return callbackUrlToUse } /** * Retrieves text context of the element if the element exists, returns empty string otherwise * @param com.sun.org.apache.xerces.internal.dom.DeferredElementNSImpl element to parse * param String tagName tagName * @return String text content of the element */ public String getElementText(Element element, String tagName) { String text = "" org.w3c.dom.NodeList nodeList = element.getElementsByTagNameNS("*", tagName) if (nodeList != null && nodeList.length > 0) { text = nodeList.item(0).getTextContent() } return text } /** * * Find the lowest unused module-index value in a given xml */ public String getLowestUnusedIndex(String xml) { if (xml == null || xml.isEmpty()) { return "0" } def moduleIndexList = getMultNodes(xml, "module-index") if (moduleIndexList == null || moduleIndexList.size() == 0) { return "0" } def sortedModuleIndexList = moduleIndexList.sort { a, b -> a.compareTo b } for (i in 0..sortedModuleIndexList.size()-1) { if (Integer.parseInt(sortedModuleIndexList[i]) != i) { return i.toString() } } return sortedModuleIndexList.size().toString() } /** * This utility checks if there is transaction id already present in MDC. * If found, it returns same else creates new, sets in MDC for future use before returning * @return String RequestId in UUID format. */ public String getRequestID() { String requestId = MDC.get("RequestId") if(requestId == null || requestId.isEmpty()) { requestId = java.util.UUID.randomUUID() MDC.put("RequestId",requestId) log("DEBUG","MsoUtils - Created new RequestId: " + requestId) } else { log("DEBUG","MsoUtils - Using existing RequestId: " + requestId) } return requestId } /** * Remove all the empty nodes and attributes from the within the given node * @param node * @return true if all empty nodes and attributes were removed. */ public boolean cleanNode( Node node ) { node.attributes().with { a -> a.findAll { !it.value }.each { a.remove( it.key ) } } node.children().with { kids -> kids.findAll { it instanceof Node ? !cleanNode( it ) : false } .each { kids.remove( it ) } } node.attributes() || node.children() || node.text() } /** * * @param xml * @return String representation of xml after removing the empty nodes and attributes */ public String cleanNode(String xmlString) { def xml = new XmlParser(false, false).parseText(xmlString) cleanNode(xml) return XmlUtil.serialize(xml) } }