1 /*******************************************************************************
2 * ============LICENSE_START==================================================
4 * * ===========================================================================
5 * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
6 * * ===========================================================================
7 * * Licensed under the Apache License, Version 2.0 (the "License");
8 * * you may not use this file except in compliance with the License.
9 * * You may obtain a copy of the License at
11 * * http://www.apache.org/licenses/LICENSE-2.0
13 * * Unless required by applicable law or agreed to in writing, software
14 * * distributed under the License is distributed on an "AS IS" BASIS,
15 * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * * See the License for the specific language governing permissions and
17 * * limitations under the License.
18 * * ============LICENSE_END====================================================
20 * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
22 ******************************************************************************/
24 package org.onap.dmaap.datarouter.node;
27 import com.att.eelf.configuration.EELFLogger;
28 import com.att.eelf.configuration.EELFManager;
29 import java.io.IOException;
30 import java.io.InputStream;
31 import java.util.EnumSet;
32 import java.util.Properties;
33 import javax.servlet.DispatcherType;
34 import javax.servlet.ServletException;
35 import org.eclipse.jetty.http.HttpVersion;
36 import org.eclipse.jetty.server.Connector;
37 import org.eclipse.jetty.server.HttpConfiguration;
38 import org.eclipse.jetty.server.HttpConnectionFactory;
39 import org.eclipse.jetty.server.SecureRequestCustomizer;
40 import org.eclipse.jetty.server.Server;
41 import org.eclipse.jetty.server.ServerConnector;
42 import org.eclipse.jetty.server.SslConnectionFactory;
43 import org.eclipse.jetty.servlet.FilterHolder;
44 import org.eclipse.jetty.servlet.ServletContextHandler;
45 import org.eclipse.jetty.servlet.ServletHolder;
46 import org.eclipse.jetty.util.ssl.SslContextFactory;
47 import org.onap.aaf.cadi.PropAccess;
50 * The main starting point for the Data Router node
52 public class NodeMain {
54 private static EELFLogger nodeMainLogger = EELFManager.getInstance().getLogger(NodeMain.class);
55 private static Delivery delivery;
56 private static NodeConfigManager nodeConfigManager;
62 * Reset the retry timer for a subscription
64 static void resetQueue(String subid, String ip) {
65 delivery.resetQueue(nodeConfigManager.getSpoolDir(subid, ip));
69 * Start the data router.
71 * The location of the node configuration file can be set using the org.onap.dmaap.datarouter.node.properties system
72 * property. By default, it is "/opt/app/datartr/etc/node.properties".
74 public static void main(String[] args) throws Exception {
75 nodeMainLogger.info("NODE0001 Data Router Node Starting");
77 nodeConfigManager = NodeConfigManager.getInstance();
78 nodeMainLogger.info("NODE0002 I am " + nodeConfigManager.getMyName());
79 (new WaitForConfig(nodeConfigManager)).waitForConfig();
80 delivery = new Delivery(nodeConfigManager);
81 new LogManager(nodeConfigManager);
83 Server server = new Server();
86 HttpConfiguration httpConfiguration = new HttpConfiguration();
87 httpConfiguration.setRequestHeaderSize(2048);
90 try (ServerConnector httpServerConnector = new ServerConnector(server,
91 new HttpConnectionFactory(httpConfiguration))) {
92 httpServerConnector.setPort(nodeConfigManager.getHttpPort());
93 httpServerConnector.setIdleTimeout(2000);
95 // HTTPS configuration
96 SslContextFactory sslContextFactory = new SslContextFactory();
97 sslContextFactory.setKeyStoreType(nodeConfigManager.getKSType());
98 sslContextFactory.setKeyStorePath(nodeConfigManager.getKSFile());
99 sslContextFactory.setKeyStorePassword(nodeConfigManager.getKSPass());
100 sslContextFactory.setKeyManagerPassword(nodeConfigManager.getKPass());
102 //SP-6 : Fixes for SDV scan to exclude/remove DES/3DES ciphers are taken care by upgrading jdk in descriptor.xml
103 sslContextFactory.setExcludeCipherSuites(
104 "SSL_RSA_WITH_DES_CBC_SHA",
105 "SSL_DHE_RSA_WITH_DES_CBC_SHA",
106 "SSL_DHE_DSS_WITH_DES_CBC_SHA",
107 "SSL_RSA_EXPORT_WITH_RC4_40_MD5",
108 "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA",
109 "SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA",
110 "SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA"
113 sslContextFactory.addExcludeProtocols("SSLv3");
114 sslContextFactory.setIncludeProtocols(nodeConfigManager.getEnabledprotocols());
115 nodeMainLogger.info("NODE00004 Unsupported protocols node server:-" +
116 String.join(",", sslContextFactory.getExcludeProtocols()));
117 nodeMainLogger.info("NODE00004 Supported protocols node server:-" +
118 String.join(",", sslContextFactory.getIncludeProtocols()));
119 nodeMainLogger.info("NODE00004 Unsupported ciphers node server:-" +
120 String.join(",", sslContextFactory.getExcludeCipherSuites()));
122 HttpConfiguration httpsConfiguration = new HttpConfiguration(httpConfiguration);
123 httpsConfiguration.setRequestHeaderSize(8192);
125 SecureRequestCustomizer secureRequestCustomizer = new SecureRequestCustomizer();
126 secureRequestCustomizer.setStsMaxAge(2000);
127 secureRequestCustomizer.setStsIncludeSubDomains(true);
128 httpsConfiguration.addCustomizer(secureRequestCustomizer);
131 try (ServerConnector httpsServerConnector = new ServerConnector(server,
132 new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()),
133 new HttpConnectionFactory(httpsConfiguration))) {
135 httpsServerConnector.setPort(nodeConfigManager.getHttpsPort());
136 httpsServerConnector.setIdleTimeout(3600000);
137 httpsServerConnector.setAcceptQueueSize(2);
140 ServletContextHandler servletContextHandler = new ServletContextHandler(0);
141 servletContextHandler.setContextPath("/");
142 servletContextHandler.addServlet(new ServletHolder(new NodeServlet(delivery)), "/*");
144 //CADI Filter activation check
145 if (nodeConfigManager.getCadiEnabled()) {
146 enableCadi(servletContextHandler);
149 server.setHandler(servletContextHandler);
150 server.setConnectors(new Connector[]{httpServerConnector, httpsServerConnector});
156 nodeMainLogger.info("NODE00006 Node Server started-" + server.getState());
157 } catch (Exception e) {
158 nodeMainLogger.info("NODE00006 Jetty failed to start. Reporting will we unavailable", e.getMessage());
161 nodeMainLogger.info("NODE00007 Node Server joined - " + server.getState());
164 private static void enableCadi(ServletContextHandler servletContextHandler) throws ServletException {
165 Properties cadiProperties = new Properties();
167 Inner obj = new NodeMain().new Inner();
168 InputStream in = obj.getCadiProps();
169 cadiProperties.load(in);
170 } catch (IOException e1) {
171 nodeMainLogger.error("NODE00005 Exception in NodeMain.Main() loading CADI properties " + e1.getMessage());
173 cadiProperties.setProperty("aaf_locate_url", nodeConfigManager.getAafURL());
174 nodeMainLogger.info("NODE00005 aaf_url set to - " + cadiProperties.getProperty("aaf_url"));
176 PropAccess access = new PropAccess(cadiProperties);
177 servletContextHandler.addFilter(new FilterHolder(new DRNodeCadiFilter(true, access)), "/*", EnumSet
178 .of(DispatcherType.REQUEST));
181 private static class WaitForConfig implements Runnable {
183 private NodeConfigManager localNodeConfigManager;
185 WaitForConfig(NodeConfigManager ncm) {
186 this.localNodeConfigManager = ncm;
189 public synchronized void run() {
193 synchronized void waitForConfig() {
194 localNodeConfigManager.registerConfigTask(this);
195 while (!localNodeConfigManager.isConfigured()) {
196 nodeMainLogger.info("NODE0003 Waiting for Node Configuration");
199 } catch (Exception exception) {
201 .error("NodeMain: waitForConfig exception. Exception Message:- " + exception.toString(),
205 localNodeConfigManager.deregisterConfigTask(this);
206 nodeMainLogger.info("NODE0004 Node Configuration Data Received");
212 InputStream getCadiProps() {
213 InputStream in = null;
215 in = getClass().getClassLoader().getResourceAsStream("drNodeCadi.properties");
216 } catch (Exception e) {
217 nodeMainLogger.error("Exception in Inner.getCadiProps() method ", e);