package org.batfish.coordinator; // Include the following imports to use queue APIs. import java.net.URI; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.logging.Level; import java.util.logging.Logger; import javax.ws.rs.core.UriBuilder; import org.apache.commons.lang.exception.ExceptionUtils; import org.batfish.common.BatfishLogger; import org.batfish.common.util.CommonUtil; import org.batfish.coordinator.authorizer.*; import org.batfish.coordinator.config.ConfigurationLocator; import org.glassfish.grizzly.ssl.SSLContextConfigurator; import org.glassfish.grizzly.ssl.SSLEngineConfigurator; import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory; import org.glassfish.jersey.jettison.JettisonFeature; import org.glassfish.jersey.media.multipart.MultiPartFeature; import org.glassfish.jersey.server.ResourceConfig; public class Main { private static Authorizer _authorizer; private static BatfishLogger _logger; private static PoolMgr _poolManager; private static Settings _settings; private static WorkMgr _workManager; static Logger httpServerLogger = Logger.getLogger( org.glassfish.grizzly.http.server.HttpServer.class.getName()); static Logger networkListenerLogger = Logger .getLogger("org.glassfish.grizzly.http.server.NetworkListener"); public static Authorizer getAuthorizer() { return _authorizer; } public static BatfishLogger getLogger() { return _logger; } public static PoolMgr getPoolMgr() { return _poolManager; } public static Settings getSettings() { return _settings; } public static WorkMgr getWorkMgr() { return _workManager; } private static void initAuthorizer() throws Exception { switch (_settings.getAuthorizationType()) { case none: _authorizer = new NoneAuthorizer(); break; case file: _authorizer = new FileAuthorizer(); break; case database: _authorizer = new DbAuthorizer(); break; default: System.err.print( "org.batfish.coordinator: Initialization failed. Unsupported authorizer type " + _settings.getAuthorizationType()); System.exit(1); } } private static void initPoolManager() { ResourceConfig rcPool = new ResourceConfig(PoolMgrService.class) .register(new JettisonFeature()).register(MultiPartFeature.class) .register(org.batfish.coordinator.CrossDomainFilter.class); if (!_settings.getUseSsl()) { URI poolMgrUri = UriBuilder .fromUri("http://" + _settings.getServiceHost()) .port(_settings.getServicePoolPort()).build(); _logger.info("Starting pool manager at " + poolMgrUri + "\n"); GrizzlyHttpServerFactory.createHttpServer(poolMgrUri, rcPool); } else { URI poolMgrUri = UriBuilder .fromUri("https://" + _settings.getServiceHost()) .port(_settings.getServicePoolPort()).build(); _logger.info("Starting pool manager at " + poolMgrUri + "\n"); // first find the file as specified. // if that does not work, find it relative to the binary Path keystoreFile = Paths.get(_settings.getSslKeystoreFilename()) .toAbsolutePath(); if (!Files.exists(keystoreFile)) { keystoreFile = CommonUtil .getJarOrClassDir(ConfigurationLocator.class).toAbsolutePath() .resolve(_settings.getSslKeystoreFilename()); } if (!Files.exists(keystoreFile)) { System.err.printf( "org.batfish.coordinator: keystore file not found at %s or %s\n", _settings.getSslKeystoreFilename(), keystoreFile.toString()); System.exit(1); } /* Uncomment below to enable fine glassfish/grizzly ssl logging */ // Logger l = // Logger.getLogger("org.glassfish.grizzly.ssl.SSLContextConfigurator"); // l.setLevel(Level.FINE); // l.setUseParentHandlers(false); // ConsoleHandler ch = new ConsoleHandler(); // ch.setLevel(Level.ALL); // l.addHandler(ch); SSLContextConfigurator sslCon = new SSLContextConfigurator(); sslCon.setKeyStoreFile(keystoreFile.toString()); sslCon.setKeyStorePass(_settings.getSslKeystorePassword()); GrizzlyHttpServerFactory.createHttpServer(poolMgrUri, rcPool, true, new SSLEngineConfigurator(sslCon, false, false, false)); } _poolManager = new PoolMgr(_logger); _poolManager.startPoolManager(); } private static void initWorkManager() { ResourceConfig rcWork = new ResourceConfig(WorkMgrService.class) .register(new JettisonFeature()).register(MultiPartFeature.class) .register(org.batfish.coordinator.CrossDomainFilter.class); if (!_settings.getUseSsl()) { URI workMgrUri = UriBuilder .fromUri("http://" + _settings.getServiceHost()) .port(_settings.getServiceWorkPort()).build(); _logger.info("Starting work manager at " + workMgrUri + "\n"); GrizzlyHttpServerFactory.createHttpServer(workMgrUri, rcWork); } else { URI workMgrUri = UriBuilder .fromUri("https://" + _settings.getServiceHost()) .port(_settings.getServiceWorkPort()).build(); _logger.info("Starting work manager at " + workMgrUri + "\n"); // first find the file as specified. // if that does not work, find it relative to the binary Path keystoreFile = Paths.get(_settings.getSslKeystoreFilename()) .toAbsolutePath(); if (!Files.exists(keystoreFile)) { keystoreFile = CommonUtil .getJarOrClassDir(ConfigurationLocator.class).toAbsolutePath() .resolve(_settings.getSslKeystoreFilename()); } if (!Files.exists(keystoreFile)) { System.err.printf( "org.batfish.coordinator: keystore file not found at %s or %s\n", _settings.getSslKeystoreFilename(), keystoreFile.toString()); System.exit(1); } SSLContextConfigurator sslCon = new SSLContextConfigurator(); sslCon.setKeyStoreFile(keystoreFile.toString()); sslCon.setKeyStorePass(_settings.getSslKeystorePassword()); GrizzlyHttpServerFactory.createHttpServer(workMgrUri, rcWork, true, new SSLEngineConfigurator(sslCon, false, false, false)); } _workManager = new WorkMgr(_logger); _workManager.startWorkManager(); } public static void main(String[] args) { mainInit(args); _logger = new BatfishLogger(_settings.getLogLevel(), false, _settings.getLogFile(), false, true); mainRun(); } public static void main(String[] args, BatfishLogger logger) { mainInit(args); _logger = logger; mainRun(); } public static void mainInit(String[] args) { _settings = null; try { _settings = new Settings(args); networkListenerLogger.setLevel(Level.WARNING); httpServerLogger.setLevel(Level.WARNING); } catch (Exception e) { System.err.print("org.batfish.coordinator: Initialization failed: " + e.getMessage()); System.exit(1); } } private static void mainRun() { try { initAuthorizer(); initPoolManager(); initWorkManager(); } catch (Exception e) { System.err.println( "org.batfish.coordinator: Initialization of a helper failed: " + e.getMessage()); System.exit(1); } // sleep indefinitely, in 10 minute chunks try { while (true) { Thread.sleep(10 * 60 * 1000); // 10 minutes _logger.info("Still alive .... waiting for work to show up\n"); } } catch (Exception ex) { String stackTrace = ExceptionUtils.getFullStackTrace(ex); System.err.println(stackTrace); } } }