require 'formula' class Elasticsearch < Formula homepage 'http://www.elasticsearch.org' url 'http://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.20.4.tar.gz' sha1 '1d5e58649ec84fba9ed41ed75b38b6758ad411e9' head 'https://github.com/elasticsearch/elasticsearch.git' depends_on 'maven' if build.head? def cluster_name "elasticsearch_#{ENV['USER']}" end def install if build.head? # Build the package from source system "mvn clean package -DskipTests" # Extract the package to the current directory system "tar --strip 1 -xzf target/releases/elasticsearch-*.tar.gz" end # Remove Windows files rm_f Dir["bin/*.bat"] # Move libraries to `libexec` directory libexec.install Dir['lib/*.jar'] (libexec/'sigar').install Dir['lib/sigar/*.{jar,dylib}'] # Install everything else into package directory prefix.install Dir['*'] # Remove unnecessary files rm_f Dir["#{lib}/sigar/*"] if build.head? rm_rf "#{prefix}/pom.xml" rm_rf "#{prefix}/src/" rm_rf "#{prefix}/target/" end # Set up ElasticSearch for local development: inreplace "#{prefix}/config/elasticsearch.yml" do |s| # 1. Give the cluster a unique name s.gsub! /#\s*cluster\.name\: elasticsearch/, "cluster.name: #{cluster_name}" # 2. Configure paths s.sub! "# path.data: /path/to/data", "path.data: #{var}/elasticsearch/" s.sub! "# path.logs: /path/to/logs", "path.logs: #{var}/log/elasticsearch/" s.sub! "# path.plugins: /path/to/plugins", "path.plugins: #{var}/lib/elasticsearch/plugins" # 3. Bind to loopback IP for laptops roaming different networks s.gsub! /#\s*network\.host\: [^\n]+/, "network.host: 127.0.0.1" end inreplace "#{bin}/elasticsearch.in.sh" do |s| # Configure ES_HOME s.sub! /#\!\/bin\/sh\n/, "#!/bin/sh\n\nES_HOME=#{prefix}" # Configure ES_CLASSPATH paths to use libexec instead of lib s.gsub! /ES_HOME\/lib\//, "ES_HOME/libexec/" end inreplace "#{bin}/plugin" do |s| # Add the proper ES_CLASSPATH configuration s.sub! /SCRIPT="\$0"/, %Q|SCRIPT="$0"\nES_CLASSPATH=#{libexec}| # Replace paths to use libexec instead of lib s.gsub! /\$ES_HOME\/lib\//, "$ES_CLASSPATH/" end end def caveats; <<-EOS.undent Data: #{var}/elasticsearch/#{cluster_name}/ Logs: #{var}/log/elasticsearch/#{cluster_name}.log Plugins: #{var}/lib/elasticsearch/plugins/ EOS end plist_options :manual => "elasticsearch -f -D es.config=#{HOMEBREW_PREFIX}/opt/elasticsearch/config/elasticsearch.yml" def plist; <<-EOS.undent KeepAlive Label #{plist_name} ProgramArguments #{HOMEBREW_PREFIX}/bin/elasticsearch -f -D es.config=#{prefix}/config/elasticsearch.yml EnvironmentVariables ES_JAVA_OPTS -Xss200000 RunAtLoad UserName #{ENV['USER']} WorkingDirectory #{var} StandardErrorPath /dev/null StandardOutPath /dev/null EOS end end