X-Git-Url: https://gerrit.onap.org/r/gitweb?p=dmaap%2Fdatarouter.git;a=blobdiff_plain;f=datarouter-node%2Fsrc%2Fmain%2Fjava%2Forg%2Fonap%2Fdmaap%2Fdatarouter%2Fnode%2FNodeConfigManager.java;h=884f7bf9b5097f04263eb1f2412946fc23ce3c5a;hp=7ecbaafdc302ea056f8187f4a4544d4acc8b89ec;hb=5e6a9f65049e8e8d39e8dcab227e5d75b328b173;hpb=46ef61c0fe477483be17dbf9af2ef3b1023da0d8 diff --git a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/NodeConfigManager.java b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/NodeConfigManager.java index 7ecbaafd..884f7bf9 100644 --- a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/NodeConfigManager.java +++ b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/NodeConfigManager.java @@ -24,22 +24,24 @@ package org.onap.dmaap.datarouter.node; -import java.net.*; -import java.util.*; -import java.io.*; - -import org.apache.log4j.Logger; -import org.onap.dmaap.datarouter.node.eelf.EelfMsgs; - import com.att.eelf.configuration.EELFLogger; import com.att.eelf.configuration.EELFManager; +import org.onap.dmaap.datarouter.node.eelf.EelfMsgs; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.net.URL; +import java.util.Properties; +import java.util.Timer; /** * Maintain the configuration of a Data Router node *

* The NodeConfigManager is the single point of contact for servlet, delivery, event logging, and log retention - * subsystems to access configuration information. (Log4J has its own configuration mechanism). + * subsystems to access configuration information. *

* There are two basic sets of configuration data. The static local configuration data, stored in a local configuration * file (created as part of installation by SWM), and the dynamic global configuration data fetched from the data router @@ -47,14 +49,14 @@ import com.att.eelf.configuration.EELFManager; */ public class NodeConfigManager implements DeliveryQueueHelper { - private static EELFLogger eelflogger = EELFManager.getInstance() - .getLogger("org.onap.dmaap.datarouter.node.NodeConfigManager"); - private static Logger logger = Logger.getLogger("org.onap.dmaap.datarouter.node.NodeConfigManager"); + private static EELFLogger eelfLogger = EELFManager.getInstance() + .getLogger(NodeConfigManager.class); private static NodeConfigManager base = new NodeConfigManager(); private Timer timer = new Timer("Node Configuration Timer", true); private long maxfailuretimer; private long initfailuretimer; + private long waitForFileProcessFailureTimer; private long expirationtimer; private double failurebackoff; private long fairtimelimit; @@ -92,48 +94,68 @@ public class NodeConfigManager implements DeliveryQueueHelper { private String eventlogsuffix; private String eventloginterval; private boolean followredirects; + private String [] enabledprotocols; + private String aafType; + private String aafInstance; + private String aafAction; + private String aafURL; + private boolean cadiEnabled; /** * Get the default node configuration manager */ public static NodeConfigManager getInstance() { - return (base); + return base; } /** * Initialize the configuration of a Data Router node */ private NodeConfigManager() { - Properties p = new Properties(); + + Properties drNodeProperties = new Properties(); try { - p.load(new FileInputStream(System - .getProperty("org.onap.dmaap.datarouter.node.properties", "/opt/app/datartr/etc/node.properties"))); + eelfLogger.info("NODE0301 Loading local config file node.properties"); + drNodeProperties.load(new FileInputStream(System + .getProperty("org.onap.dmaap.datarouter.node.properties", "/opt/app/datartr/etc/node.properties"))); } catch (Exception e) { - NodeUtils.setIpAndFqdnForEelf("NodeConfigManager"); - eelflogger.error(EelfMsgs.MESSAGE_PROPERTIES_LOAD_ERROR); - logger.error("NODE0301 Unable to load local configuration file " + System - .getProperty("org.onap.dmaap.datarouter.node.properties", "/opt/app/datartr/etc/node.properties"), e); + eelfLogger.error(EelfMsgs.MESSAGE_PROPERTIES_LOAD_ERROR, e, System.getProperty("org.onap.dmaap.datarouter.node.properties", "/opt/app/datartr/etc/node.properties")); } - provurl = p.getProperty("ProvisioningURL", "https://feeds-drtr.web.att.com/internal/prov"); + provurl = drNodeProperties.getProperty("ProvisioningURL", "https://dmaap-dr-prov:8443/internal/prov"); + /* + * START - AAF changes: TDP EPIC US# 307413 + * Pull AAF settings from node.properties + */ + aafType = drNodeProperties.getProperty("AAFType", "org.onap.dmaap-dr.feed"); + aafInstance = drNodeProperties.getProperty("AAFInstance", "legacy"); + aafAction = drNodeProperties.getProperty("AAFAction", "publish"); + aafURL = drNodeProperties.getProperty("AafUrl", "https://aaf-onap-test.osaaf.org:8095"); + cadiEnabled = Boolean.parseBoolean(drNodeProperties.getProperty("CadiEnabled", "false")); + /* + * END - AAF changes: TDP EPIC US# 307413 + * Pull AAF settings from node.properties + */ + //Disable and enable protocols*/ + enabledprotocols = ((drNodeProperties.getProperty("NodeHttpsProtocols")).trim()).split("\\|"); + try { provhost = (new URL(provurl)).getHost(); } catch (Exception e) { NodeUtils.setIpAndFqdnForEelf("NodeConfigManager"); - eelflogger.error(EelfMsgs.MESSAGE_BAD_PROV_URL, provurl); - logger.error("NODE0302 Bad provisioning server URL " + provurl); + eelfLogger.error(EelfMsgs.MESSAGE_BAD_PROV_URL, e, provurl); System.exit(1); } - logger.info("NODE0303 Provisioning server is " + provhost); - eventlogurl = p.getProperty("LogUploadURL", "https://feeds-drtr.web.att.com/internal/logs"); + eelfLogger.info("NODE0303 Provisioning server is " + provhost); + eventlogurl = drNodeProperties.getProperty("LogUploadURL", "https://feeds-drtr.web.att.com/internal/logs"); provcheck = new IsFrom(provhost); - gfport = Integer.parseInt(p.getProperty("IntHttpPort", "8080")); - svcport = Integer.parseInt(p.getProperty("IntHttpsPort", "8443")); - port = Integer.parseInt(p.getProperty("ExtHttpsPort", "443")); - long minpfinterval = Long.parseLong(p.getProperty("MinProvFetchInterval", "10000")); - long minrsinterval = Long.parseLong(p.getProperty("MinRedirSaveInterval", "10000")); - spooldir = p.getProperty("SpoolDir", "spool"); + gfport = Integer.parseInt(drNodeProperties.getProperty("IntHttpPort", "8080")); + svcport = Integer.parseInt(drNodeProperties.getProperty("IntHttpsPort", "8443")); + port = Integer.parseInt(drNodeProperties.getProperty("ExtHttpsPort", "443")); + long minpfinterval = Long.parseLong(drNodeProperties.getProperty("MinProvFetchInterval", "10000")); + long minrsinterval = Long.parseLong(drNodeProperties.getProperty("MinRedirSaveInterval", "10000")); + spooldir = drNodeProperties.getProperty("SpoolDir", "spool"); File fdir = new File(spooldir + "/f"); fdir.mkdirs(); for (File junk : fdir.listFiles()) { @@ -141,34 +163,34 @@ public class NodeConfigManager implements DeliveryQueueHelper { junk.delete(); } } - logdir = p.getProperty("LogDir", "logs"); + logdir = drNodeProperties.getProperty("LogDir", "logs"); (new File(logdir)).mkdirs(); - logretention = Long.parseLong(p.getProperty("LogRetention", "30")) * 86400000L; + logretention = Long.parseLong(drNodeProperties.getProperty("LogRetention", "30")) * 86400000L; eventlogprefix = logdir + "/events"; eventlogsuffix = ".log"; - String redirfile = p.getProperty("RedirectionFile", "etc/redirections.dat"); - kstype = p.getProperty("KeyStoreType", "jks"); - ksfile = p.getProperty("KeyStoreFile", "etc/keystore"); - kspass = p.getProperty("KeyStorePassword", "changeme"); - kpass = p.getProperty("KeyPassword", "changeme"); - tstype = p.getProperty("TrustStoreType", "jks"); - tsfile = p.getProperty("TrustStoreFile"); - tspass = p.getProperty("TrustStorePassword", "changeme"); + String redirfile = drNodeProperties.getProperty("RedirectionFile", "etc/redirections.dat"); + kstype = drNodeProperties.getProperty("KeyStoreType", "jks"); + ksfile = drNodeProperties.getProperty("KeyStoreFile", "etc/keystore"); + kspass = drNodeProperties.getProperty("KeyStorePassword", "changeme"); + kpass = drNodeProperties.getProperty("KeyPassword", "changeme"); + tstype = drNodeProperties.getProperty("TrustStoreType", "jks"); + tsfile = drNodeProperties.getProperty("TrustStoreFile"); + tspass = drNodeProperties.getProperty("TrustStorePassword", "changeme"); if (tsfile != null && tsfile.length() > 0) { System.setProperty("javax.net.ssl.trustStoreType", tstype); System.setProperty("javax.net.ssl.trustStore", tsfile); System.setProperty("javax.net.ssl.trustStorePassword", tspass); } - nak = p.getProperty("NodeAuthKey", "Node123!"); - quiesce = new File(p.getProperty("QuiesceFile", "etc/SHUTDOWN")); + nak = drNodeProperties.getProperty("NodeAuthKey", "Node123!"); + quiesce = new File(drNodeProperties.getProperty("QuiesceFile", "etc/SHUTDOWN")); myname = NodeUtils.getCanonicalName(kstype, ksfile, kspass); if (myname == null) { NodeUtils.setIpAndFqdnForEelf("NodeConfigManager"); - eelflogger.error(EelfMsgs.MESSAGE_KEYSTORE_FETCH_ERROR, ksfile); - logger.error("NODE0309 Unable to fetch canonical name from keystore file " + ksfile); + eelfLogger.error(EelfMsgs.MESSAGE_KEYSTORE_FETCH_ERROR, ksfile); + eelfLogger.error("NODE0309 Unable to fetch canonical name from keystore file " + ksfile); System.exit(1); } - logger.info("NODE0304 My certificate says my name is " + myname); + eelfLogger.info("NODE0304 My certificate says my name is " + myname); pid = new PublishId(myname); rdmgr = new RedirManager(redirfile, minrsinterval, timer); pfetcher = new RateLimitedOperation(minpfinterval, timer) { @@ -176,14 +198,15 @@ public class NodeConfigManager implements DeliveryQueueHelper { fetchconfig(); } }; - logger.info("NODE0305 Attempting to fetch configuration at " + provurl); + eelfLogger.info("NODE0305 Attempting to fetch configuration at " + provurl); pfetcher.request(); } private void localconfig() { followredirects = Boolean.parseBoolean(getProvParam("FOLLOW_REDIRECTS", "false")); - eventloginterval = getProvParam("LOGROLL_INTERVAL", "5m"); + eventloginterval = getProvParam("LOGROLL_INTERVAL", "30s"); initfailuretimer = 10000; + waitForFileProcessFailureTimer = 600000; maxfailuretimer = 3600000; expirationtimer = 86400000; failurebackoff = 2.0; @@ -195,38 +218,52 @@ public class NodeConfigManager implements DeliveryQueueHelper { try { initfailuretimer = (long) (Double.parseDouble(getProvParam("DELIVERY_INIT_RETRY_INTERVAL")) * 1000); } catch (Exception e) { + eelfLogger.error("Error parsing DELIVERY_INIT_RETRY_INTERVAL", e); + } + try { + waitForFileProcessFailureTimer = (long) (Double.parseDouble(getProvParam("DELIVERY_FILE_PROCESS_INTERVAL")) * 1000); + } catch (Exception e) { + eelfLogger.error("Error parsing DELIVERY_FILE_PROCESS_INTERVAL", e); } try { maxfailuretimer = (long) (Double.parseDouble(getProvParam("DELIVERY_MAX_RETRY_INTERVAL")) * 1000); } catch (Exception e) { + eelfLogger.error("Error parsing DELIVERY_MAX_RETRY_INTERVAL", e); } try { expirationtimer = (long) (Double.parseDouble(getProvParam("DELIVERY_MAX_AGE")) * 1000); } catch (Exception e) { + eelfLogger.error("Error parsing DELIVERY_MAX_AGE", e); } try { failurebackoff = Double.parseDouble(getProvParam("DELIVERY_RETRY_RATIO")); } catch (Exception e) { + eelfLogger.error("Error parsing DELIVERY_RETRY_RATIO", e); } try { deliverythreads = Integer.parseInt(getProvParam("DELIVERY_THREADS")); } catch (Exception e) { + eelfLogger.error("Error parsing DELIVERY_THREADS", e); } try { fairfilelimit = Integer.parseInt(getProvParam("FAIR_FILE_LIMIT")); } catch (Exception e) { + eelfLogger.error("Error parsing FAIR_FILE_LIMIT", e); } try { fairtimelimit = (long) (Double.parseDouble(getProvParam("FAIR_TIME_LIMIT")) * 1000); } catch (Exception e) { + eelfLogger.error("Error parsing FAIR_TIME_LIMIT", e); } try { fdpstart = Double.parseDouble(getProvParam("FREE_DISK_RED_PERCENT")) / 100.0; } catch (Exception e) { + eelfLogger.error("Error parsing FREE_DISK_RED_PERCENT", e); } try { fdpstop = Double.parseDouble(getProvParam("FREE_DISK_YELLOW_PERCENT")) / 100.0; } catch (Exception e) { + eelfLogger.error("Error parsing FREE_DISK_YELLOW_PERCENT", e); } if (fdpstart < 0.01) { fdpstart = 0.01; @@ -244,7 +281,7 @@ public class NodeConfigManager implements DeliveryQueueHelper { private void fetchconfig() { try { - System.out.println("provurl:: " + provurl); + eelfLogger.info("NodeConfigMan.fetchConfig: provurl:: " + provurl); Reader r = new InputStreamReader((new URL(provurl)).openStream()); config = new NodeConfig(new ProvData(r), myname, spooldir, port, nak); localconfig(); @@ -254,12 +291,13 @@ public class NodeConfigManager implements DeliveryQueueHelper { try { rr.run(); } catch (Exception e) { + eelfLogger.error("NODE0518 Exception fetchconfig: " + e); } } } catch (Exception e) { NodeUtils.setIpAndFqdnForEelf("fetchconfigs"); - eelflogger.error(EelfMsgs.MESSAGE_CONF_FAILED, e.toString()); - logger.error("NODE0306 Configuration failed " + e.toString() + " - try again later", e); + eelfLogger.error(EelfMsgs.MESSAGE_CONF_FAILED, e.toString()); + eelfLogger.error("NODE0306 Configuration failed " + e.toString() + " - try again later", e); pfetcher.request(); } } @@ -269,12 +307,12 @@ public class NodeConfigManager implements DeliveryQueueHelper { * fetch the provisioning data, ignore the request. If the data has been fetched very recently (default 10 * seconds), wait a while before fetching again. */ - public synchronized void gofetch(String remoteaddr) { - if (provcheck.isFrom(remoteaddr)) { - logger.info("NODE0307 Received configuration fetch request from provisioning server " + remoteaddr); + public synchronized void gofetch(String remoteAddr) { + if (provcheck.isReachable(remoteAddr)) { + eelfLogger.info("NODE0307 Received configuration fetch request from provisioning server " + remoteAddr); pfetcher.request(); } else { - logger.info("NODE0308 Received configuration fetch request from unexpected server " + remoteaddr); + eelfLogger.info("NODE0308 Received configuration fetch request from unexpected server " + remoteAddr); } } @@ -325,6 +363,27 @@ public class NodeConfigManager implements DeliveryQueueHelper { return (config.isPublishPermitted(feedid, credentials, ip)); } + /** + * Check whether delete file is allowed. + * + * @param subId The ID of the subscription being requested + * @return True if the delete file is permitted for the subscriber. + */ + public boolean isDeletePermitted(String subId) { + return (config.isDeletePermitted(subId)); + } + + /** + * Check whether publication is allowed for AAF Feed. + * + * @param feedid The ID of the feed being requested + * @param ip The requesting IP address + * @return True if the IP and credentials are valid for the specified feed. + */ + public String isPublishPermitted(String feedid, String ip) { + return(config.isPublishPermitted(feedid, ip)); + } + /** * Check who the user is given the feed ID and the offered credentials. * @@ -336,6 +395,15 @@ public class NodeConfigManager implements DeliveryQueueHelper { return (config.getAuthUser(feedid, credentials)); } + /** + * AAF changes: TDP EPIC US# 307413 + * Check AAF_instance for feed ID in NodeConfig + * @param feedid The ID of the feed specified + */ + public String getAafInstance(String feedid) { + return(config.getAafInstance(feedid)); + } + /** * Check if the publish request should be sent to another node based on the feedid, user, and source IP address. * @@ -362,13 +430,13 @@ public class NodeConfigManager implements DeliveryQueueHelper { * Get a provisioned configuration parameter (from the provisioning server configuration) * * @param name The name of the parameter - * @param deflt The value to use if the parameter is not defined + * @param defaultValue The value to use if the parameter is not defined * @return The value of the parameter or deflt if it is not defined. */ - public String getProvParam(String name, String deflt) { + public String getProvParam(String name, String defaultValue) { name = config.getProvParam(name); if (name == null) { - name = deflt; + name = defaultValue; } return (name); } @@ -404,13 +472,13 @@ public class NodeConfigManager implements DeliveryQueueHelper { /** * Get the URL to deliver a message to. * - * @param destinfo The destination information + * @param destinationInfo The destination information * @param fileid The file ID * @return The URL to deliver to */ - public String getDestURL(DestInfo destinfo, String fileid) { - String subid = destinfo.getSubId(); - String purl = destinfo.getURL(); + public String getDestURL(DestInfo destinationInfo, String fileid) { + String subid = destinationInfo.getSubId(); + String purl = destinationInfo.getURL(); if (followredirects && subid != null) { purl = rdmgr.lookup(subid, purl); } @@ -427,10 +495,10 @@ public class NodeConfigManager implements DeliveryQueueHelper { /** * Set up redirection on receipt of a 3XX from a target URL */ - public boolean handleRedirection(DestInfo destinfo, String redirto, String fileid) { + public boolean handleRedirection(DestInfo destinationInfo, String redirto, String fileid) { fileid = "/" + fileid; - String subid = destinfo.getSubId(); - String purl = destinfo.getURL(); + String subid = destinationInfo.getSubId(); + String purl = destinationInfo.getURL(); if (followredirects && subid != null && redirto.endsWith(fileid)) { redirto = redirto.substring(0, redirto.length() - fileid.length()); if (!redirto.equals(purl)) { @@ -442,10 +510,27 @@ public class NodeConfigManager implements DeliveryQueueHelper { } /** - * Handle unreachable target URL + * Set up redirection on receipt of a 3XX from a target URL */ - public void handleUnreachable(DestInfo destinfo) { + public boolean handleRedirectionSubLevel(DeliveryTask task, DestInfo destinfo, String redirto, String fileid) { + fileid = "/" + fileid; String subid = destinfo.getSubId(); + String purl = destinfo.getURL(); + if (task.getFollowRedirects() && subid != null && redirto.endsWith(fileid)) { + redirto = redirto.substring(0, redirto.length() - fileid.length()); + if (!redirto.equals(purl)) { + rdmgr.redirect(subid, purl, redirto); + return true; + } + } + return false; + } + + /** + * Handle unreachable target URL + */ + public void handleUnreachable(DestInfo destinationInfo) { + String subid = destinationInfo.getSubId(); if (followredirects && subid != null) { rdmgr.forget(subid); } @@ -458,6 +543,13 @@ public class NodeConfigManager implements DeliveryQueueHelper { return (initfailuretimer); } + /** + * Get the timeout before retrying after delivery and wait for file processing + */ + public long getWaitForFileProcessFailureTimer() { + return (waitForFileProcessFailureTimer); + } + /** * Get the maximum timeout between delivery attempts */ @@ -503,6 +595,15 @@ public class NodeConfigManager implements DeliveryQueueHelper { return (config.getTargets(feedid)); } + /** + * Get the creation date for a feed + * @param feedid The feed ID + * @return the timestamp of creation date of feed id passed + */ + public String getCreatedDate(String feedid) { + return(config.getCreatedDate(feedid)); + } + /** * Get the spool directory for temporary files */ @@ -671,6 +772,16 @@ public class NodeConfigManager implements DeliveryQueueHelper { return (fdpstop); } + /** + * Disable and enable protocols + * */ + public String[] getEnabledprotocols() { + return enabledprotocols; + } + public void setEnabledprotocols(String[] enabledprotocols) { + this.enabledprotocols = enabledprotocols.clone(); + } + /** * Get the spool directory for a subscription */ @@ -678,16 +789,71 @@ public class NodeConfigManager implements DeliveryQueueHelper { if (provcheck.isFrom(remoteaddr)) { String sdir = config.getSpoolDir(subid); if (sdir != null) { - logger.info("NODE0310 Received subscription reset request for subscription " + subid - + " from provisioning server " + remoteaddr); + eelfLogger.info("NODE0310 Received subscription reset request for subscription " + subid + + " from provisioning server " + remoteaddr); } else { - logger.info("NODE0311 Received subscription reset request for unknown subscription " + subid - + " from provisioning server " + remoteaddr); + eelfLogger.info("NODE0311 Received subscription reset request for unknown subscription " + subid + + " from provisioning server " + remoteaddr); } return (sdir); } else { - logger.info("NODE0312 Received subscription reset request from unexpected server " + remoteaddr); + eelfLogger.info("NODE0312 Received subscription reset request from unexpected server " + remoteaddr); return (null); } } + + public String getAafType() { + return aafType; + } + public void setAafType(String aafType) { + this.aafType = aafType; + } + public String getAafInstance() { + return aafInstance; + } + public void setAafInstance(String aafInstance) { + this.aafInstance = aafInstance; + } + public String getAafAction() { + return aafAction; + } + public void setAafAction(String aafAction) { + this.aafAction = aafAction; + } + /* + * Get aafURL from SWM variable + * */ + public String getAafURL() { + return aafURL; + } + public void setAafURL(String aafURL) { + this.aafURL = aafURL; + } + + public boolean getCadiEnabeld() { + return cadiEnabled; + } + public void setCadiEnabled(boolean cadiEnabled) { + this.cadiEnabled = cadiEnabled; + } + + /** + * Builds the permissions string to be verified + * + * @param aafInstance The aaf instance + * @return The permissions + */ + protected String getPermission(String aafInstance) { + try { + String type = getAafType(); + String action = getAafAction(); + if (aafInstance == null || aafInstance.equals("")) { + aafInstance = getAafInstance(); + } + return type + "|" + aafInstance + "|" + action; + } catch (Exception e) { + eelfLogger.error("NODE0543 NodeConfigManager.getPermission: ", e); + } + return null; + } }