logstash-core 1.5.0.beta2-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of logstash-core might be problematic. Click here for more details.
- checksums.yaml +7 -0
 - data/lib/logstash-event.rb +2 -0
 - data/lib/logstash.rb +4 -0
 - data/lib/logstash/JRUBY-PR1448.rb +32 -0
 - data/lib/logstash/agent.rb +355 -0
 - data/lib/logstash/bundler.rb +124 -0
 - data/lib/logstash/codecs/base.rb +50 -0
 - data/lib/logstash/config/config_ast.rb +508 -0
 - data/lib/logstash/config/file.rb +39 -0
 - data/lib/logstash/config/grammar.rb +3503 -0
 - data/lib/logstash/config/mixin.rb +495 -0
 - data/lib/logstash/config/registry.rb +13 -0
 - data/lib/logstash/environment.rb +168 -0
 - data/lib/logstash/errors.rb +12 -0
 - data/lib/logstash/event.rb +310 -0
 - data/lib/logstash/filters/base.rb +239 -0
 - data/lib/logstash/gemfile.rb +175 -0
 - data/lib/logstash/inputs/base.rb +137 -0
 - data/lib/logstash/inputs/threadable.rb +18 -0
 - data/lib/logstash/java_integration.rb +41 -0
 - data/lib/logstash/json.rb +53 -0
 - data/lib/logstash/logging.rb +91 -0
 - data/lib/logstash/multiqueue.rb +53 -0
 - data/lib/logstash/namespace.rb +17 -0
 - data/lib/logstash/outputs/base.rb +124 -0
 - data/lib/logstash/patches.rb +3 -0
 - data/lib/logstash/patches/bugfix_jruby_2558.rb +50 -0
 - data/lib/logstash/patches/cabin.rb +34 -0
 - data/lib/logstash/patches/profile_require_calls.rb +47 -0
 - data/lib/logstash/pipeline.rb +305 -0
 - data/lib/logstash/plugin.rb +177 -0
 - data/lib/logstash/pluginmanager.rb +17 -0
 - data/lib/logstash/pluginmanager/install.rb +112 -0
 - data/lib/logstash/pluginmanager/list.rb +38 -0
 - data/lib/logstash/pluginmanager/main.rb +22 -0
 - data/lib/logstash/pluginmanager/maven_tools_patch.rb +12 -0
 - data/lib/logstash/pluginmanager/uninstall.rb +49 -0
 - data/lib/logstash/pluginmanager/update.rb +50 -0
 - data/lib/logstash/pluginmanager/util.rb +88 -0
 - data/lib/logstash/program.rb +15 -0
 - data/lib/logstash/runner.rb +167 -0
 - data/lib/logstash/sized_queue.rb +8 -0
 - data/lib/logstash/threadwatchdog.rb +37 -0
 - data/lib/logstash/timestamp.rb +97 -0
 - data/lib/logstash/util.rb +152 -0
 - data/lib/logstash/util/accessors.rb +88 -0
 - data/lib/logstash/util/buftok.rb +139 -0
 - data/lib/logstash/util/charset.rb +35 -0
 - data/lib/logstash/util/fieldreference.rb +68 -0
 - data/lib/logstash/util/filetools.rb +185 -0
 - data/lib/logstash/util/password.rb +25 -0
 - data/lib/logstash/util/plugin_version.rb +43 -0
 - data/lib/logstash/util/prctl.rb +11 -0
 - data/lib/logstash/util/require-helper.rb +18 -0
 - data/lib/logstash/util/retryable.rb +39 -0
 - data/lib/logstash/util/socket_peer.rb +7 -0
 - data/lib/logstash/version.rb +6 -0
 - data/locales/en.yml +176 -0
 - metadata +427 -0
 
| 
         @@ -0,0 +1,17 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            $DEBUGLIST = (ENV["DEBUG"] || "").split(",")
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require "logstash/environment"
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            ENV["GEM_HOME"] = ENV["GEM_PATH"] = LogStash::Environment.logstash_gem_home
         
     | 
| 
      
 6 
     | 
    
         
            +
            Gem.use_paths(LogStash::Environment.logstash_gem_home)
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            require 'logstash/pluginmanager/main'
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            if __FILE__ == $0
         
     | 
| 
      
 11 
     | 
    
         
            +
              begin
         
     | 
| 
      
 12 
     | 
    
         
            +
                LogStash::PluginManager::Main.run("bin/plugin", ARGV)
         
     | 
| 
      
 13 
     | 
    
         
            +
              rescue LogStash::PluginManager::Error => e
         
     | 
| 
      
 14 
     | 
    
         
            +
                $stderr.puts(e.message)
         
     | 
| 
      
 15 
     | 
    
         
            +
                exit(1)
         
     | 
| 
      
 16 
     | 
    
         
            +
              end
         
     | 
| 
      
 17 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,112 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'clamp'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'logstash/namespace'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'logstash/environment'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'logstash/pluginmanager/util'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'jar-dependencies'
         
     | 
| 
      
 6 
     | 
    
         
            +
            require 'jar_install_post_install_hook'
         
     | 
| 
      
 7 
     | 
    
         
            +
            require 'file-dependencies/gem'
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            require "logstash/gemfile"
         
     | 
| 
      
 10 
     | 
    
         
            +
            require "logstash/bundler"
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            class LogStash::PluginManager::Install < Clamp::Command
         
     | 
| 
      
 13 
     | 
    
         
            +
              parameter "[PLUGIN] ...", "plugin name(s) or file"
         
     | 
| 
      
 14 
     | 
    
         
            +
              option "--version", "VERSION", "version of the plugin to install"
         
     | 
| 
      
 15 
     | 
    
         
            +
              option "--[no-]verify", :flag, "verify plugin validity before installation", :default => true
         
     | 
| 
      
 16 
     | 
    
         
            +
              option "--development", :flag, "install all development dependencies of currently installed plugins", :default => false
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
              # the install logic below support installing multiple plugins with each a version specification
         
     | 
| 
      
 19 
     | 
    
         
            +
              # but the argument parsing does not support it for now so currently if specifying --version only
         
     | 
| 
      
 20 
     | 
    
         
            +
              # one plugin name can be also specified.
         
     | 
| 
      
 21 
     | 
    
         
            +
              #
         
     | 
| 
      
 22 
     | 
    
         
            +
              # TODO: find right syntax to allow specifying list of plugins with optional version specification for each
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
              def execute
         
     | 
| 
      
 25 
     | 
    
         
            +
                if development?
         
     | 
| 
      
 26 
     | 
    
         
            +
                  raise(LogStash::PluginManager::Error, "Cannot specify plugin(s) with --development, it will add the development dependencies of the currently installed plugins") unless plugin_list.empty?
         
     | 
| 
      
 27 
     | 
    
         
            +
                else
         
     | 
| 
      
 28 
     | 
    
         
            +
                  raise(LogStash::PluginManager::Error, "No plugin specified") if plugin_list.empty? && verify?
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                  # temporary until we fullfil TODO ^^
         
     | 
| 
      
 31 
     | 
    
         
            +
                  raise(LogStash::PluginManager::Error, "Only 1 plugin name can be specified with --version") if version && plugin_list.size > 1
         
     | 
| 
      
 32 
     | 
    
         
            +
                end
         
     | 
| 
      
 33 
     | 
    
         
            +
                raise(LogStash::PluginManager::Error, "File #{LogStash::Environment::GEMFILE_PATH} does not exist or is not writable, aborting") unless File.writable?(LogStash::Environment::GEMFILE_PATH)
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                gemfile = LogStash::Gemfile.new(File.new(LogStash::Environment::GEMFILE_PATH, "r+")).load
         
     | 
| 
      
 36 
     | 
    
         
            +
                # keep a copy of the gemset to revert on error
         
     | 
| 
      
 37 
     | 
    
         
            +
                original_gemset = gemfile.gemset.copy
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                # force Rubygems sources to our Gemfile sources
         
     | 
| 
      
 40 
     | 
    
         
            +
                Gem.sources = gemfile.gemset.sources
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                # install_list will be an array of [plugin name, version] tuples, version can be nil
         
     | 
| 
      
 43 
     | 
    
         
            +
                install_list = []
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
                if development?
         
     | 
| 
      
 46 
     | 
    
         
            +
                  specs = LogStash::PluginManager.all_installed_plugins_gem_specs(gemfile)
         
     | 
| 
      
 47 
     | 
    
         
            +
                  install_list = specs.inject([]) do |result, spec|
         
     | 
| 
      
 48 
     | 
    
         
            +
                    result = result + spec.dependencies.select{|dep| dep.type == :development}.map{|dep| [dep.name] + dep.requirement.as_list + [{:group => :development}]}
         
     | 
| 
      
 49 
     | 
    
         
            +
                  end
         
     | 
| 
      
 50 
     | 
    
         
            +
                else
         
     | 
| 
      
 51 
     | 
    
         
            +
                  # at this point we know that plugin_list is not empty and if the --version is specified there is only one plugin in plugin_list
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
                  install_list = version ? [plugin_list << version] : plugin_list.map{|plugin| [plugin, nil]}
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
                  install_list.each do |plugin, version|
         
     | 
| 
      
 56 
     | 
    
         
            +
                    puts("Validating #{[plugin, version].compact.join("-")}")
         
     | 
| 
      
 57 
     | 
    
         
            +
                    raise(LogStash::PluginManager::Error, "Installation aborted") unless LogStash::PluginManager.logstash_plugin?(plugin, version)
         
     | 
| 
      
 58 
     | 
    
         
            +
                  end if verify?
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
                  # at this point we know that we either have a valid gem name & version or a valid .gem file path
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
                  # if LogStash::PluginManager.plugin_file?(plugin)
         
     | 
| 
      
 63 
     | 
    
         
            +
                  #   raise(LogStash::PluginManager::Error) unless cache_gem_file(plugin)
         
     | 
| 
      
 64 
     | 
    
         
            +
                  #   spec = LogStash::PluginManager.plugin_file_spec(plugin)
         
     | 
| 
      
 65 
     | 
    
         
            +
                  #   gemfile.update(spec.name, spec.version.to_s)
         
     | 
| 
      
 66 
     | 
    
         
            +
                  # else
         
     | 
| 
      
 67 
     | 
    
         
            +
                  #   plugins.each{|tuple| gemfile.update(*tuple)}
         
     | 
| 
      
 68 
     | 
    
         
            +
                  # end
         
     | 
| 
      
 69 
     | 
    
         
            +
                end
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
             
     | 
| 
      
 72 
     | 
    
         
            +
                install_list = LogStash::PluginManager.merge_duplicates(install_list)
         
     | 
| 
      
 73 
     | 
    
         
            +
                install_list.each{|plugin, version| gemfile.update(plugin, version)}
         
     | 
| 
      
 74 
     | 
    
         
            +
                gemfile.save
         
     | 
| 
      
 75 
     | 
    
         
            +
             
     | 
| 
      
 76 
     | 
    
         
            +
                puts("Installing" + (install_list.empty? ? "..." : " " + install_list.map{|plugin, version| plugin}.join(", ")))
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
                bundler_options = {:install => true}
         
     | 
| 
      
 79 
     | 
    
         
            +
                bundler_options[:without] = [] if development?
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
      
 81 
     | 
    
         
            +
                # any errors will be logged to $stderr by invoke_bundler!
         
     | 
| 
      
 82 
     | 
    
         
            +
                output, exception = LogStash::Bundler.invoke_bundler!(bundler_options)
         
     | 
| 
      
 83 
     | 
    
         
            +
             
     | 
| 
      
 84 
     | 
    
         
            +
                if ENV["DEBUG"]
         
     | 
| 
      
 85 
     | 
    
         
            +
                  $stderr.puts(output)
         
     | 
| 
      
 86 
     | 
    
         
            +
                  $stderr.puts("Error: #{exception.class}, #{exception.message}") if exception
         
     | 
| 
      
 87 
     | 
    
         
            +
                end
         
     | 
| 
      
 88 
     | 
    
         
            +
             
     | 
| 
      
 89 
     | 
    
         
            +
                if exception
         
     | 
| 
      
 90 
     | 
    
         
            +
                  # revert to original Gemfile content
         
     | 
| 
      
 91 
     | 
    
         
            +
                  gemfile.gemset = original_gemset
         
     | 
| 
      
 92 
     | 
    
         
            +
                  gemfile.save
         
     | 
| 
      
 93 
     | 
    
         
            +
                  raise(LogStash::PluginManager::Error, "Installation aborted")
         
     | 
| 
      
 94 
     | 
    
         
            +
                end
         
     | 
| 
      
 95 
     | 
    
         
            +
             
     | 
| 
      
 96 
     | 
    
         
            +
                puts("Installation successful")
         
     | 
| 
      
 97 
     | 
    
         
            +
              end
         
     | 
| 
      
 98 
     | 
    
         
            +
             
     | 
| 
      
 99 
     | 
    
         
            +
              # copy .gem file into bundler cache directory, log any error to $stderr
         
     | 
| 
      
 100 
     | 
    
         
            +
              # @param path [String] the source .gem file to copy
         
     | 
| 
      
 101 
     | 
    
         
            +
              # @return [Boolean] true if successful
         
     | 
| 
      
 102 
     | 
    
         
            +
              def cache_gem_file(path)
         
     | 
| 
      
 103 
     | 
    
         
            +
                dest = ::File.join(LogStash::Environment.logstash_gem_home, "cache")
         
     | 
| 
      
 104 
     | 
    
         
            +
                begin
         
     | 
| 
      
 105 
     | 
    
         
            +
                  FileUtils.cp(path, dest)
         
     | 
| 
      
 106 
     | 
    
         
            +
                rescue => e
         
     | 
| 
      
 107 
     | 
    
         
            +
                  $stderr.puts("Error copying #{plugin} to #{dest}, caused by #{e.class}")
         
     | 
| 
      
 108 
     | 
    
         
            +
                  return false
         
     | 
| 
      
 109 
     | 
    
         
            +
                end
         
     | 
| 
      
 110 
     | 
    
         
            +
                true
         
     | 
| 
      
 111 
     | 
    
         
            +
              end
         
     | 
| 
      
 112 
     | 
    
         
            +
            end # class Logstash::PluginManager
         
     | 
| 
         @@ -0,0 +1,38 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'clamp'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'logstash/namespace'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'logstash/pluginmanager/util'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'rubygems/spec_fetcher'
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            class LogStash::PluginManager::List < Clamp::Command
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
              parameter "[PLUGIN]", "Part of plugin name to search for, leave empty for all plugins"
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
              option "--installed", :flag, "List only explicitly installed plugins using bin/plugin install ...", :default => false
         
     | 
| 
      
 11 
     | 
    
         
            +
              option "--verbose", :flag, "Also show plugin version number", :default => false
         
     | 
| 
      
 12 
     | 
    
         
            +
              option "--group", "NAME", "Filter plugins per group: input, output, filter or codec" do |arg|
         
     | 
| 
      
 13 
     | 
    
         
            +
                raise(ArgumentError, "should be one of: input, output, filter or codec") unless ['input', 'output', 'filter', 'codec'].include?(arg)
         
     | 
| 
      
 14 
     | 
    
         
            +
                arg
         
     | 
| 
      
 15 
     | 
    
         
            +
              end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
              def execute
         
     | 
| 
      
 18 
     | 
    
         
            +
                Gem.configuration.verbose = false
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                gemfile = LogStash::Gemfile.new(File.new(LogStash::Environment::GEMFILE_PATH, "r+")).load
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                # start with all locally installed plugin gems regardless of the Gemfile content
         
     | 
| 
      
 23 
     | 
    
         
            +
                specs = LogStash::PluginManager.find_plugins_gem_specs
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                # apply filters
         
     | 
| 
      
 26 
     | 
    
         
            +
                specs = specs.select{|spec| gemfile.find(spec.name)} if installed?
         
     | 
| 
      
 27 
     | 
    
         
            +
                specs = specs.select{|spec| spec.name =~ /#{plugin}/i} if plugin
         
     | 
| 
      
 28 
     | 
    
         
            +
                specs = specs.select{|spec| spec.metadata['logstash_group'] == group} if group
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                raise(LogStash::PluginManager::Error, "No plugins found") if specs.empty?
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
                specs.sort_by{|spec| spec.name}.each do |spec|
         
     | 
| 
      
 33 
     | 
    
         
            +
                  line = "#{spec.name}"
         
     | 
| 
      
 34 
     | 
    
         
            +
                  line += " (#{spec.version})" if verbose?
         
     | 
| 
      
 35 
     | 
    
         
            +
                  puts(line)
         
     | 
| 
      
 36 
     | 
    
         
            +
                end
         
     | 
| 
      
 37 
     | 
    
         
            +
              end
         
     | 
| 
      
 38 
     | 
    
         
            +
            end # class Logstash::PluginManager
         
     | 
| 
         @@ -0,0 +1,22 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "logstash/namespace"
         
     | 
| 
      
 2 
     | 
    
         
            +
            require "logstash/errors"
         
     | 
| 
      
 3 
     | 
    
         
            +
            require "logstash/pluginmanager/install"
         
     | 
| 
      
 4 
     | 
    
         
            +
            require "logstash/pluginmanager/uninstall"
         
     | 
| 
      
 5 
     | 
    
         
            +
            require "logstash/pluginmanager/list"
         
     | 
| 
      
 6 
     | 
    
         
            +
            require "logstash/pluginmanager/update"
         
     | 
| 
      
 7 
     | 
    
         
            +
            require "logstash/pluginmanager/util"
         
     | 
| 
      
 8 
     | 
    
         
            +
            require "logstash/pluginmanager/maven_tools_patch"
         
     | 
| 
      
 9 
     | 
    
         
            +
            require "clamp"
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            module LogStash
         
     | 
| 
      
 12 
     | 
    
         
            +
              module PluginManager
         
     | 
| 
      
 13 
     | 
    
         
            +
                class Error < StandardError; end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                class Main < Clamp::Command
         
     | 
| 
      
 16 
     | 
    
         
            +
                  subcommand "install", "Install a plugin", LogStash::PluginManager::Install
         
     | 
| 
      
 17 
     | 
    
         
            +
                  subcommand "uninstall", "Uninstall a plugin", LogStash::PluginManager::Uninstall
         
     | 
| 
      
 18 
     | 
    
         
            +
                  subcommand "update", "Install a plugin", LogStash::PluginManager::Update
         
     | 
| 
      
 19 
     | 
    
         
            +
                  subcommand "list", "List all installed plugins", LogStash::PluginManager::List
         
     | 
| 
      
 20 
     | 
    
         
            +
                end
         
     | 
| 
      
 21 
     | 
    
         
            +
              end
         
     | 
| 
      
 22 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,12 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # This adds the "repo" element to the jar-dependencies DSL
         
     | 
| 
      
 2 
     | 
    
         
            +
            # allowing a gemspec to require a jar that exists in a custom
         
     | 
| 
      
 3 
     | 
    
         
            +
            # maven repository
         
     | 
| 
      
 4 
     | 
    
         
            +
            # Example:
         
     | 
| 
      
 5 
     | 
    
         
            +
            #   gemspec.requirements << "repo http://localhosty/repo"
         
     | 
| 
      
 6 
     | 
    
         
            +
            require 'maven/tools/dsl/project_gemspec'
         
     | 
| 
      
 7 
     | 
    
         
            +
            class Maven::Tools::DSL::ProjectGemspec
         
     | 
| 
      
 8 
     | 
    
         
            +
              def repo(url)
         
     | 
| 
      
 9 
     | 
    
         
            +
                @parent.repository(:id => url, :url => url)
         
     | 
| 
      
 10 
     | 
    
         
            +
              end
         
     | 
| 
      
 11 
     | 
    
         
            +
            end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
         @@ -0,0 +1,49 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "logstash/namespace"
         
     | 
| 
      
 2 
     | 
    
         
            +
            require "logstash/logging"
         
     | 
| 
      
 3 
     | 
    
         
            +
            require "logstash/errors"
         
     | 
| 
      
 4 
     | 
    
         
            +
            require "logstash/environment"
         
     | 
| 
      
 5 
     | 
    
         
            +
            require "logstash/pluginmanager/util"
         
     | 
| 
      
 6 
     | 
    
         
            +
            require "clamp"
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            require "logstash/gemfile"
         
     | 
| 
      
 9 
     | 
    
         
            +
            require "logstash/bundler"
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            class LogStash::PluginManager::Uninstall < Clamp::Command
         
     | 
| 
      
 12 
     | 
    
         
            +
              parameter "PLUGIN", "plugin name"
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
              def execute
         
     | 
| 
      
 16 
     | 
    
         
            +
                raise(LogStash::PluginManager::Error, "File #{LogStash::Environment::GEMFILE_PATH} does not exist or is not writable, aborting") unless File.writable?(LogStash::Environment::GEMFILE_PATH)
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                gemfile = LogStash::Gemfile.new(File.new(LogStash::Environment::GEMFILE_PATH, "r+")).load
         
     | 
| 
      
 19 
     | 
    
         
            +
                # keep a copy of the gemset to revert on error
         
     | 
| 
      
 20 
     | 
    
         
            +
                original_gemset = gemfile.gemset.copy
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                # make sure this is an installed plugin and present in Gemfile.
         
     | 
| 
      
 23 
     | 
    
         
            +
                # it is not possible to uninstall a dependency not listed in the Gemfile, for example a dependent codec
         
     | 
| 
      
 24 
     | 
    
         
            +
                raise(LogStash::PluginManager::Error, "This plugin has not been previously installed, aborting") unless LogStash::PluginManager.installed_plugin?(plugin, gemfile)
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                # since we previously did a gemfile.find(plugin) there is no reason why
         
     | 
| 
      
 27 
     | 
    
         
            +
                # remove would not work (return nil) here
         
     | 
| 
      
 28 
     | 
    
         
            +
                if gemfile.remove(plugin)
         
     | 
| 
      
 29 
     | 
    
         
            +
                  gemfile.save
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                  puts("Uninstalling #{plugin}")
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                  # any errors will be logged to $stderr by invoke_bundler!
         
     | 
| 
      
 34 
     | 
    
         
            +
                  output, exception = LogStash::Bundler.invoke_bundler!(:clean => true)
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                  if ENV["DEBUG"]
         
     | 
| 
      
 37 
     | 
    
         
            +
                    $stderr.puts(output)
         
     | 
| 
      
 38 
     | 
    
         
            +
                    $stderr.puts("Error: #{exception.class}, #{exception.message}") if exception
         
     | 
| 
      
 39 
     | 
    
         
            +
                  end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                  if exception
         
     | 
| 
      
 42 
     | 
    
         
            +
                    # revert to original Gemfile content
         
     | 
| 
      
 43 
     | 
    
         
            +
                    gemfile.gemset = original_gemset
         
     | 
| 
      
 44 
     | 
    
         
            +
                    gemfile.save
         
     | 
| 
      
 45 
     | 
    
         
            +
                    raise(LogStash::PluginManager::Error, "Uninstall aborted")
         
     | 
| 
      
 46 
     | 
    
         
            +
                  end
         
     | 
| 
      
 47 
     | 
    
         
            +
                end
         
     | 
| 
      
 48 
     | 
    
         
            +
              end
         
     | 
| 
      
 49 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,50 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'clamp'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'logstash/namespace'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'logstash/pluginmanager/util'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'jar-dependencies'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'jar_install_post_install_hook'
         
     | 
| 
      
 6 
     | 
    
         
            +
            require 'file-dependencies/gem'
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            require "logstash/gemfile"
         
     | 
| 
      
 9 
     | 
    
         
            +
            require "logstash/bundler"
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            class LogStash::PluginManager::Update < Clamp::Command
         
     | 
| 
      
 12 
     | 
    
         
            +
              parameter "[PLUGIN] ...", "Plugin name(s) to upgrade to latest version"
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
              def execute
         
     | 
| 
      
 15 
     | 
    
         
            +
                gemfile = LogStash::Gemfile.new(File.new(LogStash::Environment::GEMFILE_PATH, "r+")).load
         
     | 
| 
      
 16 
     | 
    
         
            +
                # keep a copy of the gemset to revert on error
         
     | 
| 
      
 17 
     | 
    
         
            +
                original_gemset = gemfile.gemset.copy
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                # create list of plugins to update
         
     | 
| 
      
 20 
     | 
    
         
            +
                plugins = unless plugin_list.empty?
         
     | 
| 
      
 21 
     | 
    
         
            +
                  not_installed = plugin_list.find{|plugin| !LogStash::PluginManager.installed_plugin?(plugin, gemfile)}
         
     | 
| 
      
 22 
     | 
    
         
            +
                  raise(LogStash::PluginManager::Error, "Plugin #{not_installed} has not been previously installed, aborting") if not_installed
         
     | 
| 
      
 23 
     | 
    
         
            +
                  plugin_list
         
     | 
| 
      
 24 
     | 
    
         
            +
                else
         
     | 
| 
      
 25 
     | 
    
         
            +
                  LogStash::PluginManager.all_installed_plugins_gem_specs(gemfile).map{|spec| spec.name}
         
     | 
| 
      
 26 
     | 
    
         
            +
                end
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                # remove any version constrain from the Gemfile so the plugin(s) can be updated to latest version
         
     | 
| 
      
 29 
     | 
    
         
            +
                # calling update without requiremend will remove any previous requirements
         
     | 
| 
      
 30 
     | 
    
         
            +
                plugins.each{|plugin| gemfile.update(plugin)}
         
     | 
| 
      
 31 
     | 
    
         
            +
                gemfile.save
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                puts("Updating " + plugins.join(", "))
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                # any errors will be logged to $stderr by invoke_bundler!
         
     | 
| 
      
 36 
     | 
    
         
            +
                output, exception = LogStash::Bundler.invoke_bundler!(:update => plugins)
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                if ENV["DEBUG"]
         
     | 
| 
      
 39 
     | 
    
         
            +
                  $stderr.puts(output)
         
     | 
| 
      
 40 
     | 
    
         
            +
                  $stderr.puts("Error: #{exception.class}, #{exception.message}") if exception
         
     | 
| 
      
 41 
     | 
    
         
            +
                end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                if exception
         
     | 
| 
      
 44 
     | 
    
         
            +
                  # revert to original Gemfile content
         
     | 
| 
      
 45 
     | 
    
         
            +
                  gemfile.gemset = original_gemset
         
     | 
| 
      
 46 
     | 
    
         
            +
                  gemfile.save
         
     | 
| 
      
 47 
     | 
    
         
            +
                  raise(LogStash::PluginManager::Error, "Update aborted")
         
     | 
| 
      
 48 
     | 
    
         
            +
                end
         
     | 
| 
      
 49 
     | 
    
         
            +
              end
         
     | 
| 
      
 50 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,88 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module LogStash::PluginManager
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
              # check for valid logstash plugin gem name & version or .gem file, logs errors to $stdout
         
     | 
| 
      
 4 
     | 
    
         
            +
              # uses Rubygems API and will remotely validated agains the current Gem.sources
         
     | 
| 
      
 5 
     | 
    
         
            +
              # @param plugin [String] plugin name or .gem file path
         
     | 
| 
      
 6 
     | 
    
         
            +
              # @param version [String] gem version requirement string
         
     | 
| 
      
 7 
     | 
    
         
            +
              # @return [Boolean] true if valid logstash plugin gem name & version or a .gem file
         
     | 
| 
      
 8 
     | 
    
         
            +
              def self.logstash_plugin?(plugin, version = nil)
         
     | 
| 
      
 9 
     | 
    
         
            +
                if plugin_file?(plugin)
         
     | 
| 
      
 10 
     | 
    
         
            +
                  begin
         
     | 
| 
      
 11 
     | 
    
         
            +
                    return logstash_plugin_gem_spec?(plugin_file_spec(plugin))
         
     | 
| 
      
 12 
     | 
    
         
            +
                  rescue => e
         
     | 
| 
      
 13 
     | 
    
         
            +
                    $stderr.puts("Error reading plugin file #{plugin}, caused by #{e.class}")
         
     | 
| 
      
 14 
     | 
    
         
            +
                    $stderr.puts(e.message) if ENV["DEBUG"]
         
     | 
| 
      
 15 
     | 
    
         
            +
                    return false
         
     | 
| 
      
 16 
     | 
    
         
            +
                  end
         
     | 
| 
      
 17 
     | 
    
         
            +
                else
         
     | 
| 
      
 18 
     | 
    
         
            +
                  dep = Gem::Dependency.new(plugin, version || Gem::Requirement.default)
         
     | 
| 
      
 19 
     | 
    
         
            +
                  specs, error = Gem::SpecFetcher.fetcher.spec_for_dependency(dep)
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                  # depending on version requirements, multiple specs can be returned in which case
         
     | 
| 
      
 22 
     | 
    
         
            +
                  # we will grab the one with the highest version number
         
     | 
| 
      
 23 
     | 
    
         
            +
                  if latest = specs.map(&:first).max_by(&:version)
         
     | 
| 
      
 24 
     | 
    
         
            +
                    unless valid = logstash_plugin_gem_spec?(latest)
         
     | 
| 
      
 25 
     | 
    
         
            +
                      $stderr.puts("#{plugin} is not a Logstash plugin")
         
     | 
| 
      
 26 
     | 
    
         
            +
                    end
         
     | 
| 
      
 27 
     | 
    
         
            +
                    return valid
         
     | 
| 
      
 28 
     | 
    
         
            +
                  else
         
     | 
| 
      
 29 
     | 
    
         
            +
                    $stderr.puts("Plugin #{plugin}" + (version ? " version #{version}" : "") + " does not exist")
         
     | 
| 
      
 30 
     | 
    
         
            +
                    return false
         
     | 
| 
      
 31 
     | 
    
         
            +
                  end
         
     | 
| 
      
 32 
     | 
    
         
            +
                end
         
     | 
| 
      
 33 
     | 
    
         
            +
              end
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
              # @param spec [Gem::Specification] plugin gem specification
         
     | 
| 
      
 36 
     | 
    
         
            +
              # @return [Boolean] true if this spec is for an installable logstash plugin
         
     | 
| 
      
 37 
     | 
    
         
            +
              def self.logstash_plugin_gem_spec?(spec)
         
     | 
| 
      
 38 
     | 
    
         
            +
                spec.metadata && spec.metadata["logstash_plugin"] == "true"
         
     | 
| 
      
 39 
     | 
    
         
            +
              end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
              # @param path [String] path to .gem file
         
     | 
| 
      
 42 
     | 
    
         
            +
              # @return [Gem::Specification] .get file gem specification
         
     | 
| 
      
 43 
     | 
    
         
            +
              # @raise [Exception] Gem::Package::FormatError will be raised on invalid .gem file format, might be other exceptions too
         
     | 
| 
      
 44 
     | 
    
         
            +
              def self.plugin_file_spec(path)
         
     | 
| 
      
 45 
     | 
    
         
            +
                Gem::Package.new(path).spec
         
     | 
| 
      
 46 
     | 
    
         
            +
              end
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
              # @param plugin [String] the plugin name or the local path to a .gem file
         
     | 
| 
      
 49 
     | 
    
         
            +
              # @return [Boolean] true if the plugin is a local .gem file
         
     | 
| 
      
 50 
     | 
    
         
            +
              def self.plugin_file?(plugin)
         
     | 
| 
      
 51 
     | 
    
         
            +
                (plugin =~ /\.gem$/ && File.file?(plugin))
         
     | 
| 
      
 52 
     | 
    
         
            +
              end
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
              # retrieve gem specs for all or specified name valid logstash plugins locally installed
         
     | 
| 
      
 55 
     | 
    
         
            +
              # @param name [String] specific plugin name to find or nil for all plungins
         
     | 
| 
      
 56 
     | 
    
         
            +
              # @return [Array<Gem::Specification>] all local logstash plugin gem specs
         
     | 
| 
      
 57 
     | 
    
         
            +
              def self.find_plugins_gem_specs(name = nil)
         
     | 
| 
      
 58 
     | 
    
         
            +
                specs = name ? Gem::Specification.find_all_by_name(name) : Gem::Specification.find_all
         
     | 
| 
      
 59 
     | 
    
         
            +
                specs.select{|spec| logstash_plugin_gem_spec?(spec)}
         
     | 
| 
      
 60 
     | 
    
         
            +
              end
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
              # list of all locally installed plugins specs specified in the Gemfile.
         
     | 
| 
      
 63 
     | 
    
         
            +
              # note that an installed plugin dependecies like codecs will not be listed, only those
         
     | 
| 
      
 64 
     | 
    
         
            +
              # specifically listed in the Gemfile.
         
     | 
| 
      
 65 
     | 
    
         
            +
              # @param gemfile [LogStash::Gemfile] the gemfile to validate against
         
     | 
| 
      
 66 
     | 
    
         
            +
              # @return [Array<Gem::Specification>] list of plugin names
         
     | 
| 
      
 67 
     | 
    
         
            +
              def self.all_installed_plugins_gem_specs(gemfile)
         
     | 
| 
      
 68 
     | 
    
         
            +
                # we start form the installed gemspecs so we can verify the metadata for valid logstash plugin
         
     | 
| 
      
 69 
     | 
    
         
            +
                # then filter out those not included in the Gemfile
         
     | 
| 
      
 70 
     | 
    
         
            +
                find_plugins_gem_specs.select{|spec| !!gemfile.find(spec.name)}
         
     | 
| 
      
 71 
     | 
    
         
            +
              end
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
              # @param plugin [String] plugin name
         
     | 
| 
      
 74 
     | 
    
         
            +
              # @param gemfile [LogStash::Gemfile] the gemfile to validate against
         
     | 
| 
      
 75 
     | 
    
         
            +
              # @return [Boolean] true if the plugin is an installed logstash plugin and spefificed in the Gemfile
         
     | 
| 
      
 76 
     | 
    
         
            +
              def self.installed_plugin?(plugin, gemfile)
         
     | 
| 
      
 77 
     | 
    
         
            +
                !!gemfile.find(plugin) && find_plugins_gem_specs(plugin).any?
         
     | 
| 
      
 78 
     | 
    
         
            +
              end
         
     | 
| 
      
 79 
     | 
    
         
            +
             
     | 
| 
      
 80 
     | 
    
         
            +
              # @param plugin_list [Array] array of [plugin name, version] tuples
         
     | 
| 
      
 81 
     | 
    
         
            +
              # @return [Array] array of [plugin name, version, ...] tuples when duplciate names have been merged and non duplicate version requirements added
         
     | 
| 
      
 82 
     | 
    
         
            +
              def self.merge_duplicates(plugin_list)
         
     | 
| 
      
 83 
     | 
    
         
            +
             
     | 
| 
      
 84 
     | 
    
         
            +
                # quick & dirty naive dedup for now
         
     | 
| 
      
 85 
     | 
    
         
            +
                # TODO: properly merge versions requirements
         
     | 
| 
      
 86 
     | 
    
         
            +
                plugin_list.uniq(&:first)
         
     | 
| 
      
 87 
     | 
    
         
            +
              end
         
     | 
| 
      
 88 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,15 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # encoding: utf-8
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require "logstash/namespace"
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            module LogStash::Program
         
     | 
| 
      
 6 
     | 
    
         
            +
              public
         
     | 
| 
      
 7 
     | 
    
         
            +
              def exit(value)
         
     | 
| 
      
 8 
     | 
    
         
            +
                if RUBY_ENGINE == "jruby"
         
     | 
| 
      
 9 
     | 
    
         
            +
                  # Kernel::exit() in jruby just tosses an exception? Let's actually exit.
         
     | 
| 
      
 10 
     | 
    
         
            +
                  Java::java.lang.System.exit(value)
         
     | 
| 
      
 11 
     | 
    
         
            +
                else
         
     | 
| 
      
 12 
     | 
    
         
            +
                  Kernel::exit(value)
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
              end # def exit
         
     | 
| 
      
 15 
     | 
    
         
            +
            end # module LogStash::Program
         
     | 
| 
         @@ -0,0 +1,167 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # encoding: utf-8
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            Encoding.default_external = Encoding::UTF_8
         
     | 
| 
      
 4 
     | 
    
         
            +
            $START = Time.now
         
     | 
| 
      
 5 
     | 
    
         
            +
            $DEBUGLIST = (ENV["DEBUG"] || "").split(",")
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            require "logstash/environment"
         
     | 
| 
      
 8 
     | 
    
         
            +
            LogStash::Environment.bundler_setup!
         
     | 
| 
      
 9 
     | 
    
         
            +
            LogStash::Environment.load_locale!
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            Thread.abort_on_exception = true
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            require "logstash/namespace"
         
     | 
| 
      
 14 
     | 
    
         
            +
            require "logstash/program"
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            class LogStash::RSpecsRunner
         
     | 
| 
      
 17 
     | 
    
         
            +
              def initialize(args)
         
     | 
| 
      
 18 
     | 
    
         
            +
                @args = args
         
     | 
| 
      
 19 
     | 
    
         
            +
              end
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
              def run
         
     | 
| 
      
 22 
     | 
    
         
            +
                @result = RSpec::Core::Runner.run(@args)
         
     | 
| 
      
 23 
     | 
    
         
            +
              end
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
              def wait
         
     | 
| 
      
 26 
     | 
    
         
            +
                return @result
         
     | 
| 
      
 27 
     | 
    
         
            +
              end
         
     | 
| 
      
 28 
     | 
    
         
            +
            end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
            class LogStash::Runner
         
     | 
| 
      
 31 
     | 
    
         
            +
              include LogStash::Program
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
              def main(args)
         
     | 
| 
      
 34 
     | 
    
         
            +
                require "logstash/util"
         
     | 
| 
      
 35 
     | 
    
         
            +
                require "stud/trap"
         
     | 
| 
      
 36 
     | 
    
         
            +
                require "stud/task"
         
     | 
| 
      
 37 
     | 
    
         
            +
                @startup_interruption_trap = Stud::trap("INT") { puts "Interrupted"; exit 0 }
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                LogStash::Util::set_thread_name(self.class.name)
         
     | 
| 
      
 40 
     | 
    
         
            +
                #$LOAD_PATH << File.join(File.dirname(__FILE__), "..")
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                if RUBY_VERSION < "1.9.2"
         
     | 
| 
      
 43 
     | 
    
         
            +
                  $stderr.puts "Ruby 1.9.2 or later is required. (You are running: " + RUBY_VERSION + ")"
         
     | 
| 
      
 44 
     | 
    
         
            +
                  return 1
         
     | 
| 
      
 45 
     | 
    
         
            +
                end
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
                Stud::untrap("INT", @startup_interruption_trap)
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
                task = run(args)
         
     | 
| 
      
 50 
     | 
    
         
            +
                exit(task.wait)
         
     | 
| 
      
 51 
     | 
    
         
            +
              end # def self.main
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
              def run(args)
         
     | 
| 
      
 54 
     | 
    
         
            +
                command = args.shift
         
     | 
| 
      
 55 
     | 
    
         
            +
                commands = {
         
     | 
| 
      
 56 
     | 
    
         
            +
                  "version" => lambda do
         
     | 
| 
      
 57 
     | 
    
         
            +
                    require "logstash/agent"
         
     | 
| 
      
 58 
     | 
    
         
            +
                    agent_args = ["--version"]
         
     | 
| 
      
 59 
     | 
    
         
            +
                    if args.include?("--verbose")
         
     | 
| 
      
 60 
     | 
    
         
            +
                      agent_args << "--verbose"
         
     | 
| 
      
 61 
     | 
    
         
            +
                    end
         
     | 
| 
      
 62 
     | 
    
         
            +
                    return LogStash::Agent.run($0, agent_args)
         
     | 
| 
      
 63 
     | 
    
         
            +
                  end,
         
     | 
| 
      
 64 
     | 
    
         
            +
                  "rspec" => lambda do
         
     | 
| 
      
 65 
     | 
    
         
            +
                    require "rspec/core/runner"
         
     | 
| 
      
 66 
     | 
    
         
            +
                    require "rspec"
         
     | 
| 
      
 67 
     | 
    
         
            +
                    spec_path = File.expand_path(File.join(File.dirname(__FILE__), "/../../spec"))
         
     | 
| 
      
 68 
     | 
    
         
            +
                    $LOAD_PATH << spec_path
         
     | 
| 
      
 69 
     | 
    
         
            +
                    all_specs = Dir.glob(File.join(spec_path, "/**/*_spec.rb"))
         
     | 
| 
      
 70 
     | 
    
         
            +
                    rspec = LogStash::RSpecsRunner.new(args.empty? ? all_specs : args)
         
     | 
| 
      
 71 
     | 
    
         
            +
                    return rspec.run
         
     | 
| 
      
 72 
     | 
    
         
            +
                  end,
         
     | 
| 
      
 73 
     | 
    
         
            +
                  "irb" => lambda do
         
     | 
| 
      
 74 
     | 
    
         
            +
                    require "irb"
         
     | 
| 
      
 75 
     | 
    
         
            +
                    return IRB.start(__FILE__)
         
     | 
| 
      
 76 
     | 
    
         
            +
                  end,
         
     | 
| 
      
 77 
     | 
    
         
            +
                  "pry" => lambda do
         
     | 
| 
      
 78 
     | 
    
         
            +
                    require "pry"
         
     | 
| 
      
 79 
     | 
    
         
            +
                    return binding.pry
         
     | 
| 
      
 80 
     | 
    
         
            +
                  end,
         
     | 
| 
      
 81 
     | 
    
         
            +
                  "docgen" => lambda do
         
     | 
| 
      
 82 
     | 
    
         
            +
                    require 'docs/asciidocgen'
         
     | 
| 
      
 83 
     | 
    
         
            +
                    opts = OptionParser.new
         
     | 
| 
      
 84 
     | 
    
         
            +
                    settings = {}
         
     | 
| 
      
 85 
     | 
    
         
            +
                    opts.on("-o DIR", "--output DIR",
         
     | 
| 
      
 86 
     | 
    
         
            +
                      "Directory to output to; optional. If not specified,"\
         
     | 
| 
      
 87 
     | 
    
         
            +
                      "we write to stdout.") do |val|
         
     | 
| 
      
 88 
     | 
    
         
            +
                      settings[:output] = val
         
     | 
| 
      
 89 
     | 
    
         
            +
                    end
         
     | 
| 
      
 90 
     | 
    
         
            +
                    args = opts.parse(ARGV)
         
     | 
| 
      
 91 
     | 
    
         
            +
                    docs = LogStashConfigAsciiDocGenerator.new
         
     | 
| 
      
 92 
     | 
    
         
            +
                    args.each do |arg|
         
     | 
| 
      
 93 
     | 
    
         
            +
                      docs.generate(arg, settings)
         
     | 
| 
      
 94 
     | 
    
         
            +
                    end
         
     | 
| 
      
 95 
     | 
    
         
            +
                    return 0
         
     | 
| 
      
 96 
     | 
    
         
            +
                  end,
         
     | 
| 
      
 97 
     | 
    
         
            +
                  "plugin" => lambda do
         
     | 
| 
      
 98 
     | 
    
         
            +
                    require 'logstash/pluginmanager'
         
     | 
| 
      
 99 
     | 
    
         
            +
                    plugin_manager = LogStash::PluginManager::Main.new($0)
         
     | 
| 
      
 100 
     | 
    
         
            +
                    begin
         
     | 
| 
      
 101 
     | 
    
         
            +
                      plugin_manager.parse(args)
         
     | 
| 
      
 102 
     | 
    
         
            +
                      return plugin_manager.execute
         
     | 
| 
      
 103 
     | 
    
         
            +
                    rescue Clamp::HelpWanted => e
         
     | 
| 
      
 104 
     | 
    
         
            +
                      show_help(e.command)
         
     | 
| 
      
 105 
     | 
    
         
            +
                      return 0
         
     | 
| 
      
 106 
     | 
    
         
            +
                    end
         
     | 
| 
      
 107 
     | 
    
         
            +
                  end,
         
     | 
| 
      
 108 
     | 
    
         
            +
                  "agent" => lambda do
         
     | 
| 
      
 109 
     | 
    
         
            +
                    require "logstash/agent"
         
     | 
| 
      
 110 
     | 
    
         
            +
                    # Hack up a runner
         
     | 
| 
      
 111 
     | 
    
         
            +
                    agent = LogStash::Agent.new($0)
         
     | 
| 
      
 112 
     | 
    
         
            +
                    begin
         
     | 
| 
      
 113 
     | 
    
         
            +
                      agent.parse(args)
         
     | 
| 
      
 114 
     | 
    
         
            +
                    rescue Clamp::HelpWanted => e
         
     | 
| 
      
 115 
     | 
    
         
            +
                      show_help(e.command)
         
     | 
| 
      
 116 
     | 
    
         
            +
                      return 0
         
     | 
| 
      
 117 
     | 
    
         
            +
                    rescue Clamp::UsageError => e
         
     | 
| 
      
 118 
     | 
    
         
            +
                      # If 'too many arguments' then give the arguments to
         
     | 
| 
      
 119 
     | 
    
         
            +
                      # the next command. Otherwise it's a real error.
         
     | 
| 
      
 120 
     | 
    
         
            +
                      raise if e.message != "too many arguments"
         
     | 
| 
      
 121 
     | 
    
         
            +
                      remaining = agent.remaining_arguments
         
     | 
| 
      
 122 
     | 
    
         
            +
                    end
         
     | 
| 
      
 123 
     | 
    
         
            +
             
     | 
| 
      
 124 
     | 
    
         
            +
                    return agent.execute
         
     | 
| 
      
 125 
     | 
    
         
            +
                  end
         
     | 
| 
      
 126 
     | 
    
         
            +
                } # commands
         
     | 
| 
      
 127 
     | 
    
         
            +
             
     | 
| 
      
 128 
     | 
    
         
            +
                if commands.include?(command)
         
     | 
| 
      
 129 
     | 
    
         
            +
                  return Stud::Task.new { commands[command].call }
         
     | 
| 
      
 130 
     | 
    
         
            +
                else
         
     | 
| 
      
 131 
     | 
    
         
            +
                  if command.nil?
         
     | 
| 
      
 132 
     | 
    
         
            +
                    $stderr.puts "No command given"
         
     | 
| 
      
 133 
     | 
    
         
            +
                  else
         
     | 
| 
      
 134 
     | 
    
         
            +
                    if !%w(--help -h help).include?(command)
         
     | 
| 
      
 135 
     | 
    
         
            +
                      # Emit 'no such command' if it's not someone asking for help.
         
     | 
| 
      
 136 
     | 
    
         
            +
                      $stderr.puts "No such command #{command.inspect}"
         
     | 
| 
      
 137 
     | 
    
         
            +
                    end
         
     | 
| 
      
 138 
     | 
    
         
            +
                  end
         
     | 
| 
      
 139 
     | 
    
         
            +
                  $stderr.puts %q[
         
     | 
| 
      
 140 
     | 
    
         
            +
            Usage: logstash <command> [command args]
         
     | 
| 
      
 141 
     | 
    
         
            +
            Run a command with the --help flag to see the arguments.
         
     | 
| 
      
 142 
     | 
    
         
            +
            For example: logstash agent --help
         
     | 
| 
      
 143 
     | 
    
         
            +
             
     | 
| 
      
 144 
     | 
    
         
            +
            Available commands:
         
     | 
| 
      
 145 
     | 
    
         
            +
              agent - runs the logstash agent
         
     | 
| 
      
 146 
     | 
    
         
            +
              version - emits version info about this logstash
         
     | 
| 
      
 147 
     | 
    
         
            +
              rspec - runs tests
         
     | 
| 
      
 148 
     | 
    
         
            +
                  ]
         
     | 
| 
      
 149 
     | 
    
         
            +
                  #$stderr.puts commands.keys.map { |s| "  #{s}" }.join("\n")
         
     | 
| 
      
 150 
     | 
    
         
            +
                  return Stud::Task.new { 1 }
         
     | 
| 
      
 151 
     | 
    
         
            +
                end
         
     | 
| 
      
 152 
     | 
    
         
            +
              end # def run
         
     | 
| 
      
 153 
     | 
    
         
            +
             
     | 
| 
      
 154 
     | 
    
         
            +
              # @return true if this file is the main file being run and not via rspec
         
     | 
| 
      
 155 
     | 
    
         
            +
              def self.autorun?
         
     | 
| 
      
 156 
     | 
    
         
            +
                # caller is the current execution stack
         
     | 
| 
      
 157 
     | 
    
         
            +
                $0 == __FILE__ && caller.none?{|entry| entry =~ /rspec/}
         
     | 
| 
      
 158 
     | 
    
         
            +
              end
         
     | 
| 
      
 159 
     | 
    
         
            +
             
     | 
| 
      
 160 
     | 
    
         
            +
              private
         
     | 
| 
      
 161 
     | 
    
         
            +
             
     | 
| 
      
 162 
     | 
    
         
            +
              def show_help(command)
         
     | 
| 
      
 163 
     | 
    
         
            +
                puts command.help
         
     | 
| 
      
 164 
     | 
    
         
            +
              end
         
     | 
| 
      
 165 
     | 
    
         
            +
            end # class LogStash::Runner
         
     | 
| 
      
 166 
     | 
    
         
            +
             
     | 
| 
      
 167 
     | 
    
         
            +
            LogStash::Runner.new.main(ARGV) if LogStash::Runner.autorun?
         
     |