datarouter-prov code clean - remove tabs
[dmaap/datarouter.git] / datarouter-prov / src / main / java / org / onap / dmaap / datarouter / provisioning / Main.java
1 /*******************************************************************************\r
2  * ============LICENSE_START==================================================\r
3  * * org.onap.dmaap\r
4  * * ===========================================================================\r
5  * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.\r
6  * * ===========================================================================\r
7  * * Licensed under the Apache License, Version 2.0 (the "License");\r
8  * * you may not use this file except in compliance with the License.\r
9  * * You may obtain a copy of the License at\r
10  * *\r
11  *  *      http://www.apache.org/licenses/LICENSE-2.0\r
12  * *\r
13  *  * Unless required by applicable law or agreed to in writing, software\r
14  * * distributed under the License is distributed on an "AS IS" BASIS,\r
15  * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
16  * * See the License for the specific language governing permissions and\r
17  * * limitations under the License.\r
18  * * ============LICENSE_END====================================================\r
19  * *\r
20  * * ECOMP is a trademark and service mark of AT&T Intellectual Property.\r
21  * *\r
22  ******************************************************************************/\r
23 \r
24 \r
25 package org.onap.dmaap.datarouter.provisioning;\r
26 \r
27 import java.security.Security;\r
28 import java.util.Properties;\r
29 import java.util.Timer;\r
30 \r
31 import org.apache.log4j.Logger;\r
32 import org.eclipse.jetty.server.Connector;\r
33 import org.eclipse.jetty.server.Handler;\r
34 import org.eclipse.jetty.server.NCSARequestLog;\r
35 import org.eclipse.jetty.server.Server;\r
36 import org.eclipse.jetty.server.handler.ContextHandlerCollection;\r
37 import org.eclipse.jetty.server.handler.DefaultHandler;\r
38 import org.eclipse.jetty.server.handler.HandlerCollection;\r
39 import org.eclipse.jetty.server.handler.RequestLogHandler;\r
40 import org.eclipse.jetty.server.nio.SelectChannelConnector;\r
41 import org.eclipse.jetty.server.ssl.SslSelectChannelConnector;\r
42 import org.eclipse.jetty.servlet.FilterHolder;\r
43 import org.eclipse.jetty.servlet.FilterMapping;\r
44 import org.eclipse.jetty.servlet.ServletContextHandler;\r
45 import org.eclipse.jetty.servlet.ServletHolder;\r
46 import org.eclipse.jetty.util.ssl.SslContextFactory;\r
47 import org.eclipse.jetty.util.thread.QueuedThreadPool;\r
48 import org.onap.dmaap.datarouter.provisioning.utils.DB;\r
49 import org.onap.dmaap.datarouter.provisioning.utils.LogfileLoader;\r
50 import org.onap.dmaap.datarouter.provisioning.utils.PurgeLogDirTask;\r
51 import org.onap.dmaap.datarouter.provisioning.utils.ThrottleFilter;\r
52 \r
53 /**\r
54  * <p>\r
55  * A main class which may be used to start the provisioning server with an "embedded" Jetty server.\r
56  * Configuration is done via the properties file <i>provserver.properties</i>, which should be in the CLASSPATH.\r
57  * The provisioning server may also be packaged with a web.xml and started as a traditional webapp.\r
58  * </p>\r
59  * <p>\r
60  * Most of the work of the provisioning server is carried out within the eight servlets (configured below)\r
61  * that are used to handle each of the eight types of requests the server may receive.\r
62  * In addition, there are background threads started to perform other tasks:\r
63  * </p>\r
64  * <ul>\r
65  * <li>One background Thread runs the {@link LogfileLoader} in order to process incoming logfiles.\r
66  * This Thread is created as a side effect of the first successful POST to the /internal/logs/ servlet.</li>\r
67  * <li>One background Thread runs the {@link SynchronizerTask} which is used to periodically\r
68  * synchronize the database between active and standby servers.</li>\r
69  * <li>One background Thread runs the {@link Poker} which is used to notify the nodes whenever\r
70  * provisioning data changes.</li>\r
71  * <li>One task is run once a day to run {@link PurgeLogDirTask} which purges older logs from the\r
72  * /opt/app/datartr/logs directory.</li>\r
73  * </ul>\r
74  * <p>\r
75  * The provisioning server is stopped by issuing a GET to the URL http://127.0.0.1/internal/halt\r
76  * using <i>curl</i> or some other such tool.\r
77  * </p>\r
78  *\r
79  * @author Robert Eby\r
80  * @version $Id: Main.java,v 1.12 2014/03/12 19:45:41 eby Exp $\r
81  */\r
82 public class Main {\r
83     /**\r
84      * The truststore to use if none is specified\r
85      */\r
86     public static final String DEFAULT_TRUSTSTORE = "/opt/java/jdk/jdk180/jre/lib/security/cacerts";\r
87     public static final String KEYSTORE_TYPE_PROPERTY = "org.onap.dmaap.datarouter.provserver.keystore.type";\r
88     public static final String KEYSTORE_PATH_PROPERTY = "org.onap.dmaap.datarouter.provserver.keystore.path";\r
89     public static final String KEYSTORE_PASSWORD_PROPERTY = "org.onap.dmaap.datarouter.provserver.keystore.password";\r
90     public static final String TRUSTSTORE_PATH_PROPERTY = "org.onap.dmaap.datarouter.provserver.truststore.path";\r
91     public static final String TRUSTSTORE_PASSWORD_PROPERTY = "org.onap.dmaap.datarouter.provserver.truststore.password";\r
92 \r
93     /**\r
94      * The one and only {@link Server} instance in this JVM\r
95      */\r
96     private static Server server;\r
97 \r
98     /**\r
99      * Starts the Data Router Provisioning server.\r
100      *\r
101      * @param args not used\r
102      * @throws Exception if Jetty has a problem starting\r
103      */\r
104     public static void main(String[] args) throws Exception {\r
105         Security.setProperty("networkaddress.cache.ttl", "4");\r
106         Logger logger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");\r
107 \r
108         // Check DB is accessible and contains the expected tables\r
109         if (!checkDatabase(logger))\r
110             System.exit(1);\r
111 \r
112         logger.info("PROV0000 **** AT&T Data Router Provisioning Server starting....");\r
113 \r
114         // Get properties\r
115         Properties p = (new DB()).getProperties();\r
116         int http_port = Integer.parseInt(p.getProperty("org.onap.dmaap.datarouter.provserver.http.port", "8080"));\r
117         int https_port = Integer.parseInt(p.getProperty("org.onap.dmaap.datarouter.provserver.https.port", "8443"));\r
118 \r
119         // HTTP connector\r
120         SelectChannelConnector http = new SelectChannelConnector();\r
121         http.setPort(http_port);\r
122         http.setMaxIdleTime(300000);\r
123         http.setRequestHeaderSize(2048);\r
124         http.setAcceptors(2);\r
125         http.setConfidentialPort(https_port);\r
126         http.setLowResourcesConnections(20000);\r
127 \r
128         // HTTPS connector\r
129         SslSelectChannelConnector https = new SslSelectChannelConnector();\r
130         https.setPort(https_port);\r
131         https.setMaxIdleTime(30000);\r
132         https.setRequestHeaderSize(8192);\r
133         https.setAcceptors(2);\r
134 \r
135         // SSL stuff\r
136         SslContextFactory cf = https.getSslContextFactory();\r
137 \r
138         /**Skip SSLv3 Fixes*/\r
139         cf.addExcludeProtocols("SSLv3");\r
140         logger.info("Excluded protocols prov-" + cf.getExcludeProtocols());\r
141         /**End of SSLv3 Fixes*/\r
142 \r
143         cf.setKeyStoreType(p.getProperty(KEYSTORE_TYPE_PROPERTY, "jks"));\r
144         cf.setKeyStorePath(p.getProperty(KEYSTORE_PATH_PROPERTY));\r
145         cf.setKeyStorePassword(p.getProperty(KEYSTORE_PASSWORD_PROPERTY));\r
146         cf.setKeyManagerPassword(p.getProperty("org.onap.dmaap.datarouter.provserver.keymanager.password"));\r
147         String ts = p.getProperty(TRUSTSTORE_PATH_PROPERTY);\r
148         if (ts != null && ts.length() > 0) {\r
149             System.out.println("@@ TS -> " + ts);\r
150             cf.setTrustStore(ts);\r
151             cf.setTrustStorePassword(p.getProperty(TRUSTSTORE_PASSWORD_PROPERTY));\r
152         } else {\r
153             cf.setTrustStore(DEFAULT_TRUSTSTORE);\r
154             cf.setTrustStorePassword("changeit");\r
155         }\r
156         cf.setTrustStore("/opt/app/datartr/self_signed/cacerts.jks");\r
157         cf.setTrustStorePassword("changeit");\r
158         cf.setWantClientAuth(true);\r
159 \r
160         // Servlet and Filter configuration\r
161         ServletContextHandler ctxt = new ServletContextHandler(0);\r
162         ctxt.setContextPath("/");\r
163         ctxt.addServlet(new ServletHolder(new FeedServlet()), "/feed/*");\r
164         ctxt.addServlet(new ServletHolder(new FeedLogServlet()), "/feedlog/*");\r
165         ctxt.addServlet(new ServletHolder(new PublishServlet()), "/publish/*");\r
166         ctxt.addServlet(new ServletHolder(new SubscribeServlet()), "/subscribe/*");\r
167         ctxt.addServlet(new ServletHolder(new StatisticsServlet()), "/statistics/*");\r
168         ctxt.addServlet(new ServletHolder(new SubLogServlet()), "/sublog/*");\r
169         ctxt.addServlet(new ServletHolder(new GroupServlet()), "/group/*"); //Provision groups - Rally US708115 -1610\r
170         ctxt.addServlet(new ServletHolder(new SubscriptionServlet()), "/subs/*");\r
171         ctxt.addServlet(new ServletHolder(new InternalServlet()), "/internal/*");\r
172         ctxt.addServlet(new ServletHolder(new RouteServlet()), "/internal/route/*");\r
173         ctxt.addServlet(new ServletHolder(new DRFeedsServlet()), "/");\r
174         ctxt.addFilter(new FilterHolder(new ThrottleFilter()), "/publish/*", FilterMapping.REQUEST);\r
175 \r
176         ContextHandlerCollection contexts = new ContextHandlerCollection();\r
177         contexts.addHandler(ctxt);\r
178 \r
179         // Request log configuration\r
180         NCSARequestLog nrl = new NCSARequestLog();\r
181         nrl.setFilename(p.getProperty("org.onap.dmaap.datarouter.provserver.accesslog.dir") + "/request.log.yyyy_mm_dd");\r
182         nrl.setFilenameDateFormat("yyyyMMdd");\r
183         nrl.setRetainDays(90);\r
184         nrl.setAppend(true);\r
185         nrl.setExtended(false);\r
186         nrl.setLogCookies(false);\r
187         nrl.setLogTimeZone("GMT");\r
188 \r
189         RequestLogHandler reqlog = new RequestLogHandler();\r
190         reqlog.setRequestLog(nrl);\r
191 \r
192         // Server's Handler collection\r
193         HandlerCollection hc = new HandlerCollection();\r
194         hc.setHandlers(new Handler[]{contexts, new DefaultHandler()});\r
195         hc.addHandler(reqlog);\r
196 \r
197         // Server's thread pool\r
198         QueuedThreadPool pool = new QueuedThreadPool();\r
199         pool.setMinThreads(10);\r
200         pool.setMaxThreads(200);\r
201         pool.setDetailedDump(false);\r
202 \r
203         // Daemon to clean up the log directory on a daily basis\r
204         Timer rolex = new Timer();\r
205         rolex.scheduleAtFixedRate(new PurgeLogDirTask(), 0, 86400000L);    // run once per day\r
206 \r
207         // Start LogfileLoader\r
208         LogfileLoader.getLoader();\r
209 \r
210         // The server itself\r
211         server = new Server();\r
212         server.setThreadPool(pool);\r
213         server.setConnectors(new Connector[]{http, https});\r
214         server.setHandler(hc);\r
215         server.setStopAtShutdown(true);\r
216         server.setSendServerVersion(true);\r
217         server.setSendDateHeader(true);\r
218         server.setGracefulShutdown(5000);    // allow 5 seconds for servlets to wrap up\r
219         server.setDumpAfterStart(false);\r
220         server.setDumpBeforeStop(false);\r
221 \r
222         server.start();\r
223         server.join();\r
224         logger.info("PROV0001 **** AT&T Data Router Provisioning Server halted.");\r
225     }\r
226 \r
227     private static boolean checkDatabase(Logger logger) {\r
228         DB db = new DB();\r
229         return db.runRetroFits();\r
230     }\r
231 \r
232     /**\r
233      * Stop the Jetty server.\r
234      */\r
235     public static void shutdown() {\r
236         new Thread() {\r
237             @Override\r
238             public void run() {\r
239                 try {\r
240                     server.stop();\r
241                     Thread.sleep(5000L);\r
242                     System.exit(0);\r
243                 } catch (Exception e) {\r
244                     // ignore\r
245                 }\r
246             }\r
247         }.start();\r
248     }\r
249 }\r