--- /dev/null
+/*******************************************************************************\r
+ * ============LICENSE_START==================================================\r
+ * * org.onap.dmaap\r
+ * * ===========================================================================\r
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.\r
+ * * ===========================================================================\r
+ * * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * * you may not use this file except in compliance with the License.\r
+ * * You may obtain a copy of the License at\r
+ * * \r
+ * * http://www.apache.org/licenses/LICENSE-2.0\r
+ * * \r
+ * * Unless required by applicable law or agreed to in writing, software\r
+ * * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * * See the License for the specific language governing permissions and\r
+ * * limitations under the License.\r
+ * * ============LICENSE_END====================================================\r
+ * *\r
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.\r
+ * *\r
+ ******************************************************************************/\r
+\r
+\r
+package org.onap.dmaap.datarouter.provisioning;\r
+\r
+import java.security.Security;\r
+import java.util.Properties;\r
+import java.util.Timer;\r
+\r
+import org.apache.log4j.Logger;\r
+import org.eclipse.jetty.server.Connector;\r
+import org.eclipse.jetty.server.Handler;\r
+import org.eclipse.jetty.server.NCSARequestLog;\r
+import org.eclipse.jetty.server.Server;\r
+import org.eclipse.jetty.server.handler.ContextHandlerCollection;\r
+import org.eclipse.jetty.server.handler.DefaultHandler;\r
+import org.eclipse.jetty.server.handler.HandlerCollection;\r
+import org.eclipse.jetty.server.handler.RequestLogHandler;\r
+import org.eclipse.jetty.server.nio.SelectChannelConnector;\r
+import org.eclipse.jetty.server.ssl.SslSelectChannelConnector;\r
+import org.eclipse.jetty.servlet.FilterHolder;\r
+import org.eclipse.jetty.servlet.FilterMapping;\r
+import org.eclipse.jetty.servlet.ServletContextHandler;\r
+import org.eclipse.jetty.servlet.ServletHolder;\r
+import org.eclipse.jetty.util.ssl.SslContextFactory;\r
+import org.eclipse.jetty.util.thread.QueuedThreadPool;\r
+import org.onap.dmaap.datarouter.provisioning.utils.DB;\r
+import org.onap.dmaap.datarouter.provisioning.utils.LogfileLoader;\r
+import org.onap.dmaap.datarouter.provisioning.utils.PurgeLogDirTask;\r
+import org.onap.dmaap.datarouter.provisioning.utils.ThrottleFilter;\r
+\r
+/**\r
+ * <p>\r
+ * A main class which may be used to start the provisioning server with an "embedded" Jetty server.\r
+ * Configuration is done via the properties file <i>provserver.properties</i>, which should be in the CLASSPATH.\r
+ * The provisioning server may also be packaged with a web.xml and started as a traditional webapp.\r
+ * </p>\r
+ * <p>\r
+ * Most of the work of the provisioning server is carried out within the eight servlets (configured below)\r
+ * that are used to handle each of the eight types of requests the server may receive.\r
+ * In addition, there are background threads started to perform other tasks:\r
+ * </p>\r
+ * <ul>\r
+ * <li>One background Thread runs the {@link LogfileLoader} in order to process incoming logfiles.\r
+ * This Thread is created as a side effect of the first successful POST to the /internal/logs/ servlet.</li>\r
+ * <li>One background Thread runs the {@link SynchronizerTask} which is used to periodically\r
+ * synchronize the database between active and standby servers.</li>\r
+ * <li>One background Thread runs the {@link Poker} which is used to notify the nodes whenever\r
+ * provisioning data changes.</li>\r
+ * <li>One task is run once a day to run {@link PurgeLogDirTask} which purges older logs from the\r
+ * /opt/app/datartr/logs directory.</li>\r
+ * </ul>\r
+ * <p>\r
+ * The provisioning server is stopped by issuing a GET to the URL http://127.0.0.1/internal/halt\r
+ * using <i>curl</i> or some other such tool.\r
+ * </p>\r
+ *\r
+ * @author Robert Eby\r
+ * @version $Id: Main.java,v 1.12 2014/03/12 19:45:41 eby Exp $\r
+ */\r
+public class Main {\r
+ /** The truststore to use if none is specified */\r
+ public static final String DEFAULT_TRUSTSTORE = "/opt/java/jdk/jdk180/jre/lib/security/cacerts";\r
+ public static final String KEYSTORE_TYPE_PROPERTY = "com.att.research.datarouter.provserver.keystore.type";\r
+ public static final String KEYSTORE_PATH_PROPERTY = "com.att.research.datarouter.provserver.keystore.path";\r
+ public static final String KEYSTORE_PASSWORD_PROPERTY = "com.att.research.datarouter.provserver.keystore.password";\r
+ public static final String TRUSTSTORE_PATH_PROPERTY = "com.att.research.datarouter.provserver.truststore.path";\r
+ public static final String TRUSTSTORE_PASSWORD_PROPERTY = "com.att.research.datarouter.provserver.truststore.password";\r
+\r
+ /** The one and only {@link Server} instance in this JVM */\r
+ private static Server server;\r
+\r
+ /**\r
+ * Starts the Data Router Provisioning server.\r
+ * @param args not used\r
+ * @throws Exception if Jetty has a problem starting\r
+ */\r
+ public static void main(String[] args) throws Exception {\r
+ Security.setProperty("networkaddress.cache.ttl", "4");\r
+ Logger logger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");\r
+\r
+ // Check DB is accessible and contains the expected tables\r
+ if (! checkDatabase(logger))\r
+ System.exit(1);\r
+\r
+ logger.info("PROV0000 **** AT&T Data Router Provisioning Server starting....");\r
+\r
+ // Get properties\r
+ Properties p = (new DB()).getProperties();\r
+ int http_port = Integer.parseInt(p.getProperty("com.att.research.datarouter.provserver.http.port", "8080"));\r
+ int https_port = Integer.parseInt(p.getProperty("com.att.research.datarouter.provserver.https.port", "8443"));\r
+\r
+ // HTTP connector\r
+ SelectChannelConnector http = new SelectChannelConnector();\r
+ http.setPort(http_port);\r
+ http.setMaxIdleTime(300000);\r
+ http.setRequestHeaderSize(2048);\r
+ http.setAcceptors(2);\r
+ http.setConfidentialPort(https_port);\r
+ http.setLowResourcesConnections(20000);\r
+\r
+ // HTTPS connector\r
+ SslSelectChannelConnector https = new SslSelectChannelConnector();\r
+ https.setPort(https_port);\r
+ https.setMaxIdleTime(30000);\r
+ https.setRequestHeaderSize(8192);\r
+ https.setAcceptors(2);\r
+\r
+ // SSL stuff\r
+ SslContextFactory cf = https.getSslContextFactory();\r
+ \r
+ /**Skip SSLv3 Fixes*/\r
+ cf.addExcludeProtocols("SSLv3");\r
+ logger.info("Excluded protocols prov-"+cf.getExcludeProtocols());\r
+ /**End of SSLv3 Fixes*/\r
+\r
+ cf.setKeyStoreType(p.getProperty(KEYSTORE_TYPE_PROPERTY, "jks"));\r
+ cf.setKeyStorePath(p.getProperty(KEYSTORE_PATH_PROPERTY));\r
+ cf.setKeyStorePassword(p.getProperty(KEYSTORE_PASSWORD_PROPERTY));\r
+ cf.setKeyManagerPassword(p.getProperty("com.att.research.datarouter.provserver.keymanager.password"));\r
+ String ts = p.getProperty(TRUSTSTORE_PATH_PROPERTY);\r
+ if (ts != null && ts.length() > 0) {\r
+ System.out.println("@@ TS -> "+ts);\r
+ cf.setTrustStore(ts);\r
+ cf.setTrustStorePassword(p.getProperty(TRUSTSTORE_PASSWORD_PROPERTY));\r
+ } else {\r
+ cf.setTrustStore(DEFAULT_TRUSTSTORE);\r
+ cf.setTrustStorePassword("changeit");\r
+ }\r
+ cf.setTrustStore("/opt/app/datartr/self_signed/cacerts.jks");\r
+ cf.setTrustStorePassword("changeit");\r
+ cf.setWantClientAuth(true);\r
+\r
+ // Servlet and Filter configuration\r
+ ServletContextHandler ctxt = new ServletContextHandler(0);\r
+ ctxt.setContextPath("/");\r
+ ctxt.addServlet(new ServletHolder(new FeedServlet()), "/feed/*");\r
+ ctxt.addServlet(new ServletHolder(new FeedLogServlet()), "/feedlog/*");\r
+ ctxt.addServlet(new ServletHolder(new PublishServlet()), "/publish/*");\r
+ ctxt.addServlet(new ServletHolder(new SubscribeServlet()), "/subscribe/*");\r
+ ctxt.addServlet(new ServletHolder(new StatisticsServlet()), "/statistics/*");\r
+ ctxt.addServlet(new ServletHolder(new SubLogServlet()), "/sublog/*");\r
+ ctxt.addServlet(new ServletHolder(new GroupServlet()), "/group/*"); //Provision groups - Rally US708115 -1610 \r
+ ctxt.addServlet(new ServletHolder(new SubscriptionServlet()), "/subs/*");\r
+ ctxt.addServlet(new ServletHolder(new InternalServlet()), "/internal/*");\r
+ ctxt.addServlet(new ServletHolder(new RouteServlet()), "/internal/route/*");\r
+ ctxt.addServlet(new ServletHolder(new DRFeedsServlet()), "/");\r
+ ctxt.addFilter (new FilterHolder (new ThrottleFilter()), "/publish/*", FilterMapping.REQUEST);\r
+\r
+ ContextHandlerCollection contexts = new ContextHandlerCollection();\r
+ contexts.addHandler(ctxt);\r
+\r
+ // Request log configuration\r
+ NCSARequestLog nrl = new NCSARequestLog();\r
+ nrl.setFilename(p.getProperty("com.att.research.datarouter.provserver.accesslog.dir") + "/request.log.yyyy_mm_dd");\r
+ nrl.setFilenameDateFormat("yyyyMMdd");\r
+ nrl.setRetainDays(90);\r
+ nrl.setAppend(true);\r
+ nrl.setExtended(false);\r
+ nrl.setLogCookies(false);\r
+ nrl.setLogTimeZone("GMT");\r
+\r
+ RequestLogHandler reqlog = new RequestLogHandler();\r
+ reqlog.setRequestLog(nrl);\r
+\r
+ // Server's Handler collection\r
+ HandlerCollection hc = new HandlerCollection();\r
+ hc.setHandlers(new Handler[] { contexts, new DefaultHandler() });\r
+ hc.addHandler(reqlog);\r
+\r
+ // Server's thread pool\r
+ QueuedThreadPool pool = new QueuedThreadPool();\r
+ pool.setMinThreads(10);\r
+ pool.setMaxThreads(200);\r
+ pool.setDetailedDump(false);\r
+\r
+ // Daemon to clean up the log directory on a daily basis\r
+ Timer rolex = new Timer();\r
+ rolex.scheduleAtFixedRate(new PurgeLogDirTask(), 0, 86400000L); // run once per day\r
+\r
+ // Start LogfileLoader\r
+ LogfileLoader.getLoader();\r
+\r
+ // The server itself\r
+ server = new Server();\r
+ server.setThreadPool(pool);\r
+ server.setConnectors(new Connector[] { http, https });\r
+ server.setHandler(hc);\r
+ server.setStopAtShutdown(true);\r
+ server.setSendServerVersion(true);\r
+ server.setSendDateHeader(true);\r
+ server.setGracefulShutdown(5000); // allow 5 seconds for servlets to wrap up\r
+ server.setDumpAfterStart(false);\r
+ server.setDumpBeforeStop(false);\r
+\r
+ server.start();\r
+ server.join();\r
+ logger.info("PROV0001 **** AT&T Data Router Provisioning Server halted.");\r
+ }\r
+\r
+ private static boolean checkDatabase(Logger logger) {\r
+ DB db = new DB();\r
+ return db.runRetroFits();\r
+ }\r
+\r
+ /**\r
+ * Stop the Jetty server.\r
+ */\r
+ public static void shutdown() {\r
+ new Thread() {\r
+ @Override\r
+ public void run() {\r
+ try {\r
+ server.stop();\r
+ Thread.sleep(5000L);\r
+ System.exit(0);\r
+ } catch (Exception e) {\r
+ // ignore\r
+ }\r
+ }\r
+ }.start();\r
+ }\r
+}\r