in metron-analytics/metron-maas-service/src/main/java/org/apache/metron/maas/service/runner/Runner.java [170:284]
public static void main(String... argv) throws Exception {
CommandLine cli = RunnerOptions.parse(new PosixParser(), argv);
String zkQuorum = RunnerOptions.ZK_QUORUM.get(cli);
String zkRoot = RunnerOptions.ZK_ROOT.get(cli);
String script = RunnerOptions.SCRIPT.get(cli);
String name = RunnerOptions.NAME.get(cli);
String version = RunnerOptions.VERSION.get(cli);
String containerId = RunnerOptions.CONTAINER_ID.get(cli);
String hostname = RunnerOptions.HOSTNAME.get(cli);
CuratorFramework client = null;
LOG.info("Running script " + script);
LOG.info("Local Directory Contents");
for(File f : new File(".").listFiles()) {
LOG.info(" " + f.getName());
}
try {
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
client = CuratorFrameworkFactory.newClient(zkQuorum, retryPolicy);
client.start();
MaaSConfig config = ConfigUtil.INSTANCE.read(client, zkRoot, new MaaSConfig(), MaaSConfig.class);
JsonInstanceSerializer<ModelEndpoint> serializer = new JsonInstanceSerializer<>(ModelEndpoint.class);
try {
serviceDiscovery = ServiceDiscoveryBuilder.builder(ModelEndpoint.class)
.client(client)
.basePath(config.getServiceRoot())
.serializer(serializer)
.build();
}
finally {
}
LOG.info("Created service @ " + config.getServiceRoot());
serviceDiscovery.start();
File cwd = new File(script).getParentFile();
File scriptFile = new File(cwd, script);
if(scriptFile.exists() && !scriptFile.canExecute()) {
scriptFile.setExecutable(true);
}
final String cmd = scriptFile.getAbsolutePath();
try {
p = new ProcessBuilder(cmd).directory(cwd).start();
}
catch(Exception e) {
LOG.info("Unable to execute " + cmd + " from " + new File(".").getAbsolutePath());
LOG.error(e.getMessage(), e);
throw new IllegalStateException(e.getMessage(), e);
}
try {
LOG.info("Started " + cmd);
Endpoint ep = readEndpoint(cwd);
URL endpointUrl =correctLocalUrl(hostname, ep.getUrl());
ep.setUrl(endpointUrl.toString());
LOG.info("Read endpoint " + ep);
ModelEndpoint endpoint = new ModelEndpoint();
{
endpoint.setName(name);
endpoint.setContainerId(containerId);
endpoint.setEndpoint(ep);
endpoint.setVersion(version);
};
ServiceInstanceBuilder<ModelEndpoint> builder = ServiceInstance.<ModelEndpoint> builder()
.address(endpointUrl.getHost())
.id(containerId)
.name(name)
.port(endpointUrl.getPort())
.registrationTimeUTC(System.currentTimeMillis())
.serviceType(ServiceType.STATIC)
.payload(endpoint)
;
final ServiceInstance<ModelEndpoint> instance = builder.build();
try {
LOG.info("Installing service instance: " + instance + " at " + serviceDiscovery);
serviceDiscovery.registerService(instance);
LOG.info("Installed instance " + name + ":" + version + "@" + endpointUrl);
}
catch(Throwable t) {
LOG.error("Unable to install instance " + name + ":" + version + "@" + endpointUrl, t);
}
Runtime.getRuntime().addShutdownHook(new Thread()
{
@Override
public void run()
{
LOG.info("KILLING CONTAINER PROCESS...");
if(p != null) {
LOG.info("Process destroyed forcibly");
p.destroyForcibly();
}
}
});
}
finally {
if (p.waitFor() != 0) {
String stderr = Joiner.on("\n").join(IOUtils.readLines(p.getErrorStream()));
String stdout = Joiner.on("\n").join(IOUtils.readLines(p.getInputStream()));
throw new IllegalStateException("Unable to execute " + script + ". Stderr is: " + stderr + "\nStdout is: " + stdout);
}
}
}
finally {
if(serviceDiscovery != null) {
CloseableUtils.closeQuietly(serviceDiscovery);
}
if(client != null) {
CloseableUtils.closeQuietly(client);
}
}
}