package io.fathom.auto.zookeeper; import io.fathom.auto.HostsFile; import io.fathom.auto.zookeeper.model.ZookeeperClusterRegistration; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.util.Map; import java.util.Map.Entry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.base.Charsets; import com.google.common.base.Strings; import com.google.common.collect.Maps; import com.google.common.io.Files; public class ZookeeperConfig { private static final Logger log = LoggerFactory.getLogger(ZookeeperConfig.class); final File instanceDir; final File installDir; public ZookeeperConfig(File installDir, File instanceDir) { this.installDir = installDir; this.instanceDir = instanceDir; } public File getConfigFile() { return new File(instanceDir, "zk.conf"); } public void mkdirs() { mkdirs(instanceDir); mkdirs(getDataDir()); mkdirs(getLogsDir()); } private void mkdirs(File dir) { if (!dir.exists()) { if (!dir.mkdirs()) { log.error("Error doing mkdirs on: " + dir); } } } public void writeConfig(ClusterSnapshot snapshot, int serverId) throws IOException { StringWriter writer = new StringWriter(); writeConfig(snapshot, serverId, new PrintWriter(writer)); File confFile = getConfigFile(); Files.write(writer.toString().getBytes(Charsets.UTF_8), confFile); } void writeConfig(ClusterSnapshot snapshot, int myid, PrintWriter writer) { ZookeeperClusterRegistration me = snapshot.servers.get(myid); if (me == null) { throw new IllegalStateException(); } writer.println("peerType=" + me.type); writer.println("dataDir=" + getDataDir().getAbsolutePath()); writer.println("dataLogDir=" + getLogsDir().getAbsolutePath()); writer.println("syncLimit=2"); writer.println("initLimit=2"); boolean newFormat = false; if (!newFormat) { writer.println("clientPort=2181"); } for (Entry<Integer, ZookeeperClusterRegistration> entry : snapshot.servers.entrySet()) { int serverId = entry.getKey(); ZookeeperClusterRegistration registration = entry.getValue(); String serverName = "zk_" + serverId; if (!newFormat) { writer.println(String.format("server.%s=%s:2182:2183", serverId, serverName)); } else { writer.println(String.format("server.%s=%s:2182:2183;%s:2181", serverId, serverName, serverName)); } } } private File getDataDir() { return new File(instanceDir, "data"); } private File getLogsDir() { return new File(instanceDir, "logs"); } public Integer readIdFile() throws IOException { File file = getIdFile(); if (!file.exists()) { return null; } String s = Files.toString(file, Charsets.UTF_8); if (Strings.isNullOrEmpty(s)) { return null; } return Integer.valueOf(s); } public void writeIdFile(int serverId) throws IOException { String s = Integer.toString(serverId); Files.write(s.getBytes(Charsets.UTF_8), getIdFile()); } private File getIdFile() { return new File(getDataDir(), "myid"); } public File getInstanceDir() { return instanceDir; } public File getInstallDir() { return installDir; } /** * We write the hosts file because otherwise ZK can't cope with IPV6 (?) */ public void writeHosts(ClusterSnapshot snapshot) throws IOException { Map<String, String> hosts = Maps.newHashMap(); for (Entry<Integer, ZookeeperClusterRegistration> entry : snapshot.servers.entrySet()) { int serverId = entry.getKey(); ZookeeperClusterRegistration registration = entry.getValue(); String zkHost = "zk_" + serverId; String ip = registration.ip; hosts.put(zkHost, ip); } HostsFile.setHosts(hosts); } }