logstash-core 5.6.16-java → 6.0.0.alpha1-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/gemspec_jars.rb +4 -7
- data/lib/logstash-core/logstash-core.jar +0 -0
- data/lib/logstash-core/version.rb +4 -8
- data/lib/logstash-core_jars.rb +12 -26
- data/lib/logstash/agent.rb +261 -246
- data/lib/logstash/api/commands/default_metadata.rb +1 -1
- data/lib/logstash/api/commands/hot_threads_reporter.rb +5 -11
- data/lib/logstash/api/commands/node.rb +3 -2
- data/lib/logstash/api/commands/stats.rb +3 -2
- data/lib/logstash/bootstrap_check/bad_java.rb +16 -0
- data/lib/logstash/bootstrap_check/bad_ruby.rb +12 -0
- data/lib/logstash/bootstrap_check/default_config.rb +17 -0
- data/lib/logstash/compiler.rb +38 -0
- data/lib/logstash/compiler/lscl.rb +566 -0
- data/lib/logstash/compiler/lscl/lscl_grammar.rb +3503 -0
- data/lib/logstash/compiler/treetop_monkeypatches.rb +92 -0
- data/lib/logstash/config/config_ast.rb +4 -82
- data/lib/logstash/config/mixin.rb +73 -41
- data/lib/logstash/config/pipeline_config.rb +48 -0
- data/lib/logstash/config/source/base.rb +16 -0
- data/lib/logstash/config/source/local.rb +215 -0
- data/lib/logstash/config/source_loader.rb +125 -0
- data/lib/logstash/converge_result.rb +103 -0
- data/lib/logstash/environment.rb +6 -19
- data/lib/logstash/errors.rb +2 -0
- data/lib/logstash/execution_context.rb +4 -7
- data/lib/logstash/filter_delegator.rb +6 -9
- data/lib/logstash/inputs/base.rb +0 -2
- data/lib/logstash/instrument/collector.rb +5 -7
- data/lib/logstash/instrument/metric_store.rb +12 -12
- data/lib/logstash/instrument/metric_type/mean.rb +0 -5
- data/lib/logstash/instrument/namespaced_metric.rb +0 -4
- data/lib/logstash/instrument/namespaced_null_metric.rb +0 -4
- data/lib/logstash/instrument/null_metric.rb +0 -10
- data/lib/logstash/instrument/periodic_poller/cgroup.rb +85 -168
- data/lib/logstash/instrument/periodic_poller/jvm.rb +5 -5
- data/lib/logstash/instrument/periodic_poller/pq.rb +3 -7
- data/lib/logstash/instrument/periodic_pollers.rb +1 -3
- data/lib/logstash/instrument/wrapped_write_client.rb +24 -33
- data/lib/logstash/logging/logger.rb +15 -47
- data/lib/logstash/namespace.rb +0 -1
- data/lib/logstash/output_delegator.rb +5 -7
- data/lib/logstash/outputs/base.rb +0 -2
- data/lib/logstash/pipeline.rb +159 -87
- data/lib/logstash/pipeline_action.rb +13 -0
- data/lib/logstash/pipeline_action/base.rb +29 -0
- data/lib/logstash/pipeline_action/create.rb +47 -0
- data/lib/logstash/pipeline_action/reload.rb +48 -0
- data/lib/logstash/pipeline_action/stop.rb +23 -0
- data/lib/logstash/plugin.rb +0 -1
- data/lib/logstash/plugins/hooks_registry.rb +6 -0
- data/lib/logstash/plugins/registry.rb +0 -1
- data/lib/logstash/program.rb +14 -0
- data/lib/logstash/queue_factory.rb +5 -1
- data/lib/logstash/runner.rb +58 -80
- data/lib/logstash/settings.rb +3 -27
- data/lib/logstash/state_resolver.rb +41 -0
- data/lib/logstash/util/java_version.rb +6 -0
- data/lib/logstash/util/safe_uri.rb +12 -148
- data/lib/logstash/util/thread_dump.rb +4 -7
- data/lib/logstash/util/wrapped_acked_queue.rb +36 -39
- data/lib/logstash/util/wrapped_synchronous_queue.rb +29 -39
- data/lib/logstash/version.rb +10 -8
- data/locales/en.yml +3 -54
- data/logstash-core.gemspec +8 -35
- data/spec/{logstash/api/modules → api/lib/api}/logging_spec.rb +10 -1
- data/spec/{logstash/api/modules → api/lib/api}/node_plugins_spec.rb +2 -1
- data/spec/{logstash/api/modules → api/lib/api}/node_spec.rb +3 -3
- data/spec/{logstash/api/modules → api/lib/api}/node_stats_spec.rb +3 -7
- data/spec/{logstash/api/modules → api/lib/api}/plugins_spec.rb +3 -4
- data/spec/{logstash/api/modules → api/lib/api}/root_spec.rb +2 -2
- data/spec/api/lib/api/support/resource_dsl_methods.rb +87 -0
- data/spec/{logstash/api/commands/stats_spec.rb → api/lib/commands/stats.rb} +2 -7
- data/spec/{logstash/api → api/lib}/errors_spec.rb +1 -1
- data/spec/{logstash/api → api/lib}/rack_app_spec.rb +0 -0
- data/spec/api/spec_helper.rb +106 -0
- data/spec/logstash/agent/converge_spec.rb +286 -0
- data/spec/logstash/agent/metrics_spec.rb +244 -0
- data/spec/logstash/agent_spec.rb +213 -225
- data/spec/logstash/compiler/compiler_spec.rb +584 -0
- data/spec/logstash/config/config_ast_spec.rb +8 -47
- data/spec/logstash/config/mixin_spec.rb +2 -42
- data/spec/logstash/config/pipeline_config_spec.rb +75 -0
- data/spec/logstash/config/source/local_spec.rb +395 -0
- data/spec/logstash/config/source_loader_spec.rb +122 -0
- data/spec/logstash/converge_result_spec.rb +179 -0
- data/spec/logstash/event_spec.rb +0 -66
- data/spec/logstash/execution_context_spec.rb +8 -12
- data/spec/logstash/filter_delegator_spec.rb +12 -24
- data/spec/logstash/inputs/base_spec.rb +7 -5
- data/spec/logstash/instrument/periodic_poller/cgroup_spec.rb +92 -225
- data/spec/logstash/instrument/periodic_poller/jvm_spec.rb +1 -1
- data/spec/logstash/instrument/periodic_poller/os_spec.rb +32 -29
- data/spec/logstash/instrument/wrapped_write_client_spec.rb +33 -33
- data/spec/logstash/legacy_ruby_event_spec.rb +13 -4
- data/spec/logstash/output_delegator_spec.rb +11 -20
- data/spec/logstash/outputs/base_spec.rb +7 -5
- data/spec/logstash/pipeline_action/create_spec.rb +83 -0
- data/spec/logstash/pipeline_action/reload_spec.rb +83 -0
- data/spec/logstash/pipeline_action/stop_spec.rb +37 -0
- data/spec/logstash/pipeline_pq_file_spec.rb +1 -1
- data/spec/logstash/pipeline_spec.rb +81 -137
- data/spec/logstash/plugin_spec.rb +2 -1
- data/spec/logstash/plugins/hooks_registry_spec.rb +6 -0
- data/spec/logstash/queue_factory_spec.rb +13 -1
- data/spec/logstash/runner_spec.rb +29 -140
- data/spec/logstash/settings/writable_directory_spec.rb +10 -13
- data/spec/logstash/settings_spec.rb +0 -91
- data/spec/logstash/state_resolver_spec.rb +156 -0
- data/spec/logstash/timestamp_spec.rb +2 -6
- data/spec/logstash/util/java_version_spec.rb +22 -0
- data/spec/logstash/util/safe_uri_spec.rb +0 -56
- data/spec/logstash/util/wrapped_synchronous_queue_spec.rb +22 -0
- data/spec/support/helpers.rb +9 -11
- data/spec/support/matchers.rb +96 -6
- data/spec/support/mocks_classes.rb +80 -0
- data/spec/support/shared_contexts.rb +2 -27
- metadata +100 -149
- data/lib/logstash/config/loader.rb +0 -107
- data/lib/logstash/config/modules_common.rb +0 -103
- data/lib/logstash/config/source/modules.rb +0 -55
- data/lib/logstash/config/string_escape.rb +0 -27
- data/lib/logstash/dependency_report.rb +0 -131
- data/lib/logstash/dependency_report_runner.rb +0 -17
- data/lib/logstash/elasticsearch_client.rb +0 -142
- data/lib/logstash/instrument/global_metrics.rb +0 -13
- data/lib/logstash/instrument/periodic_poller/dlq.rb +0 -24
- data/lib/logstash/modules/cli_parser.rb +0 -74
- data/lib/logstash/modules/elasticsearch_config.rb +0 -22
- data/lib/logstash/modules/elasticsearch_importer.rb +0 -37
- data/lib/logstash/modules/elasticsearch_resource.rb +0 -10
- data/lib/logstash/modules/file_reader.rb +0 -36
- data/lib/logstash/modules/kibana_base.rb +0 -24
- data/lib/logstash/modules/kibana_client.rb +0 -124
- data/lib/logstash/modules/kibana_config.rb +0 -105
- data/lib/logstash/modules/kibana_dashboards.rb +0 -36
- data/lib/logstash/modules/kibana_importer.rb +0 -17
- data/lib/logstash/modules/kibana_resource.rb +0 -10
- data/lib/logstash/modules/kibana_settings.rb +0 -40
- data/lib/logstash/modules/logstash_config.rb +0 -120
- data/lib/logstash/modules/resource_base.rb +0 -38
- data/lib/logstash/modules/scaffold.rb +0 -52
- data/lib/logstash/modules/settings_merger.rb +0 -23
- data/lib/logstash/modules/util.rb +0 -17
- data/lib/logstash/util/dead_letter_queue_manager.rb +0 -61
- data/lib/logstash/util/environment_variables.rb +0 -43
- data/spec/logstash/config/loader_spec.rb +0 -38
- data/spec/logstash/config/string_escape_spec.rb +0 -24
- data/spec/logstash/instrument/periodic_poller/dlq_spec.rb +0 -17
- data/spec/logstash/modules/logstash_config_spec.rb +0 -56
- data/spec/logstash/modules/scaffold_spec.rb +0 -234
- data/spec/logstash/pipeline_dlq_commit_spec.rb +0 -109
- data/spec/logstash/settings/splittable_string_array_spec.rb +0 -51
- data/spec/logstash/util/wrapped_acked_queue_spec.rb +0 -49
- data/versions-gem-copy.yml +0 -12
@@ -1,107 +0,0 @@
|
|
1
|
-
require "logstash/config/defaults"
|
2
|
-
|
3
|
-
module LogStash; module Config; class Loader
|
4
|
-
def initialize(logger)
|
5
|
-
@logger = logger
|
6
|
-
@config_debug = LogStash::SETTINGS.get_value("config.debug")
|
7
|
-
end
|
8
|
-
|
9
|
-
def format_config(config_path, config_string)
|
10
|
-
config_string = config_string.to_s
|
11
|
-
if config_path
|
12
|
-
# Append the config string.
|
13
|
-
# This allows users to provide both -f and -e flags. The combination
|
14
|
-
# is rare, but useful for debugging.
|
15
|
-
loaded_config = load_config(config_path)
|
16
|
-
if loaded_config.empty? && config_string.empty?
|
17
|
-
# If loaded config from `-f` is empty *and* if config string is empty we raise an error
|
18
|
-
fail(I18n.t("logstash.runner.configuration.file-not-found", :path => config_path))
|
19
|
-
end
|
20
|
-
|
21
|
-
# tell the user we are merging, otherwise it is very confusing
|
22
|
-
if !loaded_config.empty? && !config_string.empty?
|
23
|
-
@logger.info("Created final config by merging config string and config path", :path => config_path)
|
24
|
-
end
|
25
|
-
|
26
|
-
config_string = config_string + loaded_config
|
27
|
-
else
|
28
|
-
# include a default stdin input if no inputs given
|
29
|
-
if config_string !~ /input *{/
|
30
|
-
config_string += LogStash::Config::Defaults.input
|
31
|
-
end
|
32
|
-
# include a default stdout output if no outputs given
|
33
|
-
if config_string !~ /output *{/
|
34
|
-
config_string += LogStash::Config::Defaults.output
|
35
|
-
end
|
36
|
-
end
|
37
|
-
config_string
|
38
|
-
end
|
39
|
-
|
40
|
-
def load_config(path)
|
41
|
-
begin
|
42
|
-
uri = URI.parse(path)
|
43
|
-
|
44
|
-
case uri.scheme
|
45
|
-
when nil then
|
46
|
-
local_config(path)
|
47
|
-
when /http/ then
|
48
|
-
fetch_config(uri)
|
49
|
-
when "file" then
|
50
|
-
local_config(uri.path)
|
51
|
-
else
|
52
|
-
fail(I18n.t("logstash.runner.configuration.scheme-not-supported", :path => path))
|
53
|
-
end
|
54
|
-
rescue URI::InvalidURIError
|
55
|
-
# fallback for windows.
|
56
|
-
# if the parsing of the file failed we assume we can reach it locally.
|
57
|
-
# some relative path on windows arent parsed correctly (.\logstash.conf)
|
58
|
-
local_config(path)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
def local_config(path)
|
63
|
-
path = ::File.expand_path(path)
|
64
|
-
path = ::File.join(path, "*") if ::File.directory?(path)
|
65
|
-
|
66
|
-
config = ""
|
67
|
-
if Dir.glob(path).length == 0
|
68
|
-
@logger.info("No config files found in path", :path => path)
|
69
|
-
return config
|
70
|
-
end
|
71
|
-
|
72
|
-
encoding_issue_files = []
|
73
|
-
Dir.glob(path).sort.each do |file|
|
74
|
-
next unless ::File.file?(file)
|
75
|
-
if file.match(/~$/)
|
76
|
-
@logger.debug("NOT reading config file because it is a temp file", :config_file => file)
|
77
|
-
next
|
78
|
-
end
|
79
|
-
@logger.debug("Reading config file", :config_file => file)
|
80
|
-
cfg = ::File.read(file)
|
81
|
-
if !cfg.ascii_only? && !cfg.valid_encoding?
|
82
|
-
encoding_issue_files << file
|
83
|
-
end
|
84
|
-
config << cfg + "\n"
|
85
|
-
if @config_debug
|
86
|
-
@logger.debug? && @logger.debug("\nThe following is the content of a file", :config_file => file.to_s)
|
87
|
-
@logger.debug? && @logger.debug("\n" + cfg + "\n\n")
|
88
|
-
end
|
89
|
-
end
|
90
|
-
if encoding_issue_files.any?
|
91
|
-
fail("The following config files contains non-ascii characters but are not UTF-8 encoded #{encoding_issue_files}")
|
92
|
-
end
|
93
|
-
if @config_debug
|
94
|
-
@logger.debug? && @logger.debug("\nThe following is the merged configuration")
|
95
|
-
@logger.debug? && @logger.debug("\n" + config + "\n\n")
|
96
|
-
end
|
97
|
-
return config
|
98
|
-
end # def load_config
|
99
|
-
|
100
|
-
def fetch_config(uri)
|
101
|
-
begin
|
102
|
-
Net::HTTP.get(uri) + "\n"
|
103
|
-
rescue Exception => e
|
104
|
-
fail(I18n.t("logstash.runner.configuration.fetch-failed", :path => uri.to_s, :message => e.message))
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end end end
|
@@ -1,103 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require "logstash/util/loggable"
|
3
|
-
require "logstash/elasticsearch_client"
|
4
|
-
require "logstash/modules/kibana_client"
|
5
|
-
require "logstash/modules/elasticsearch_importer"
|
6
|
-
require "logstash/modules/kibana_importer"
|
7
|
-
require "logstash/modules/settings_merger"
|
8
|
-
require "logstash/errors"
|
9
|
-
|
10
|
-
module LogStash module Config
|
11
|
-
class ModulesCommon # extracted here for bwc with 5.x
|
12
|
-
include LogStash::Util::Loggable
|
13
|
-
|
14
|
-
MODULES_MAX_PIPELINES = 1
|
15
|
-
|
16
|
-
def self.pipeline_configs(settings)
|
17
|
-
pipelines = []
|
18
|
-
plugin_modules = LogStash::PLUGIN_REGISTRY.plugins_with_type(:modules)
|
19
|
-
|
20
|
-
cli_settings = settings.get("modules.cli")
|
21
|
-
yml_settings = settings.get("modules")
|
22
|
-
|
23
|
-
modules_array = if !(cli_settings.empty? && yml_settings.empty?)
|
24
|
-
LogStash::Modules::SettingsMerger.merge(cli_settings, yml_settings)
|
25
|
-
elsif cli_settings.empty?
|
26
|
-
yml_settings
|
27
|
-
else
|
28
|
-
cli_settings
|
29
|
-
end
|
30
|
-
|
31
|
-
if modules_array.empty?
|
32
|
-
# no specifed modules
|
33
|
-
return pipelines
|
34
|
-
end
|
35
|
-
logger.debug("Specified modules", :modules_array => modules_array.to_s)
|
36
|
-
|
37
|
-
module_names = modules_array.collect {|module_hash| module_hash["name"]}
|
38
|
-
if module_names.size > MODULES_MAX_PIPELINES
|
39
|
-
error_message = I18n.t("logstash.modules.configuration.modules-too-many-specified", :max => MODULES_MAX_PIPELINES, :specified_modules => module_names.join(', '))
|
40
|
-
raise LogStash::ConfigLoadingError, error_message
|
41
|
-
end
|
42
|
-
|
43
|
-
if module_names.length > module_names.uniq.length
|
44
|
-
duplicate_modules = module_names.group_by(&:to_s).select { |_,v| v.size > 1 }.keys
|
45
|
-
raise LogStash::ConfigLoadingError, I18n.t("logstash.modules.configuration.modules-must-be-unique", :duplicate_modules => duplicate_modules)
|
46
|
-
end
|
47
|
-
|
48
|
-
available_module_names = plugin_modules.map(&:module_name)
|
49
|
-
specified_and_available_names = module_names & available_module_names
|
50
|
-
|
51
|
-
if (specified_and_available_names).empty?
|
52
|
-
i18n_opts = {:specified_modules => module_names, :available_modules => available_module_names}
|
53
|
-
raise LogStash::ConfigLoadingError, I18n.t("logstash.modules.configuration.modules-unavailable", i18n_opts)
|
54
|
-
end
|
55
|
-
|
56
|
-
specified_and_available_names.each do |module_name|
|
57
|
-
connect_fail_args = {}
|
58
|
-
begin
|
59
|
-
module_settings = settings.clone
|
60
|
-
|
61
|
-
module_hash = modules_array.find {|m| m["name"] == module_name}
|
62
|
-
current_module = plugin_modules.find { |allmodules| allmodules.module_name == module_name }
|
63
|
-
|
64
|
-
alt_name = "module-#{module_name}"
|
65
|
-
pipeline_id = alt_name
|
66
|
-
module_settings.set("pipeline.id", pipeline_id)
|
67
|
-
current_module.with_settings(module_hash)
|
68
|
-
config_test = settings.get("config.test_and_exit")
|
69
|
-
modul_setup = settings.get("modules_setup")
|
70
|
-
# Only import data if it's not a config test and --setup is true
|
71
|
-
if !config_test && modul_setup
|
72
|
-
esclient = LogStash::ElasticsearchClient.build(module_hash)
|
73
|
-
kbnclient = LogStash::Modules::KibanaClient.new(module_hash)
|
74
|
-
esconnected = esclient.can_connect?
|
75
|
-
kbnconnected = kbnclient.can_connect?
|
76
|
-
if esconnected && kbnconnected
|
77
|
-
current_module.add_kibana_version(kbnclient.version_parts)
|
78
|
-
current_module.import(
|
79
|
-
LogStash::Modules::ElasticsearchImporter.new(esclient),
|
80
|
-
LogStash::Modules::KibanaImporter.new(kbnclient)
|
81
|
-
)
|
82
|
-
else
|
83
|
-
connect_fail_args[:module_name] = module_name
|
84
|
-
connect_fail_args[:elasticsearch_hosts] = esclient.host_settings
|
85
|
-
connect_fail_args[:kibana_hosts] = kbnclient.host_settings
|
86
|
-
end
|
87
|
-
end
|
88
|
-
config_string = current_module.config_string
|
89
|
-
pipelines << {"pipeline_id" => pipeline_id, "alt_name" => alt_name, "config_string" => config_string, "settings" => module_settings}
|
90
|
-
rescue => e
|
91
|
-
new_error = LogStash::ConfigLoadingError.new(I18n.t("logstash.modules.configuration.parse-failed", :error => e.message))
|
92
|
-
new_error.set_backtrace(e.backtrace)
|
93
|
-
raise new_error
|
94
|
-
end
|
95
|
-
|
96
|
-
if !connect_fail_args.empty?
|
97
|
-
raise LogStash::ConfigLoadingError, I18n.t("logstash.modules.configuration.elasticsearch_connection_failed", connect_fail_args)
|
98
|
-
end
|
99
|
-
end
|
100
|
-
pipelines
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end end
|
@@ -1,55 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require "logstash/config/source/base"
|
3
|
-
require "logstash/config/modules_common"
|
4
|
-
require "logstash/config/pipeline_config"
|
5
|
-
require "logstash/util/loggable"
|
6
|
-
require "logstash/errors"
|
7
|
-
|
8
|
-
module LogStash module Config module Source
|
9
|
-
class Modules < Base
|
10
|
-
include LogStash::Util::Loggable
|
11
|
-
def pipeline_configs
|
12
|
-
if config_conflict? # double check
|
13
|
-
raise ConfigurationError, @conflict_messages.join(", ")
|
14
|
-
end
|
15
|
-
|
16
|
-
pipelines = LogStash::Config::ModulesCommon.pipeline_configs(@settings)
|
17
|
-
pipelines.map do |hash|
|
18
|
-
PipelineConfig.new(self, hash["pipeline_id"].to_sym,
|
19
|
-
org.logstash.common.SourceWithMetadata.new("module", hash["alt_name"], 0, 0, hash["config_string"]),
|
20
|
-
hash["settings"])
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def match?
|
25
|
-
# see basic settings predicates and getters defined in the base class
|
26
|
-
(modules_cli? || modules?) && !(config_string? || config_path?) && !automatic_reload_with_modules?
|
27
|
-
end
|
28
|
-
|
29
|
-
def config_conflict?
|
30
|
-
@conflict_messages.clear
|
31
|
-
# Make note that if modules are configured in both cli and logstash.yml that cli module
|
32
|
-
# settings will overwrite the logstash.yml modules settings
|
33
|
-
if modules_cli? && modules?
|
34
|
-
logger.info(I18n.t("logstash.runner.cli-module-override"))
|
35
|
-
end
|
36
|
-
|
37
|
-
if automatic_reload_with_modules?
|
38
|
-
@conflict_messages << I18n.t("logstash.runner.reload-with-modules")
|
39
|
-
end
|
40
|
-
|
41
|
-
# Check if config (-f or -e) and modules are configured
|
42
|
-
if (modules_cli? || modules?) && (config_string? || config_path?)
|
43
|
-
@conflict_messages << I18n.t("logstash.runner.config-module-exclusive")
|
44
|
-
end
|
45
|
-
|
46
|
-
@conflict_messages.any?
|
47
|
-
end
|
48
|
-
|
49
|
-
private
|
50
|
-
|
51
|
-
def automatic_reload_with_modules?
|
52
|
-
(modules_cli? || modules?) && config_reload_automatic?
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end end end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
module LogStash; module Config; module StringEscape
|
4
|
-
class << self
|
5
|
-
def process_escapes(input)
|
6
|
-
input.gsub(/\\./) do |value|
|
7
|
-
process(value)
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
private
|
12
|
-
def process(value)
|
13
|
-
case value[1]
|
14
|
-
when '"', "'", "\\"
|
15
|
-
value[1]
|
16
|
-
when "n"
|
17
|
-
"\n"
|
18
|
-
when "r"
|
19
|
-
"\r"
|
20
|
-
when "t"
|
21
|
-
"\t"
|
22
|
-
else
|
23
|
-
value
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end end end
|
@@ -1,131 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
Thread.abort_on_exception = true
|
3
|
-
Encoding.default_external = Encoding::UTF_8
|
4
|
-
$DEBUGLIST = (ENV["DEBUG"] || "").split(",")
|
5
|
-
|
6
|
-
require "clamp"
|
7
|
-
require "logstash/namespace"
|
8
|
-
require "rubygems"
|
9
|
-
require "jars/gemspec_artifacts"
|
10
|
-
|
11
|
-
class LogStash::DependencyReport < Clamp::Command
|
12
|
-
option [ "--csv" ], "OUTPUT_PATH", "The path to write the dependency report in csv format.",
|
13
|
-
:required => true, :attribute_name => :output_path
|
14
|
-
|
15
|
-
def execute
|
16
|
-
require "csv"
|
17
|
-
CSV.open(output_path, "wb", :headers => [ "name", "version", "url", "license" ], :write_headers => true) do |csv|
|
18
|
-
puts "Finding gem dependencies"
|
19
|
-
gems.each { |d| csv << d }
|
20
|
-
puts "Finding java/jar dependencies"
|
21
|
-
jars.each { |d| csv << d }
|
22
|
-
end
|
23
|
-
|
24
|
-
# Copy in COPYING.csv which is a best-effort, hand-maintained file of dependency license information.
|
25
|
-
File.open(output_path, "a+") do |file|
|
26
|
-
extra = File.join(File.dirname(__FILE__), "..", "..", "..", "COPYING.csv")
|
27
|
-
file.write(IO.read(extra))
|
28
|
-
end
|
29
|
-
nil
|
30
|
-
end
|
31
|
-
|
32
|
-
def gems
|
33
|
-
# @mgreau requested `logstash-*` dependencies be removed from this list:
|
34
|
-
# https://github.com/elastic/logstash/pull/8837#issuecomment-351859433
|
35
|
-
Gem::Specification.reject { |g| g.name =~ /^logstash-/ }.collect do |gem|
|
36
|
-
licenses = ("UNKNOWN" if gem.licenses.empty?) || (gem.licenses.map { |l| SPDX.map(l) }.join("|") if !gem.licenses.empty?)
|
37
|
-
[gem.name, gem.version.to_s, gem.homepage, licenses]
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def jars
|
42
|
-
jars = []
|
43
|
-
# For any gems with jar dependencies,
|
44
|
-
# Look at META-INF/MANIFEST.MF for any jars in each gem
|
45
|
-
# Note any important details.
|
46
|
-
Gem::Specification.select { |g| g.requirements && g.requirements.any? { |r| r =~ /^jar / } }.collect do |gem|
|
47
|
-
|
48
|
-
# Where is the gem installed
|
49
|
-
root = gem.full_gem_path
|
50
|
-
|
51
|
-
Dir.glob(File.join(root, "**", "*.jar")).collect do |path|
|
52
|
-
jar = java.util.jar.JarFile.new(path)
|
53
|
-
manifest = jar.getManifest
|
54
|
-
|
55
|
-
pom_entries = jar.entries.select { |t| t.getName.start_with?("META-INF/maven/") && t.getName.end_with?("/pom.properties") }
|
56
|
-
|
57
|
-
# Some jar files have multiple maven pom.properties files. It is unclear how to know what is correct?
|
58
|
-
# TODO(sissel): Maybe we should use all pom.properties files? None of the pom.properties/pom.xml files have license information, though.
|
59
|
-
# TODO(sissel): In some cases, there are META-INF/COPYING and
|
60
|
-
# META-INF/NOTICE.txt files? Can we use these somehow? There is no
|
61
|
-
# common syntax for parsing these files, though...
|
62
|
-
pom_map = if pom_entries.count == 1
|
63
|
-
pom_in = jar.getInputStream(pom_entries.first)
|
64
|
-
pom_content = pom_in.available.times.collect { pom_in.read }.pack("C*")
|
65
|
-
# Split non-comment lines by `key=val` into a map { key => val }
|
66
|
-
Hash[pom_content.split(/\r?\n/).grep(/^[^#]/).map { |line| line.split("=", 2) }]
|
67
|
-
else
|
68
|
-
{}
|
69
|
-
end
|
70
|
-
|
71
|
-
next if manifest.nil?
|
72
|
-
# convert manifest attributes to a map w/ keys .to_s
|
73
|
-
# without this, the attribute keys will be `Object#inspect` values
|
74
|
-
# like #<Java::JavaUtilJar::Attributes::Name0xabcdef0>
|
75
|
-
attributes = Hash[manifest.getMainAttributes.map { |k,v| [k.to_s, v] }]
|
76
|
-
|
77
|
-
begin
|
78
|
-
# Prefer the maven/pom groupId when it is available.
|
79
|
-
artifact = pom_map.fetch("artifactId", attributes.fetch("Implementation-Title"))
|
80
|
-
group = pom_map.fetch("groupId", attributes.fetch("Implementation-Vendor-Id"))
|
81
|
-
jars << [
|
82
|
-
group + ":" + artifact,
|
83
|
-
attributes.fetch("Bundle-Version"),
|
84
|
-
attributes.fetch("Bundle-DocURL"),
|
85
|
-
SPDX.map(attributes.fetch("Bundle-License")),
|
86
|
-
]
|
87
|
-
rescue KeyError => e
|
88
|
-
# The jar is missing a required manifest field, it may not have any useful manifest data.
|
89
|
-
# Ignore it and move on.
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
jars.uniq.sort
|
94
|
-
end
|
95
|
-
|
96
|
-
module SPDX
|
97
|
-
# This is a non-exhaustive, best effort list of licenses as they map to SPDX identifiers.
|
98
|
-
ALIASES = {
|
99
|
-
"Apache-2.0" => [
|
100
|
-
"Apache 2",
|
101
|
-
"apache-2.0",
|
102
|
-
"Apache 2.0",
|
103
|
-
"Apache License (2.0)",
|
104
|
-
"Apache License 2.0",
|
105
|
-
"https://www.apache.org/licenses/LICENSE-2.0.txt",
|
106
|
-
"http://www.apache.org/licenses/LICENSE-2.0.txt",
|
107
|
-
],
|
108
|
-
"Artistic-2.0" => [
|
109
|
-
"Artistic 2.0"
|
110
|
-
],
|
111
|
-
"BSD-2-Clause" => [
|
112
|
-
"2-clause BSDL",
|
113
|
-
"2-clause"
|
114
|
-
],
|
115
|
-
"GPL-2.0" => [
|
116
|
-
"GPL-2"
|
117
|
-
]
|
118
|
-
}
|
119
|
-
|
120
|
-
# Get a map of name => spdx
|
121
|
-
MAP_APACHE2 = Hash[ALIASES.map { |spdx,aliases| aliases.map { |value| [value, spdx] } }[0]]
|
122
|
-
MAP_ARTISTIC2 = Hash[ALIASES.map { |spdx,aliases| aliases.map { |value| [value, spdx] } }[1]]
|
123
|
-
MAP_BSD = Hash[ALIASES.map { |spdx,aliases| aliases.map { |value| [value, spdx] } }[2]]
|
124
|
-
MAP_GPL2 = Hash[ALIASES.map { |spdx,aliases| aliases.map { |value| [value, spdx] } }[3]]
|
125
|
-
|
126
|
-
module_function
|
127
|
-
def map(value)
|
128
|
-
MAP_APACHE2[value] || MAP_ARTISTIC2[value] || MAP_BSD[value] || MAP_GPL2[value] || value
|
129
|
-
end
|
130
|
-
end
|
131
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
require_relative "../../../lib/bootstrap/environment"
|
2
|
-
|
3
|
-
if $0 == __FILE__
|
4
|
-
begin
|
5
|
-
LogStash::Bundler.setup!({:without => [:build, :development]})
|
6
|
-
rescue => Bundler::GemfileNotFound
|
7
|
-
$stderr.puts("No Gemfile found. Maybe you need to run `rake artifact:tar`?")
|
8
|
-
raise
|
9
|
-
end
|
10
|
-
|
11
|
-
require "logstash/namespace"
|
12
|
-
require_relative "../../../lib/bootstrap/patches/jar_dependencies"
|
13
|
-
require "logstash/dependency_report"
|
14
|
-
|
15
|
-
exit_status = LogStash::DependencyReport.run
|
16
|
-
exit(exit_status || 0)
|
17
|
-
end
|
@@ -1,142 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require "logstash/namespace"
|
3
|
-
require "logstash/logging"
|
4
|
-
require "elasticsearch"
|
5
|
-
require "elasticsearch/transport/transport/http/manticore"
|
6
|
-
|
7
|
-
module LogStash class ElasticsearchClient
|
8
|
-
include LogStash::Util::Loggable
|
9
|
-
|
10
|
-
class Response
|
11
|
-
# duplicated here from Elasticsearch::Transport::Transport::Response
|
12
|
-
# to create a normalised response across different client IMPL
|
13
|
-
attr_reader :status, :body, :headers
|
14
|
-
def initialize(status, body, headers={})
|
15
|
-
@status, @body, @headers = status, body, headers
|
16
|
-
@body = body.force_encoding('UTF-8') if body.respond_to?(:force_encoding)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.build(settings)
|
21
|
-
new(RubyClient.new(settings, logger))
|
22
|
-
end
|
23
|
-
|
24
|
-
class RubyClient
|
25
|
-
def initialize(settings, logger)
|
26
|
-
@settings = settings
|
27
|
-
@logger = logger
|
28
|
-
@client_args = client_args
|
29
|
-
|
30
|
-
ssl_options = {}
|
31
|
-
|
32
|
-
if @settings["var.elasticsearch.ssl.enabled"] == "true"
|
33
|
-
ssl_options[:verify] = @settings.fetch("var.elasticsearch.ssl.verification_mode", true)
|
34
|
-
ssl_options[:ca_file] = @settings.fetch("var.elasticsearch.ssl.certificate_authority", nil)
|
35
|
-
ssl_options[:client_cert] = @settings.fetch("var.elasticsearch.ssl.certificate", nil)
|
36
|
-
ssl_options[:client_key] = @settings.fetch("var.elasticsearch.ssl.key", nil)
|
37
|
-
end
|
38
|
-
|
39
|
-
@client_args[:ssl] = ssl_options
|
40
|
-
|
41
|
-
username = @settings["var.elasticsearch.username"]
|
42
|
-
password = @settings["var.elasticsearch.password"]
|
43
|
-
if username
|
44
|
-
@client_args[:transport_options] = { :headers => { "Authorization" => 'Basic ' + Base64.encode64( "#{username}:#{password}" ).chomp } }
|
45
|
-
end
|
46
|
-
|
47
|
-
@client = Elasticsearch::Client.new(@client_args)
|
48
|
-
end
|
49
|
-
|
50
|
-
def can_connect?
|
51
|
-
begin
|
52
|
-
head(SecureRandom.hex(32).prepend('_'))
|
53
|
-
rescue Elasticsearch::Transport::Transport::Errors::BadRequest
|
54
|
-
true
|
55
|
-
rescue Manticore::SocketException
|
56
|
-
false
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
def host_settings
|
61
|
-
@client_args[:hosts]
|
62
|
-
end
|
63
|
-
|
64
|
-
def delete(path)
|
65
|
-
begin
|
66
|
-
normalize_response(@client.perform_request('DELETE', path, {}, nil))
|
67
|
-
rescue Exception => e
|
68
|
-
if is_404_error?(e)
|
69
|
-
Response.new(404, "", {})
|
70
|
-
else
|
71
|
-
raise e
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
def put(path, content)
|
77
|
-
normalize_response(@client.perform_request('PUT', path, {}, content))
|
78
|
-
end
|
79
|
-
|
80
|
-
def head(path)
|
81
|
-
begin
|
82
|
-
normalize_response(@client.perform_request('HEAD', path, {}, nil))
|
83
|
-
rescue Exception => e
|
84
|
-
if is_404_error?(e)
|
85
|
-
Response.new(404, "", {})
|
86
|
-
else
|
87
|
-
raise e
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
private
|
93
|
-
|
94
|
-
def is_404_error?(error)
|
95
|
-
error.class.to_s =~ /NotFound/ || error.message =~ /Not\s*Found|404/i
|
96
|
-
end
|
97
|
-
|
98
|
-
def normalize_response(response)
|
99
|
-
Response.new(response.status, response.body, response.headers)
|
100
|
-
end
|
101
|
-
|
102
|
-
def client_args
|
103
|
-
{
|
104
|
-
:transport_class => Elasticsearch::Transport::Transport::HTTP::Manticore,
|
105
|
-
:hosts => [*unpack_hosts],
|
106
|
-
# :logger => @logger, # silence the client logging
|
107
|
-
}
|
108
|
-
end
|
109
|
-
|
110
|
-
def unpack_hosts
|
111
|
-
setting = @settings.fetch("var.elasticsearch.hosts", "localhost:9200")
|
112
|
-
if setting.is_a?(String)
|
113
|
-
return setting.split(',').map(&:strip)
|
114
|
-
end
|
115
|
-
setting
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
def initialize(client)
|
120
|
-
@client = client
|
121
|
-
end
|
122
|
-
|
123
|
-
def delete(path)
|
124
|
-
@client.delete(path)
|
125
|
-
end
|
126
|
-
|
127
|
-
def put(path, content)
|
128
|
-
@client.put(path, content)
|
129
|
-
end
|
130
|
-
|
131
|
-
def head(path)
|
132
|
-
@client.head(path)
|
133
|
-
end
|
134
|
-
|
135
|
-
def can_connect?
|
136
|
-
@client.can_connect?
|
137
|
-
end
|
138
|
-
|
139
|
-
def host_settings
|
140
|
-
@client.host_settings
|
141
|
-
end
|
142
|
-
end end
|