Update project structure to org.onap
[dmaap/datarouter.git] / datarouter-prov / src / main / java / org / onap / dmaap / datarouter / provisioning / Main.java
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/Main.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/Main.java
new file mode 100644 (file)
index 0000000..f5c93c7
--- /dev/null
@@ -0,0 +1,244 @@
+/*******************************************************************************\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