package io.fathom.auto; import io.fathom.auto.config.ConfigPath; import io.fathom.auto.config.ConfigStore; import io.fathom.auto.config.ConfigStore.ConfigStoreProvider; import io.fathom.auto.fathomcloud.CloudServerInstance; import io.fathom.auto.processes.ProcessExecution; import io.fathom.auto.processes.Processes; import io.fathom.auto.zookeeper.ZookeeperInstance; import java.io.File; import java.io.IOException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class AutonomousFathomCloud { private static final Logger log = LoggerFactory.getLogger(AutonomousFathomCloud.class); private final ConfigStore configStore; AutonomousFathomCloud(ConfigStore configStore) { this.configStore = configStore; } public static void main(String[] args) throws InterruptedException { File configFile = new File("/var/fathomcloud/bootstrap"); ConfigStore configStore = null; // if (shouldBootstrap) { while (true) { try { ConfigStoreProvider configStoreProvider = null; if (configFile.exists()) { // We only want to generate the keys if a bootstrap file is // present ensureSshKeys(); Bootstrap bootstrap = new Bootstrap(configFile); configStoreProvider = bootstrap.bootstrap(); } else { log.info("Waiting for bootstrap file: {}", configFile); } if (configStoreProvider != null) { configStore = ConfigStore.get(configStoreProvider, "fathomcloud"); } if (configStore != null) { break; } } catch (Exception e) { log.warn("Error while bootstrapping", e); } TimeSpan.seconds(2).sleep(); } // } else { // configStore = ConfigStore.get("fathomcloud"); // } AutonomousFathomCloud server = new AutonomousFathomCloud(configStore); try { server.run(); } catch (Exception e) { log.error("Error during fathom cloud run; forcing exit", e); System.exit(1); } } private static void ensureSshKeys() throws IOException { File sshKey = new File("/home/fathomcloud/.ssh/id_rsa"); if (!sshKey.exists()) { log.info("SSH key not found; calling keygen helper script"); ProcessBuilder pb = new ProcessBuilder("/opt/manager/keygen.sh"); // We allow (a very generous) 2 minutes. SSH keygen isn't trivial... ProcessExecution execution = Processes.run(pb, TimeSpan.minutes(2)); if (!execution.didExit()) { throw new IOException("Timeout while starting Process"); } else { if (execution.getExitCode() == 0) { log.info("Process started OK"); } } } } public void run() throws IOException, InterruptedException { Thread zkThread = new Thread(new Runnable() { @Override public void run() { ConfigPath configRoot = configStore.getConfigRoot(); ConfigPath zkRoot = configRoot.child("zookeeper"); ZookeeperInstance zk = new ZookeeperInstance(zkRoot); try { zk.run(); } catch (Exception e) { log.error("Error during ZK run; forcing exit", e); System.exit(1); } } }); zkThread.start(); Thread cloudThread = new Thread(new Runnable() { @Override public void run() { CloudServerInstance instance = new CloudServerInstance(configStore); try { instance.run(); } catch (Exception e) { log.error("Error during fathom cloud run; forcing exit", e); System.exit(1); } } }); cloudThread.start(); } }