logstash-core 1.5.0.beta2-java
Sign up to get free protection for your applications and to get access to all the features.
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?
|