class Elasticsearch < Formula desc "Distributed search & analytics engine" homepage "https://www.elastic.co/products/elasticsearch" url "https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-oss-6.4.2.tar.gz" sha256 "c59aa00fd4ee03e45ac35a739b072558d8a63f06a9c34d4e38630c7ce3e3e486" head do url "https://github.com/elasticsearch/elasticsearch.git" depends_on "gradle" => :build end bottle :unneeded depends_on :java => "1.8" def cluster_name "elasticsearch_#{ENV["USER"]}" end def install if build.head? # Build the package from source system "gradle", "clean", ":distribution:tar:assemble" # Extract the package to the tar directory mkdir "tar" cd "tar" system "tar", "--strip-components=1", "-xf", Dir["../distribution/tar/build/distributions/elasticsearch-*.tar.gz"].first end # Remove Windows files rm_f Dir["bin/*.bat"] rm_f Dir["bin/*.exe"] # Install everything else into package directory libexec.install "bin", "config", "lib", "modules" inreplace libexec/"bin/elasticsearch-env", "if [ -z \"$ES_PATH_CONF\" ]; then ES_PATH_CONF=\"$ES_HOME\"/config; fi", "if [ -z \"$ES_PATH_CONF\" ]; then ES_PATH_CONF=\"#{etc}/elasticsearch\"; fi" # Set up Elasticsearch for local development: inreplace "#{libexec}/config/elasticsearch.yml" do |s| # 1. Give the cluster a unique name s.gsub!(/#\s*cluster\.name\: .*/, "cluster.name: #{cluster_name}") # 2. Configure paths s.sub!(%r{#\s*path\.data: /path/to.+$}, "path.data: #{var}/lib/elasticsearch/") s.sub!(%r{#\s*path\.logs: /path/to.+$}, "path.logs: #{var}/log/elasticsearch/") end # Move config files into etc (etc/"elasticsearch").install Dir[libexec/"config/*"] (libexec/"config").rmtree bin.install libexec/"bin/elasticsearch", libexec/"bin/elasticsearch-keystore", libexec/"bin/elasticsearch-plugin", libexec/"bin/elasticsearch-translog" bin.env_script_all_files(libexec/"bin", Language::Java.java_home_env("1.8")) end def post_install # Make sure runtime directories exist (var/"lib/elasticsearch/#{cluster_name}").mkpath (var/"log/elasticsearch").mkpath ln_s etc/"elasticsearch", libexec/"config" (var/"elasticsearch/plugins").mkpath ln_s var/"elasticsearch/plugins", libexec/"plugins" # fix test not being able to create keystore because of sandbox permissions system bin/"elasticsearch-keystore", "create" unless (etc/"elasticsearch/elasticsearch.keystore").exist? end def caveats s = <<~EOS Data: #{var}/lib/elasticsearch/#{cluster_name}/ Logs: #{var}/log/elasticsearch/#{cluster_name}.log Plugins: #{var}/elasticsearch/plugins/ Config: #{etc}/elasticsearch/ EOS s end plist_options :manual => "elasticsearch" def plist <<~EOS KeepAlive Label #{plist_name} ProgramArguments #{opt_bin}/elasticsearch EnvironmentVariables RunAtLoad WorkingDirectory #{var} StandardErrorPath #{var}/log/elasticsearch.log StandardOutPath #{var}/log/elasticsearch.log EOS end test do require "socket" server = TCPServer.new(0) port = server.addr[1] server.close system "#{bin}/elasticsearch-plugin", "list" pid = testpath/"pid" begin system "#{bin}/elasticsearch", "-d", "-p", pid, "-Epath.data=#{testpath}/data", "-Ehttp.port=#{port}" sleep 10 system "curl", "-XGET", "localhost:#{port}/" ensure Process.kill(9, pid.read.to_i) end server = TCPServer.new(0) port = server.addr[1] server.close (testpath/"config/elasticsearch.yml").write <<~EOS path.data: #{testpath}/data path.logs: #{testpath}/logs node.name: test-es-path-conf http.port: #{port} EOS cp etc/"elasticsearch/jvm.options", "config" cp etc/"elasticsearch/log4j2.properties", "config" ENV["ES_PATH_CONF"] = testpath/"config" pid = testpath/"pid" begin system "#{bin}/elasticsearch", "-d", "-p", pid sleep 10 system "curl", "-XGET", "localhost:#{port}/" output = shell_output("curl -s -XGET localhost:#{port}/_cat/nodes") assert_match "test-es-path-conf", output ensure Process.kill(9, pid.read.to_i) end end end